【问题标题】:how to force SCons to build with relative paths?如何强制 SCons 使用相对路径构建?
【发布时间】:2020-08-03 07:03:03
【问题描述】:

我的项目结构如下:

/project
    /src_dirs
        /src_dir_1
        /...
    /include_dirs
        /inc_dir_1
        /...

/output
    SConstruct
        /Sconscripts
            lib1_sconscript
            lib2_sconscript
            /...
    objects/
        /...
    libs/
        /...   

output 目录调用的构建过程。所以sconscripts 中的所有路径都相对于output 目录。我的sconscript 文件是自动生成的。正如您在下面看到的,源文件和包含文件的路径是相对路径。这是一个演示 sconscript 文件:

Import('libaEnv')
includes = ['../../project/include_dirs/inc_dir_1/be/cmn/inc', '../../project/include_dirs/inc_dir_1/be/be/cmn/api_inc']
directives = ['-CC','-c','-g']
code_switches = ['FAST_RUNG_MLK', 'EN_PRIORITY']
listDefines = code_switches
linkLibs = []

crt = libaEnv.Object(target='objects/crt.o', source='../../project/src_dirs/src_dir_1/crt.c', CPPDEFINES=listDefines, CPPFLAGS=directives, CPPPATH=includes)
ert = libaEnv.Object(target='objects/ert.o', source='../../project/src_dirs/src_dir_1/ert.c', CPPDEFINES=listDefines, CPPFLAGS=directives, CPPPATH=includes)
urt = libaEnv.Object(target='objects/urt.o', source='../../project/src_dirs/src_dir_1/urt.c', CPPDEFINES=listDefines, CPPFLAGS=directives, CPPPATH=includes)

liba = libaEnv.Library (target='libs/liba.a', source=[crt,ert,urt])
Return('liba')

我已经看到 scons 使用源文件和头文件的绝对路径调用编译器。我通过使用-verbose 运行scons 看到了这一点(我还通过在spawn 方法中打印Action.py 中的命令行来验证这一点)。

我的 scons 版本是:SCons 2.5.1,我正在使用python 2.7 运行。

如何强制 scons 仅使用相对路径调用 compiler

【问题讨论】:

  • 您是否正在尝试构建/添加到您下载的某些使用 SCons 作为构建系统的软件包?默认情况下,SCons 应该使用相对于 SConstruct 位置的路径构建(尽管您可以使用一些命令行标志更改基本目录)。此外,您使用的是旧版本的 SCons。你有机会使用 4.0.1 和 python 3.5+ 吗?
  • @bdbaddog-路径是相对于 sconscript 文件生成的。 scons 成功调用了编译器。但是所有使用绝对路径调用的命令。 scons 采用路径并将它们转换为绝对路径。我不想要这种行为。实际上我有一些使用 python 2.7 和 scons 2.5.1 运行的复杂应用程序,所以这不是短期的选择。
  • 这不是默认的 SCons 行为。默认行为是相对于 SConstruct 位置的路径。有什么理由不能只使用 py3 来运行 SCons 4.01?你是在修改 CCCOM 之类的变量吗?

标签: scons sconscript


【解决方案1】:

这里的一种方法是您可以使用顶级相对寻址,如下所示:

includes = ['#project/include_dirs/inc_dir_1/be/cmn/inc', '#project/include_dirs/inc_dir_1/be/be/cmn/api_inc']

这仍然会为您提供绝对路径,但它们将根据有效的起点计算(# = "包含顶级 SConstruct 的目录",因此是顶级相对)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多