制定目标取决于未来未知目标

时间:2017-08-23 13:08:33

标签: scons

我希望我的目标依赖于另一个目标,我不知道在指定我的依赖目标时的名称或路径。我不能在以后出于某些原因知道第二个目标时使用Depends

有可能制作一些我以后可以设置的占位符吗?我想像

这样的东西
target1 = <placeholder_of_some_sort>
target2 = Program(files + [target1])

# Set target1 later
target1 = Object(...)

但这不起作用,因为scons会查找占位符依赖项。

编辑:

这个例子展示了我试图解决的问题的本质。 实际上,我有一个庞大而复杂的构建系统,有几十个 SConscript文件以分层方式调用其他SConscript文件。 我根据一些用户输入生成一个或多个目标:

for x in user_input:
    targets.append(env.SConscript(daughter_sconscript))

生成的目标彼此独立 ...除了一个丑陋的边缘情况,根据一些用户输入,其中一个调用 其中一个子SConscript文件生成一个额外的目标文件,以后再使用 在另一个调用同一个女儿SConscript文件。

生成目标的顺序取决于用户输入(用户类型scons 1 2 3 vs scons 3 2 1),因此无法保证 将额外的对象描述为SCons,同时调用需要的SConscript 该对象被执行。所以我想告诉Scons&#34;嘿,我知道这个目标是需要的 一个目标文件,但尚未描述&#34;。

我可以在SConstruct文件中硬编码额外目标文件的名称:

extra_object = File("path")

for x in user_input:
    targets.append(env.SConscript(daughter_sconscript, exports = {"extras": extra_object}))

但这让我的SConstruct更加混乱。我希望尽可能保持专注, 让女儿的sconscript照顾命名和道路。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先我不会使用DefaultEnvironment(使用Program时得到的结果,而不是env.Program())

env=Environment()
env.Program('program_name',files + env['SOME_TARGET_NAME'])

.... later assuming shared env

env['SOME_TARGETNAME'] = env.SharedObject('fun_source.c')

这能为你解决吗?或者你有不同的使用模式。

更常见的工作流程是创建一个库(假设它位于不同的目录中),然后将其(通过名称)与程序链接

顶级SConstruct:

env=Environment()
env.SConscript('program/SConscript', exports='env')
env.SConscript('other_dir/SConscript', exports='env')

程序/ SConscript:

Import('env')
env.Program('program_name',files+env['SOME_TARGET_NAME'])
or
env.Program('program_name',files,LIBPATH='#/other_dir',LIBS=['otherlib'])

other_dir / SConscript

Import('env')
env['SOME_TARGETNAME'] = env.SharedObject('fun_source.c')
or
env.StaticLibrary('otherlib',['fun_source.c'])