Краткая версия Возможно ли построить среду SCons перед тем, как скрипт SConstruct завершит работу?SCons build with multiple environment
Длинная версия Я портирую некоторое программное обеспечение от Windows до Linux. В Windows он создается в Visual Studio 2013, используя MSVC++ и Intel Fortran. В Linux мы строим его с помощью g ++ и gfortran.
Я написал сценарий Python, который читает файл проекта Visual Studio (либо .vcxproj для кода на C++, либо .vfproj для Fortran) и выполняет соответствующие сборщики SCons для создания сборки. Мой файл SConstruct тогда в основном выглядит следующим образом:
def convertVSProjectFile(filename):
...
projects = [ 'Source/Proj1/Proj1.vcxproj',
'Source/Proj2/Proj2.vcxproj',
'Source/Proj3/Proj3.vfproj',
...
];
for p in projects:
convertVSProjectFile(filename)
Со временем это будет переработан интерпретировать .sln файл, а не список проектов вручную.
Для кода на С ++ это работает нормально. Однако это проблема для кода Fortran. Проблема возникает, когда файлы в двух отдельных проектах относятся к одному и тому же модулю Fortran. Сканер Fortran видит это и делает исходный файл модуля зависимым от обеих целей. Однако переменная конструкции FORTRANMODPATH устанавливается по-разному для двух целей. SCons предупреждает, что одна и та же цель построена дважды с одним и тем же компоновщиком, но затем, кажется, просто выбирает один из них более или менее наугад, что затрудняет предсказать, где находится файл .mod.
Я могу придумать несколько способов исправить это: - Построить каждую среду отдельно, построить ее, а затем перейти к следующему. Но я не знаю, есть ли способ сделать это. - Установите FORTRANMODPATH для каждого объектного файла, а не для каждого проекта. Затем файл .mod может попасть в папку объекта для исходного файла, а не всех файлов .mod для проекта, идущего в той же папке. Но я тоже не могу найти способ сделать это. Могу ли я достичь этого, создав новый Environment
для каждого исходного файла? - Что-нибудь еще может придумать.
Не можете ли вы сделать objs + = env.Object (target = ..., source = ..., FORTRANMODPATH = ...) '? –
После прочтения ваших описаний выше (короткая и длинная версия) мне все еще неясно, останавливается ли сборка с ошибкой (вы говорите, что вам нужно это исправить) или просто выдает предупреждение о том, что цель построена из разных сред (но с то же действие). В последнем случае вы не должны волноваться ... Я думаю, ваши Строители подбирают модуль как зависимость для каждого из подпроектов, поэтому он добавляется дважды? Наконец, SCons не создает среды, а отдельные объекты (основанные на файлах) ... поэтому ответ на ваш реальный вопрос должен быть простым «Нет». – dirkbaechle
Да, он выходит с ошибкой. Предположим, что A и B зависят от C.A и B от разных VS-проектов, projA и projB. При построении projA C создается, и файл .mod помещается в каталог модуля projA. Затем мы строим B, и scons считает, что C уже построен, поэтому он не восстанавливает его. Но теперь мы используем каталог модулей projB для модулей, а C.mod - нет, поэтому сборка не выполняется. – Tom