二次扩展和两个makefile

时间:2017-02-21 09:21:33

标签: makefile cross-compiling gnu-make expansion gdkpixbuf

我有一个带有两个美元符号的命令(二级扩展)

$(PREFIX)/bin/gdk-pixbuf-query-loaders > $(shell $(PREFIX)/bin/gdk-pixbuf-query-loaders | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/../loaders.cache

shell命令应该从以下输出中提取路径:

...
# LoaderDir = /home/redux/x-libs/i686-nptl-linux-gnu/lib/gdk-pixbuf-2.0/2.10.0/loaders
...

当我运行make时,规则会扩展为以下命令:

/home/redux/x-libs/i686-nptl-linux-gnu/bin/gdk-pixbuf-query-loaders > /home/redux/x-libs/i686-nptl-linux-gnu/lib/gdk-pixbuf-2.0/2.10.0/loaders/../loaders.cache

没关系,但是如果我使用第二个makefile启动第一个,那么规则会扩展为

/home/redux/x-libs/i686-nptl-linux-gnu/bin/gdk-pixbuf-query-loaders > /../loaders.cache

发生错误:

/bin/sh: 11: cannot create /../loaders.cache: Permission denied

从第二个makefile启动第一个makefile的命令如下:

$(MAKE) -f $(makefile_path)/build_libs_for_host.mk .print_and_write_triplets $(RULES) JOBS=$(JOBS) HOST=$(patsubst build_host_%,%,$@)

启动第二个makefile(启动我创建的第一个makefile)的命令(在bash中)是:

time make -f ~/_dev/_pro/second.mk all RULES=build_gdk_pixbuf JOBS=-j4 |& tee ~/log_20170221_x-libs.txt

两个makefile都使用.SECONDEXPANSION:。我看不出错误。

现在我被卡住了。这种扩张有什么问题?

GNU make有一些神奇的规则,也许我必须在$(MAKE)行添加一个参数?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我的完整规则太复杂了,所以我发布了简化的代码来解释我的解决方案。

首先,我们有一个规则,可以在同一个命令中创建一个文件夹并使用$(shell ...)

all:
    mkdir -p $(PREFIX) && \
    cd $(PREFIX) && \
    cat $(PREFIX)/../$(INPUT) > $(shell cat $(PREFIX)/../$(INPUT) | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/./loaders.cache
    touch $@
    @echo [DONE]

如果之前未创建文件夹,则可能会失败。在这种情况下,$(shell ...)将扩展为空字符串。 cat命令会失败。我们在这里看到这不是一个扩展问题。这是一个时间问题。

解决方案是将此规则分为两部分:

all_pass1:
    mkdir -p $(PREFIX) && \
    touch $@
    @echo [DONE]

all_pass2: all_pass1
    cd $(PREFIX) && \
    cat $(PREFIX)/../$(INPUT) > $(shell cat $(PREFIX)/../$(INPUT) | awk -F "=" '/LoaderDir/ {print $$2}' | tr -d ' ')/./loaders.cache
    touch $@
    @echo [DONE]

好的,我有一个解决方案。但我想知道为什么我的第一个makefile工作,第二个启动第一个makefile失败。这就是我发布这个问题的原因。在我看来,这仍然像一些GNU制造魔法。

对我而言,它已经解决了,但如果您认为有更好的解决方案,请随时发表评论或提出更好的解决方案。