我正在尝试让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')
有没有更好的方法来解决这个问题?
答案 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
函数)。