告诉SCons不要自动创建目录?

时间:2013-08-02 19:57:17

标签: scons

我正在尝试让SCons检查出我需要的git仓库(并希望保持该仓库的最新状态)。问题是我必须告诉它git repo包含哪些文件才能在构建中使用它们,如果我这样做,SCons会在尝试克隆它之前创建repo。

例如,假设我想要克隆GStreamer,并使用create-uninstalled-setup.sh脚本(这不是我实际上正在做的,但它是一个更简单/更快的脚本,可以解决相同的问题):< / p>

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

但它失败了因为SCons在尝试克隆gstreamer之前创建了gstreamer / scripts:

  

$ scons
  scons:阅读SConscript文件......
  scons:读完SConscript文件   scons:建立目标......
  git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer
  致命:目的地路径'gstreamer'已经存在且不是空目录   scons:*** [gstreamer / .git]错误128
  scons:因错误而终止建筑物   $ ls gstreamer /
  脚本

如果我告诉第一个命令它创建了“gstreamer”文件夹,它会创建一个依赖循环:

Command(['gstreamer', 'gstreamer/scripts/create-uninstalled-setup.sh'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')
  

$ scons
  scons:阅读SConscript文件......
  scons:读完SConscript文件   scons:建立目标......
  scons:完成了建筑目标。

     

scons:***找到依赖周期:
    gstreamer / scripts - &gt; gstreamer / scripts / create-uninstalled-setup.sh - &gt; GStreamer的/脚本
    gstreamer / scripts / create-uninstalled-setup.sh - &gt; gstreamer / scripts - &gt; gstreamer的/脚本&GT; /create-uninstalled-setup.sh

     

文件“/usr/lib/scons/SCons/Taskmaster.py”,第1019行,清理

如果我没有告诉第一个命令它创建了“create-uninstalled-setup.sh”,那么它会因为它不存在而感到困惑:

Command(['gstreamer'],
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')
  

$ scons
  scons:阅读SConscript文件......
  scons:读完SConscript文件   scons:建立目标......
  scons:*** [〜/ gst / git]目标`〜/ gst / git'需要找不到源`gstreamer / scripts / create-uninstalled-setup.sh'。
  scons:建筑因错误而终止。

作为一种解决方法,我可以在克隆之前rm -rf该文件夹,但这显然不理想:

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'], None,
    'rm -rf gstreamer && git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh',
    'gstreamer/scripts/create-uninstalled-setup.sh')

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于无法告诉git dir确实是空的(即使它有空子),我们也无法弄清楚如何告诉SCons不要自动创建子目录,您可以创建自己的依赖项检查并使用git clone函数调用SCons Execute(),该函数在执行任何SCons内置依赖项检查之前执行,如下所示:

import os.path

setup_file = 'gstreamer/scripts/create-uninstalled-setup.sh'
if not os.path.exists(setup_file)
    Execute('git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer')

Command('~/gst/git', setup_file, setup_file)

答案 1 :(得分:-1)

发生了什么以及似乎是什么问题是在准备构建目标期间,如果它们不存在,则创建所有目录。这似乎是通过构建目录节点来完成的,默认情况下只需创建目录即可完成。

这意味着您的第一次尝试只需创建目录即可创建gstreamer目录。你第二次尝试失败的原因我真的不知道。第三个是因为你根本没有建立gstreamer/scripts/create-uninstalled-setup.sh的规则。

解决方案似乎是定义构建gstreamer目录的规则:

Command(Dir("gstreamer"), [], "git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer")

然后创建gstreamer/scripts/create-uninstalled-setup.sh的规则。理想情况下,我想将它包含在上述规则中,但它似乎不起作用。但是,由于它将在上述规则创建gstreamer目录时创建,因此您只需要一个虚拟规则(没有依赖关系,没有进一步的操作 - 构建它的准备就可以完成工作):

Command("gstreamer/scripts/create-uninstalled-setup.sh", [], [])

这种方法的缺点是需要git中的每个源都必须明确告诉scons这些,至少我发现没有办法自动执行此操作。如果这是一个问题,你必须确保在读取SConstruct文件时克隆git(即使用Brady的答案中的Execute函数)。