【问题标题】:SCons to build hierarchical directory structureSCons 构建分层目录结构
【发布时间】:2014-08-05 07:56:27
【问题描述】:

目录结构:

WorkSpace/root_dir
|_ SConstruct
|_ multipy
  |_ include
    |_ mul.h
  |_ src
    |_ mul.cpp
    |_ SConscript
|_ sum
  |_ include
    |_ sum.h
  |_ src
    |_ sum.cpp
    |_ SConscript
|_ src_main
  |_ main.cpp
  |_ SConscript

root_dir/SConstruct的内容:

# This Sconstruct file should build:
# Static and Shared libraries of sum and mul for both release(build/release) and debug mode(build/debug) and place it into the directory as mentioned in parenthesis
# Finally build executable for main.cpp by linking it with sum and mul libraries
# and place it into src_main/build/release and src_main/build/debug directories
import os

env = Environment()
print 'env = ', env

debug_env   = env.Clone(CCFLAGS = '-g')
release_env = env.Clone(CCFLAGS = '-O2')

SConscript('sum/src/SConscript', variant_dir='sum/build/debug/', exports ={'env' : debug_env}, duplicate=0)
SConscript('sum/src/SConscript', variant_dir='sum/build/release/', exports = {'env' : release_env}, duplicate=0)
SConscript('multiply/src/SConscript', variant_dir='multiply/build/debug/', exports ={'env' : debug_env}, duplicate=0)
SConscript('multiply/src/SConscript', variant_dir='multiply/build/release/', exports = {'env' : release_env}, duplicate=0)

sum/src/SConscript 文件内容:

# The main purpose of this SConscript file is to create static and shared library version
# for release and debug mode
# It should also creates objects and place it into build/release and build/debug 
# directories inside multiply directory
import os
Import('env')

libs = ['libsum.a', 'libsum.so']

# list of source files
src_list = Glob(os.path.join(Dir('#').abspath, 'sum', 'src', '*.cpp'))

# Path of included files ( - not sure whether it's the correct way to do in scons ?)
env['CPPPATH'] = ['#/sum/include']

env.StaticLibrary(target = 'sum', source = src_list)
env.SharedLibrary(target = 'sum', source = src_list)

Return('libs')

类似的 SConscript 文件存在于 multiply 目录中,其目的与 sum/src/SConscript 文件的注释中提到的相同。

对于 src_main/SConscript:

import os
import ('env')

Program('main.cpp', LIBS=['sum', 'mul'], LIBPATHS=[])  # How should I mention LIBPATHS here ?

运行 %scons -Q

g++ -o multiply/src/mul.o -c -g -Imultiply/include multiply/src/mul.cpp
ar rc multiply/build/debug/libmul.a multiply/src/mul.o
ranlib multiply/build/debug/libmul.a
g++ -o multiply/src/mul.os -c -g -fPIC -Imultiply/include multiply/src/mul.cpp
g++ -o multiply/build/debug/libmul.so -shared multiply/src/mul.os
ar rc multiply/build/release/libmul.a multiply/src/mul.o
ranlib multiply/build/release/libmul.a
g++ -o multiply/build/release/libmul.so -shared multiply/src/mul.os
g++ -o sum/src/sum.o -c -g -Imultiply/include sum/src/sum.cpp
sum/src/sum.cpp:1:17: fatal error: sum.h: No such file or directory
compilation terminated.
scons: *** [sum/src/sum.o] Error 1

我不明白为什么在创建 sum.o 时使用 -Imultiply/include,虽然对于 sum SConscript 文件我使用了 env['CPPPATH'] = ['#/sum/include'] -> 它被视为我在 multiply/src/SConscript 文件中使用的类似语句(即 env['CPPPATH'] = ['#/multiply/include']) p>

我是 scons 构建工具的新用户,我无法做这种简单的例子,这是一个非常普遍的实际场景。

请建议我必要的细节来修复我的错误并在我的方法中添加优化以满足要求/目的。

【问题讨论】:

  • 获取项目帮助的另一个选项是项目的网站。在这种情况下,www.scons.org 提供了指向 Wiki、UserGuide 和 MAN 页面的链接,这些页面都试图给出您上面提出的大多数问题的示例。最后,如果其他一切都失败了,SCons 有一个非常活跃的用户邮件列表,在那里你可以联系到很多曾经是初学者的人,就像现在的你一样。

标签: python build scons build-script


【解决方案1】:

-Imultiply/include 在创建 sum.o 时使用,因为您在包含的 SConscript 中有以下内容

env['CPPPATH'] = ['#/sum/include']

【讨论】:

    【解决方案2】:

    您需要提供 SConscript 文件的路径

    SConscript('multiply/src/SConscript ', variant_dir='build/debug/', export={'env':debug_env}, duplicate=0)
    SConscript('multiply/src/SConscript ', variant_dir='build/release/', export={'env':release_env}, duplicate=0)
    

    您还需要在您想要包含的任何其他 SConscript 文件上调用 SConscript()

    【讨论】:

    • 感谢您的建议,根据您的评论更新后,它现在称为 SConscript,我正在寻找一些优雅的方法来执行相同的示例,因为目前它看起来更像是一种幼稚的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多