我希望我的目标依赖于另一个目标,我不知道在指定我的依赖目标时的名称或路径。我不能在以后出于某些原因知道第二个目标时使用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照顾命名和道路。
谢谢!
答案 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'])