2014-09-03 5 views
0

Краткая версия Возможно ли построить среду 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 для каждого исходного файла? - Что-нибудь еще может придумать.

+1

Не можете ли вы сделать objs + = env.Object (target = ..., source = ..., FORTRANMODPATH = ...) '? –

+0

После прочтения ваших описаний выше (короткая и длинная версия) мне все еще неясно, останавливается ли сборка с ошибкой (вы говорите, что вам нужно это исправить) или просто выдает предупреждение о том, что цель построена из разных сред (но с то же действие). В последнем случае вы не должны волноваться ... Я думаю, ваши Строители подбирают модуль как зависимость для каждого из подпроектов, поэтому он добавляется дважды? Наконец, SCons не создает среды, а отдельные объекты (основанные на файлах) ... поэтому ответ на ваш реальный вопрос должен быть простым «Нет». – dirkbaechle

+0

Да, он выходит с ошибкой. Предположим, что A и B зависят от C.A и B от разных VS-проектов, projA и projB. При построении projA C создается, и файл .mod помещается в каталог модуля projA. Затем мы строим B, и scons считает, что C уже построен, поэтому он не восстанавливает его. Но теперь мы используем каталог модулей projB для модулей, а C.mod - нет, поэтому сборка не выполняется. – Tom

ответ

1

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

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

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