使目标依赖于未来的未知目标



我希望我的目标依赖于另一个目标,在我指定我的依赖目标时我不知道它的名称或路径。由于某些原因,我不能在以后知道第二个目标时使用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 3scons 3 2 1(,因此不能保证 将额外的对象描述给 SCons,而对 SConscript 的调用需要 将执行该对象。所以我想告诉Scons"嘿,我知道这个目标需要 一个目标文件,但尚未描述"。

我可以在 SConstruct 文件中为额外的对象文件硬编码一个名称:

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

但这让我的SConstruct充满了细节。我想让它尽可能集中, 并让女儿应征入伍者负责命名和路径。

谢谢!

首先,我不要使用默认环境(当你使用程序而不是例如env时你会得到什么。程序(((

env=Environment()
env.Program('program_name',files + env['SOME_TARGET_NAME'])
.... later assuming shared env
env['SOME_TARGETNAME'] = env.SharedObject('fun_source.c')

这能为您解决吗?或者您是否有不同的使用模型。

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

顶级系统指令:

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'])

最新更新