【问题标题】:Generating list of generated sources (a la foreach) in automake在 automake 中生成生成源列表(a la foreach)
【发布时间】:2011-11-18 19:59:12
【问题描述】:

我目前正在开展一个非常广泛地使用模板的项目,并且在实例化过程中遇到了内存限制。我已将实例化拆分为许多非常简单的文件,它们都是仅包含包含的三行代码。

我让这些由 Makefile.am 中的规则生成。现在我有一个很长的文件列表,应该在我的 Makefile 中生成,并且想用类似 foreach 的表达式重构这个列表。更具体的说:我有这样一行

libfoo_la_SOURCES = a_0.cpp a_1.cpp ... b_0.cpp b_1.cpp ... c_0.cpp c_1.cpp ...

可以更简洁地表达为

libfoo_la_SOURCES = $(foreach i,a b ...,$(foreach j,0 1 ...,$i_$j.cpp))

但是,第二个构造不仅被 automake 警告,而且也不起作用:以这种方式给出的文件既没有编译也没有清理。

我当前的解决方法是通过 shell 脚本生成此文件列表。

任何想法如何实现这个迭代?

【问题讨论】:

    标签: makefile autotools automake


    【解决方案1】:

    我会忘记制作循环:GNU 扩展不是标准的,Automake 也不理解。您可以在此处使用的一种标准(和可移植)make 构造是macro expansion with substitution$(var:subst1=subst2) 将在将单词的任何后缀subst1 替换为subst2 后扩展为$(var) 的值。 Automake 明白这一点。

    如果subst1 为空,如$(var:=subst2),则将subst2 附加到$(var) 中的所有文件。您可以使用它来构建文件列表,如下所示:

    f = a b c d e f
    g = $(f:=_0) $(f:=_1) $(f:=_2) $(f:=_3)
    all_files = $(g:=.cpp)
    
    echo:
            @echo $(all_files)
    

    使用上述Makefile 运行make echo 将显示从a_0.cppf_3.cpp 的所有文件。

    【讨论】:

    • 谢谢,工作出色,将 10 行 sh 生成的 115 行 Makefile 减少到 20 行便携式 make。
    【解决方案2】:

    和你一样,我发现 GNU make foreach 函数不会像这样工作,因为 在生成 Makefile 时,源需要在那里。因此,我使用GNU Autogen(也称为here)生成一个makefile 片段,该片段随后包含在Makefile.am 中。所以它可能与你的 shell 脚本方法没有什么不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2016-01-26
      • 1970-01-01
      • 2011-07-20
      • 2011-03-26
      相关资源
      最近更新 更多