【问题标题】:Basename of xml files in MakefileMakefile 中 xml 文件的基本名称
【发布时间】:2015-12-06 06:11:57
【问题描述】:

这是我的 Makefile 的简化用例。我想要做的是使用这些文件的名称并创建各自的 .d 和 .hpp 文件。但是,由于某种原因,我无法做到。

XML_DATA_FILES := a.xml b.xml c.xml d.xml

build:
    @for var in $(XML_DATA_FILES); do \
        echo "$(basename $$var)";\
        $(eval var1 = $(basename $$var)) \
        echo "$(join var1,.hpp)"; \
        echo "$(join var1,.d)"; \
    done

我运行make时得到的输出如下

a.xml
var1.hpp
var1.d
b.xml
var1.hpp
var1.d
c.xml
var1.hpp
var1.d
d.xml
var1.hpp
var1.d

但我想要的是a.d, a.hpp 等等所有四个 xml 文件输入。 我已经提到了this 问题和GNU Manual,但到目前为止还没有帮助。我怎样才能做到这一点?

【问题讨论】:

  • 为什么不$(patsubst %.xml, %.hpp, $(XML_DATA_FILES))

标签: makefile gnu-make


【解决方案1】:

这里有很多问题:)。但是,从根本上讲,您不能在像 for 这样的 shell 循环中组合像 basenameeval 这样的 make 函数并期望它做任何有用的事情。 Make 总是先扩展所有 make 变量和函数的整个配方,然后将整个扩展字符串传递给 shell 以运行,然后等待 shell 完成。

考虑:运行for 循环的shell 将如何将var 的当前值备份到每次通过shell 的循环时,以便make 可以运行正确的函数等?这是不可能的。

您需要使用 only shell 结构以及在整个配方中具有相同值的简单 make 变量来编写整个循环。

然而,这作为一个 makefile 是没有用的,因为你只有一个可以做所有事情的目标。为什么不写一个shell脚本呢?为此使用 make 毫无意义。如果你想以 make 方式编写它,你需要声明目标和先决条件并创建模式规则,如下所示:

XML_DATA_FILES := a.xml b.xml c.xml d.xml

OUTPUTS := $(foreach X,$(XML_DATA_FILES:.xml=),$X.d $X.hpp)

build: $(OUTPUTS)

%.d %.hpp: %.xml
        echo "$*.d $*.hpp"

当然,因为你没有确切地说出真正的命令是做什么的,所以我不能确定这是正确的;如果您实际上有两个不同的命令,一个构建 .d 文件,一个构建 .hpp 文件,您应该创建两个不同的模式规则。

【讨论】:

  • 我最终编写了一个 Perl 脚本,并且只提供了 xml 文件的路径……而 Perl 负责了其他所有事情……:) :) :)
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多