Как указать вариантный каталог в SConscript

Я новичок в SCons и мне нужна помощь в понимании того, почему мой сценарий сборки не производит требуемый результат. Будем очень признательны за любые указатели на то, что я делаю неправильно.

Ниже представлена ​​моя файловая структура:

.
├── prog_1
│   ├── hello.c
│   └── SConscript
└── SConstruct

Вот как я хочу, чтобы он выглядел после запуска scons -u из подкаталога prog_1.

.
├── prog_1
│   ├── build
│   │   └── hello.o
│   ├── hello.c
│   ├── prog_1.out
│   └── SConscript
└── SConstruct

Содержание файла SConstruct:

env = Environment()
env['CC'] = 'gcc'
env['CCFLAGS'] = Split("""
-std=c99
-Wall
""")

Export('env')

Содержание файла prog_1/SConscript:

Import('env')

build = env.Clone()
build['CCFLAGS'] += ['-DENABLE_FEAT_1']

build.VariantDir('build', '.', duplicate=0)
build_src = build.Glob('build/*.c')

import os
prog_name = os.getcwd().split(os.sep)[-1]
build.Program(prog_name +'.out', source = build_src)

Clean('.','build')

Когда я запускаю scons -u из подкаталога prog_1, я получаю следующее:

[ananya@firenze prog_1]$ scons -u
scons: Entering directory `/home/ananya/test/scons-test'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `prog_1' is up to date.
scons: done building targets.

Изменить: добавлено описание вывода.

Edit2: добавлено исправление скрипта.


person nandu    schedule 21.07.2015    source источник


Ответы (1)


Вы очень близки. Вам просто нужно указать свой файл SConscript в файле SConstruct.

Ваш SConstruct должен быть таким ...

import os
env = Environment()
env['CC'] = 'gcc'
env['CCFLAGS'] = Split("""
                       -std=c99
                       -Wall
                       """)

Export('env')

SConscript(os.path.join('prog_1', 'SConscript'))

Затем при запуске вы получите следующий результат ...

>> scons --version
SCons by Steven Knight et al.:
    script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation

>> tree ..
..
├── prog_1
│   ├── hello.c
│   └── SConscript
└── SConstruct

1 directory, 3 files

>> scons -u
scons: Entering directory `/nfs/users/bellockk/SandBox/tmp'
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: prog_1/build
gcc -o prog_1/build/hello.o -c -std=c99 -Wall -DENABLE_FEAT_1 prog_1/hello.c
gcc -o prog_1/prog_1.out prog_1/build/hello.o
scons: done building targets.

>> tree ..
..
├── prog_1
│   ├── build
│   │   └── hello.o
│   ├── hello.c
│   ├── prog_1.out
│   └── SConscript
└── SConstruct

2 directories, 5 files
person Kenneth E. Bellock    schedule 21.07.2015
comment
Улучшение состояло бы в том, чтобы удалить вызов VariantDir в SConscript и заменить его параметром variant_dir в вызове SConscript () в корневом SConstruct. - person Brady; 21.07.2015
comment
Я хотел бы поддержать Брэди, его подход также является рекомендуемой настройкой, как описано в UserGuide scons.org/doc/production/HTML/scons-user.html, раздел 15.1. Указание дерева каталогов вариантов как части вызова SConscript - person dirkbaechle; 21.07.2015
comment
Я согласен с другими комментариями выше. Я выложил только исправление, а не никаких улучшений. Однако самое замечательное в SCons, как и в случае с python, обычно существует 5 или более различных способов достижения одной и той же цели. Попробуйте, если можете, приведенные выше предложения, а затем используйте то, что лучше всего подходит для вашего конкретного приложения. - person Kenneth E. Bellock; 21.07.2015