【问题标题】:How to create an alias for a build target with a relative path in Scons?如何在 Scons 中为具有相对路径的构建目标创建别名?
【发布时间】:2008-11-13 01:25:38
【问题描述】:

背景

我正在通过设置一个包含两个子项目的基本 C++ 示例项目来试用 Scons:

  • Prj1 是一个依赖于 Prj2 的 EXE
  • Prj2 是一个导出一些函数的 DLL

可以看到我的SConstruct和SConscript文件here的目录结构和内容@

问题

我遇到的问题是,为了从命令行构建这些目标,我必须同时指定它们的构建目录的相对路径和特定于平台的文件扩展名。

例如,要构建 Prj1,我必须这样做:


build> scons ../bin/project1.exe

同样,要构建 Prj2,我必须这样做:


build> scons ../bin/project2.dll

问题

如何在不指定相对路径和平台特定文件扩展名的情况下让 SCons 构建这些项目?

期望:


build> scons project1 
build> scons project2

可能的解决方案

  • 使用别名 - 我很确定这 我想要的,但显然我搞砸了。我尝试了以下方法但没有成功:

prj1_env.Alias( 'project1', PROG)
prj1_env.Alias( 'project1', os.path.join( BIN_DIR, PROG) )

参考文献

【问题讨论】:

  • 如果我记得另一个问题 PROG 上没有 .exe。尝试在第二种情况下添加它。
  • 没错,PROG 上没有.exe。但是,这是 Program 函数有意并推荐的,因为添加扩展是特定于平台的,因此不支持跨平台工作。我知道我可以进行平台检测,但 SCons 可以为您完成。

标签: c++ build scons


【解决方案1】:

将其移至答案而不是评论。 :)

参考文献

Alias 需要一个实际目标作为其第二个参数。我认为问题在于“project1”(PROG 的值)不是实际目标。纠正此问题的简单方法如下。 让 PrefixProgram 返回一个值:

def PrefixProgram(env, outdir, trgt, srcs):
    return env.Program(target = os.path.join(outdir, trgt), source = srcs)

然后:

target = PrefixProgram( prj1_env, BIN_DIR, PROG, SOURCES )
prj1_env.Alias("project1", target)

你当然可以这样做:

prj1_env.Alias("project1", PrefixProgram( prj1_env, BIN_DIR, PROG, SOURCES ))

但我认为第一种方式更容易理解。

我希望这会有所帮助。

【讨论】:

  • 甜蜜。大约 20 分钟前我才发现这个问题,打算在午饭后写下答案。我完全按照您在第一种方式中描述的方式进行了操作,并且效果很好。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多