当源文件和目标文件具有相同的后缀时,SCons会报告依赖关系循环

时间:2016-01-20 16:57:39

标签: scons build-system

由于持续集成的原因,我试图让SCons在一系列JavaScript文件上调用uglify ...

然而即使重复=错误'标志被传递给' env.SConscript'电话;防止scons将源复制到构建输出文件夹。它将具有相同源和目标扩展的文件标记为依赖循环。例如,以下简化的项目结构:

SConstruct
applications/SConscript
applications/frontend/SConscript
applications/frontend/scripts/app.js

-- SContruct --
UglifyBuilder = env.Builder(
  action = 'uglify --source $SOURCE --output $TARGET',
  suffix = '.js',
  single_source = True)

env['BUILDERS']['Uglify'] = UglifyBuilder

env.SConscript('applictions/SConscript', 'env',
    variant_dir=os.path.join('build', 'debug', 'applications'),
    duplicate=False)

-- applications/SConscript --
env.SConscript('frontend/SConscript', 'env', duplicate=False)

-- applications/frontend/SConscript --
env.Uglify('scripts/app.js')

当您运行SCons(干净与否)时,会生成以下输出;说明目标文件之间存在依赖关系循环:

$ scons applications/frontend/
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/debug/applications/frontend
scons: `applications/frontend' is up to date.
scons: done building targets.

scons: *** Found dependency cycle(s):
  build/debug/applications/frontend/scripts/app.js -> build/debug/applications/frontend/scripts/app.js

我也尝试将绝对路径传递给源文件,但遗憾的是结果相同。并且确定我可以将输出后缀更改为' .min.js',但是还有其他情况可以提供具有与某个任意输入源相同的leader-path / filename的输出文件。

我在这里误解了SCons吗?或者有人能指出我解决这个问题的正确方向吗?

因为如果这是其中一种情况,那就不是一个错误,它就是一个特征'适用于我要拔掉头发。 :)

谢谢!

1 个答案:

答案 0 :(得分:0)

我真的很抱歉你和你的头发,但这种行为与variant_dir没有任何关系,而且“复制”选项也无法帮助你。 你的例子归结为:

  • 您有一个文件“app.js”。
  • 您有一个Uglify构建器,将*.js个文件映射到*.js个文件。
  • 你告诉这个Builder用“app.js”做他的东西。

当然这会导致依赖循环,因为您的源和目标具有相同的文件名。请注意,SCons会检测从build/debug/.../app.js到自身的周期...... applications/frontend/scripts/app.js

要打破此周期,您必须重命名一个后缀(*.in以获取源文件?)或文件词干,例如您可以将源文件命名为“app_pretty.js”,然后调用

env.Uglify('scripts/app.js', 'scripts/app_pretty.js')