2010-10-12 2 views
3

Мне так надоедает такое поведение. Таким образом, в SConstruct файла мы имеем последнюю строку, как это:Почему успех сборки SCons зависит от имени variant_dir?

import compilers, os 

env = Environment(ENV = os.environ, TOOLS = ['default']) 

def set_compiler(compiler_name): 
    env.Replace(FORTRAN = compiler_name) 
    env.Replace(F77 = compiler_name) 
    env.Replace(F90 = compiler_name) 
    env.Replace(F95 = compiler_name) 

def set_flags(flags): 
    env.Replace(FORTRANFLAGS = flags) 
    env.Replace(F77FLAGS = flags) 
    env.Replace(F90FLAGS = flags) 
    env.Replace(F95FLAGS = flags) 

mod_dir_prefix = { 
    "gfortran": "-J ", 
    "ifort": "-???", 
    "pgfortran": "-module " 
} 

flags = { 
    ("gfortran", "debug"): "-O0 -g -Wall -Wextra -pedantic -fimplicit-none -fbounds-check -fbacktrace", 
    ("gfortran", "release"): "-O3", 
    ("pgfortran", "debug"): "-O0 -g -C -traceback", 
    ("pgfortran", "release"): "-O4" 
} 

if not GetOption('clean'): 
    print "\nAvailable Fortran compilers:\n" 

    for k, v in compilers.compilers_dict().iteritems(): 
     print "%10s : %s" % (k, v) 

    compiler = raw_input("\nChoose compiler: ") 

    set_compiler(compiler) 

    debug_or_release = raw_input("\nDebug or release: ") 

    set_flags(flags[(compiler, debug_or_release)]) 

    env.Replace(FORTRANMODDIRPREFIX = mod_dir_prefix[compiler]) 

    env.Replace(LINK = compiler) 
    env.Replace(LINKCOM = "$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS") 
    env.Replace(LINKFLAGS = "") 

env.Replace(FORTRANMODDIR = '#Mod') 
Export('env') 

SConscript('Sources/SConscript', variant_dir='Build', duplicate=0) 

compilers.py мой собственный модуль, чтобы найти некоторые Fortran компиляторов, которые доступны.

В папке Sources у нас есть пара исходных файлов Fortran.

Sources \ SConscript

Import('env') 
env.Program('app', Glob('*.f90')) 

Scons поддерживает Fortran и все работает отлично.

gfortran -o Temp\kinds.o -c -O3 -JMod Sources\kinds.f90 
gfortran -o Temp\math.o -c -O3 -JMod Sources\math.f90 
gfortran -o Temp\sorts.o -c -O3 -JMod Sources\sorts.f90 
gfortran -o Temp\utils.o -c -O3 -JMod Sources\utils.f90 
gfortran -o Temp\main.o -c -O3 -JMod Sources\main.f90 
gfortran -o Temp\app.exe Temp\kinds.o Temp\main.o Temp\math.o Temp\sorts.o Temp\utils.o 
scons: done building targets. 

После переименования названия variant_dir, чтобы сказать #Bin или #Build мы получаем сообщение об ошибке:

gfortran -o Bin\kinds.o -c -O3 -JMod Sources\kinds.f90 
gfortran -o Bin\main.o -c -O3 -JMod Sources\main.f90 
Sources\main.f90:3.11: 

    USE sorts 
      1 
Fatal Error: Can't open module file 'sorts.mod' for reading at (1): No such file or directory 

Конечно порядок вопросов компиляции. Но почему это зависит от имени variant_dir? Похоже на ошибку, но, возможно, я делаю что-то неправильно.

P.S. Это не зависит от значения переменной duplicate.
P.P.S. Протестировано с помощью SCons 2.0.1 на Windows с Python 2.7 и Mac OS X с Python 2.5.1.

+1

@kemiisto: этого достаточно, чтобы вы могли сделать. –

+2

@High Performance Mark: меня и делают из разных эпох. Инструменты построения без автоматического анализа зависимостей даже не рассматриваются. CMake слишком тяжелый и в то же время слишком ограничительный и недостаточно гибкий для меня. – Wildcat

+0

Можете ли вы показать файл Sources/SConscript? Вы пытались использовать «Temp» или «Bin» как вариант dirs? Вместо «#Temp» и «#Bin». – dantje

ответ

1

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

Во-первых, ваш заказ на сборку, вероятно, отключен, потому что сканер зависимостей для Fortran работает неправильно. Попробуйте запустить

scons [your_arguments] -n --tree=all | less 

, который не будет компилировать ничего, но покажет вам команды и в конце концов будет печатать дерево зависимостей, как Scons видит.

Возможное решение:

Попробуйте добавить строку (я добавил ваш источник для контекста):

env.Replace(FORTRANMODDIR = '#Mod') env.Replace(FORTRANPATH = '.' ] Export('env')

Насколько я понимаю, пути относительны к «виртуальному» расположению файл SConscript (т.е. каталог src или каталог build), это должно добавить каталог, содержащий исходные файлы, в путь поиска сканера.

В моей версии SCons (2.3.0), я не могу использовать duplicate=0 аргумент, так как он автоматически вставляет исходный каталог в пути модуля, вызывая командную строку, чтобы выглядеть -module build/ -module src/ (ifort) и по существу перекрывая мой предпочтение не загромождать исходный каталог. Однако это может быть ошибка.

Смежные вопросы