Как создать динамические определения для Visual Studio?

У меня есть проект C++, который строится на нескольких платформах.

В Mac OSX и Linux я использую SConstruct, что позволяет мне проявлять некоторую «умность» в отношении различных этапов компиляции. А именно, я мог бы поместить версию программы в файл с именем VERSION в корне репозитория, содержимое которого просто:

2.0

В сборке SConscript мне просто нужно открыть, прочитать и проанализировать этот файл, и я могу создать динамические определения на его основе. Например:

env.Append(CXXFLAGS=['-DVERSION_MAJOR=%s' % open('VERSION').read().split('.')[0]])

Это по понятным причинам очень удобно. Это также позволяет мне, например, поместить сегодняшнюю дату в переменную среды.

Теперь для Windows у меня есть файл .sln с разными файлами .vcxproj, в которые я хотел бы сделать что-то подобное, но я понятия не имею, как это сделать.

Подводя итог, мой вопрос: как я могу иметь такие «умные» определения (чтение, анализ файла и помещение его содержимого в несколько переменных среды) без необходимости вручную изменять файлы .sln/.vcxproj при каждой смене версии?


Я знаю, что мог бы использовать SCons и в Windows, но я бы не хотел этого делать (главным образом потому, что он кажется менее популярным на платформе, и я не хочу пугать потенциальных участников, которые знают только инструменты, специфичные для Windows).


person ereOn    schedule 03.05.2014    source источник


Ответы (2)


Обычный способ сделать это - определить ваши константы во включаемом файле: например.

// Version.h - Autogenerated, don't edit
#define VERSION_MAJOR 1

Затем вы пишете скрипт или программу (на вашем любимом языке), чтобы откуда-то получить версию и динамически написать Version.h. Возможно, проанализируйте старый Version.h и увеличьте его или получите из какого-либо внешнего источника.

В Visual Studio создайте настраиваемый шаг сборки для Version.h и сделайте его зависимым от чего-то, что заставляет его обновляться при каждой сборке.

person Michael J    schedule 03.05.2014
comment
Имейте в виду, что этот метод всегда будет создавать Version.h и, следовательно, всегда будет принудительно выполнять перестроение. Это может быть очень медленно. Вместо этого создайте Version.tmp, а затем вызовите fc Version.h Version.tmp || move Version.tmp Version.h. Если файлы сравниваются одинаково, существующий Version.h останется нетронутым, что позволит пропустить перестроение. - person MSalters; 01.12.2015
comment
Если вы тщательно настроите свою сборку, вы можете заставить ее генерировать новую версию.h только для полных производственных сборок. - person Michael J; 09.03.2016

Вы можете сохранить текущее решение, а для Windows интегрировать его с решением Visual Studio и файлами проекта, сгенерированными SCons, с помощью компоновщика MSVSProject() или компоновщика MSVSSolution().

Дополнительную информацию об этих конструкторах SCons можно найти здесь.

person Brady    schedule 03.05.2014