python — сборка SCons с несколькими средами

Укороченная версия
Можно ли построить среду 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 для каждого исходного файла?
— Все, что кто-либо может придумать.

0

Решение

Можно указать переменные среды для каждой цели

objs += env.Object(target=..., source=..., FORTRANMODPATH=...)

SCons увидит, что второе использование отличается FORTRANMODPATH и должен восстановить его по мере необходимости.

1

Другие решения


По вопросам рекламы [email protected]