SCons:强制SCons复制文件

时间:2013-05-21 16:04:42

标签: scons

我有一个仅包含头文件的库,包含文件夹层次结构和一堆我要安装的.hpp文件。我的问题是,scons 将文件夹复制到build文件夹中。

以下是我的目录布局:

root
  SConstruct
  subdir
    SConscript
    the_lib
       subdir_a
         header_a.hpp
       subdir_b
         header_b.hpp
  build
    (...)

以下是我在subdir/SConscript中所做的事情:

all_headers = []

for root, dirnames, filenames in os.walk('.'):
    for filename in fnmatch.filter(filenames, '*.hpp'):
        fn  = os.path.join(root, filename)
        all_headers.append((fn, root))

for f, d in all_headers:
    install.AddHeader( f, d )

我这样做是为了获取文件名及其相对路径,然后,我使用我前几天在scons wiki中找到的安装程序。

观察:all_headers仍为空,因为the_lib文件夹未被复制。我累了subdir_env.Dir('the_lib'),但没有改变一件事。

运行脚本后,我的the_lib/SConscript文件夹中有build,但没有别的。当然,我可以理解我的文件系统在这种情况下什么都不做。

任何人都可以帮助我吗?

更新

我找到的唯一方法是运行find -name "*.hpp"并将结果粘贴到我的SConscript。现在就像魅力一样,但由于库是外部库(可能添加或删除了一些文件),我想到了一个更通用的解决方案,而无需按名称知道所有标题。

2 个答案:

答案 0 :(得分:2)

我想到的第一件事就是使用SCons Install() builder,但这是在不同的位置安装实际的SCons目标,并且由于这些头文件不是目标,因此不起作用。

因此,在这种情况下,您可以使用所谓的SCons Copy Factory

答案 1 :(得分:0)

如果构建是VariantDir,那么您不需要自己复制文件,如果在任何构建器中使用标头,scons将会这样做。

如果你想要一个文件列表,你可以使用env.Glob('*/*.hpp')(但通配符赢得了遍历目录,所以你需要知道深度)