如何将对象放入 SCons 中单独的构建文件夹中?
How to put objects into a separated build folder in SCons?
我有这个非常简单的项目:
.
├── hello.c
├── lib
│ ├── foo.c
│ ├── foo.h
│ └── SConstruct
├── Makefile
└── SConstruct
构建后我想得到这个:
.
├── build
│ ├── hello
│ ├── hello.o
│ └── lib
│ ├── libfoo.a
│ └── foo.o
│
├── config.log
├── hello.c
├── lib
│ ├── foo.c
│ ├── foo.h
│ └── SConstruct
├── Makefile
└── SConstruct
我尝试添加
VariantDir('build', '.')
但它不起作用。这是我的 SConstruct
文件
env = Environment(CC = 'gcc',
CCFLAGS=['-O2', '-std=c99'],
)
Progress(['-\r', '\\r', '|\r', '/\r'], interval=5)
env.Program('Hello', 'hello.c',
LIBS=['foo'],
LIBPATH='lib/',
CPPPATH=['lib']
)
Decider('MD5-timestamp')
VariantDir('build', '.')
SConscript(['lib/SConstruct'])
编辑
我还尝试将 variant_dir
直接添加到 SConscript
指令中:
SConscript(['lib/SConstruct'], variant_dir='build')
但是我有一个错误:
$ scons -Q
gcc -o Hello hello.o -Llib -lfoo
/usr/bin/ld: cannot find -lfoo
collect2: error: ld returned 1 exit status
scons: *** [Hello] Error 1
似乎 SCons 不再考虑 CPPPATH
因为我在构建期间没有任何 -Ilib
。
不要直接使用VariantDir()
方法,而是使用SConscript
调用的variant_dir
关键字。为此,最好将您的源移动到单独的“src
”文件夹中(参见下面的示例)。
User Guide中的相关章节是15"Separating Source and Build Directories"。
您还可以在 pyconde_2013/examples/exvar
文件夹的 https://bitbucket.org/dirkbaechle/scons_talks 中找到工作示例。
阅读以上内容:
env = Environment(CC = 'gcc',
CCFLAGS=['-O2', '-std=c99'],
)
Progress(['-\r', '\\r', '|\r', '/\r'], interval=5)
# explicitly specify target dir and file base so object
# isn't in source directory.
object = env.Object('build/hello','hello.c')
env.Program('Hello', object,
LIBS=['foo'],
LIBPATH='build/lib/',
CPPPATH=['build/lib']
)
Decider('MD5-timestamp')
VariantDir('build', '.')
SConscript('lib/SConstruct','build/lib')
由于您不想将源文件移动到目录的子目录中,SConstruct 将使其正常工作,因此您需要手动指定目标目录(这符合 make 的功能)
我有这个非常简单的项目:
.
├── hello.c
├── lib
│ ├── foo.c
│ ├── foo.h
│ └── SConstruct
├── Makefile
└── SConstruct
构建后我想得到这个:
.
├── build
│ ├── hello
│ ├── hello.o
│ └── lib
│ ├── libfoo.a
│ └── foo.o
│
├── config.log
├── hello.c
├── lib
│ ├── foo.c
│ ├── foo.h
│ └── SConstruct
├── Makefile
└── SConstruct
我尝试添加
VariantDir('build', '.')
但它不起作用。这是我的 SConstruct
文件
env = Environment(CC = 'gcc',
CCFLAGS=['-O2', '-std=c99'],
)
Progress(['-\r', '\\r', '|\r', '/\r'], interval=5)
env.Program('Hello', 'hello.c',
LIBS=['foo'],
LIBPATH='lib/',
CPPPATH=['lib']
)
Decider('MD5-timestamp')
VariantDir('build', '.')
SConscript(['lib/SConstruct'])
编辑
我还尝试将 variant_dir
直接添加到 SConscript
指令中:
SConscript(['lib/SConstruct'], variant_dir='build')
但是我有一个错误:
$ scons -Q
gcc -o Hello hello.o -Llib -lfoo
/usr/bin/ld: cannot find -lfoo
collect2: error: ld returned 1 exit status
scons: *** [Hello] Error 1
似乎 SCons 不再考虑 CPPPATH
因为我在构建期间没有任何 -Ilib
。
不要直接使用VariantDir()
方法,而是使用SConscript
调用的variant_dir
关键字。为此,最好将您的源移动到单独的“src
”文件夹中(参见下面的示例)。
User Guide中的相关章节是15"Separating Source and Build Directories"。
您还可以在 pyconde_2013/examples/exvar
文件夹的 https://bitbucket.org/dirkbaechle/scons_talks 中找到工作示例。
阅读以上内容:
env = Environment(CC = 'gcc',
CCFLAGS=['-O2', '-std=c99'],
)
Progress(['-\r', '\\r', '|\r', '/\r'], interval=5)
# explicitly specify target dir and file base so object
# isn't in source directory.
object = env.Object('build/hello','hello.c')
env.Program('Hello', object,
LIBS=['foo'],
LIBPATH='build/lib/',
CPPPATH=['build/lib']
)
Decider('MD5-timestamp')
VariantDir('build', '.')
SConscript('lib/SConstruct','build/lib')
由于您不想将源文件移动到目录的子目录中,SConstruct 将使其正常工作,因此您需要手动指定目标目录(这符合 make 的功能)