Укороченная версия
Можно ли построить среду SCons до выхода из скрипта SConstruct?
Длинная версия
Я портирую программное обеспечение с 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, а не перечислять проекты вручную.
Для кода C ++ это работает нормально. Это проблема для кода на Фортране. Проблема возникает, когда файлы в двух отдельных проектах ссылаются на один и тот же модуль Fortran. Сканер Fortran обнаруживает это и делает исходный файл модуля зависимым от обеих целей. Тем не менее, переменная конструкции FORTRANMODPATH задается по-разному для двух целей. SCons предупреждает, что одна и та же цель строится дважды с одним и тем же компоновщиком, но затем, кажется, просто выбирает одну из них более или менее случайным образом, что затрудняет прогнозирование того, где файл .mod окажется в итоге.
Я могу придумать несколько способов исправить это:
— Построить каждую среду отдельно, построить ее, а затем перейти к следующей. Но я не знаю, есть ли способ сделать это.
— Установите FORTRANMODPATH для каждого объектного файла, а не для каждого проекта. Затем файл .mod можно поместить в папку объектов для исходного файла вместо всех файлов .mod для проекта, находящегося в той же папке. Но я также не могу определить способ сделать это. Могу ли я достичь этого, создав новый Environment
для каждого исходного файла?
— Все, что кто-либо может придумать.
Можно указать переменные среды для каждой цели
objs += env.Object(target=..., source=..., FORTRANMODPATH=...)
SCons увидит, что второе использование отличается FORTRANMODPATH
и должен восстановить его по мере необходимости.