【问题标题】:gnu make: match-anything: dependance on existence of prerequisitesgnu make: match-anything: 依赖于先决条件的存在
【发布时间】:2011-03-06 02:29:34
【问题描述】:

请考虑以下 Makefile:

CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o

UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o 
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o

# All objects
%.o:    %.cpp %.hpp
    $(CC) $(CFLAGS) $<

# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
    $(CC) $(EFLAGS) % $< $(UTILITIES)

# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
    #$(CC) $(EFLAGS) $@ $@.cpp $(UTILITIES)

match-anything 规则(适用于可执行文件)应该使我能够在终端中键入以下内容:

make TS_CG

并让 make 编译名为 TS_CG 的可执行文件。但是,make 没有使用我的全匹配目标。相反,它使用其默认编译规则。

另一方面,如果 UTILITIES 中列出的所有对象都存在,它确实使用我的全匹配目标。因此,似乎匹配取决于先决条件的存在。

显然:

当一个规则是终端时,它不适用,除非它的先决条件确实存在。

(根据 make manual)。 但我的规则不是最终的;它没有用双冒号标记!

那么为什么这似乎仍然适用?

我也可能会问是否有人有更好的解决方案来区分对象目标和可执行目标,就像我在文件中尝试的那样。

【问题讨论】:

    标签: makefile wildcard gnu-make


    【解决方案1】:

    我很惊讶 Make 能够在 UTILITIES 尚不存在时构建 TS_CG,因为我不希望它知道 TS_CG 需要它们。

    无论如何,当 Make 试图为 TS_CG 寻找规则时,它所找到的只是隐含规则(没有特定于 TS_CG 的规则)。特别是它有你提供的%: %.cpp $(UTILITIES)和内置的%: %.cpp。如果$(UTILITIES)都存在,那么它会使用第一个规则,否则它会向下移动列表,寻找一个先决条件确实存在的规则,然后找到第二个。只有当它找不到任何存在先决条件的规则时,它才会求助于寻找规则来构建先决条件。

    【讨论】:

    • 感谢您的回复 Beta,我认为这是正确的答案。它似乎与我帖子中的 make 手册中引用的内容相反,但我想这是因为内置规则没有被我的规则覆盖(我认为它会被覆盖)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多