Почему успех сборки SCons зависит от имени option_dir? - PullRequest
3 голосов
/ 12 октября 2010

Мне до смерти скучно с таким поведением. Таким образом, в файле SConstruct есть последняя строка, подобная этой:

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 - мой собственный модуль для поиска некоторых доступных компиляторов Фортрана.

В папке 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.

После переименования имени варианта в имя, скажем, #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

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

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

1 Ответ

1 голос
/ 27 марта 2014

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

Во-первых, ваш порядок сборки, вероятно, выключен, потому что сканер зависимостей для 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) и, по сути, отменяет мое предпочтение не загромождать каталог источника.Это может быть ошибкой.

...