在模式规则中定义先决条件的选择



例如,可以说我有一个可以从barbaz源构建foo文件的编译器。

这样的规则可能看起来像:

%.foo: %.bar
    # commands to
    # invoke compiler
%.foo: %.baz
    # commands to
    # invoke compiler

但是,随着输入类型和配方命令的数量的增加,这可能会开始越来越长。是否有任何语法可以将其压缩为单个规则?

%.foo: $(oneof %.bar %.baz)
    # commands to
    # invoke compiler

您在开始时提出的建议是正确的:关于建筑规则,Makefiles应该清晰明确。

另一方面,您可以看一下罐头食谱,以避免一次又一次地重复相同的食谱:

define MAKE_FOO =
#You may use automatic variables such as $^ or $@.
mv $< $@    #In this example just a file renaming.
endef
%.foo: %.bar
    $(MAKE_FOO)
%.foo: %.baz
    $(MAKE_FOO)

罐装食谱 MAKE_FOO将扩展到您在define语句中写的任何食谱,就像手动复制。

这是制作.o文件的具体问题的例证从具有组合模式规则的.c文件或.cpp文件中。还可以构建可执行文件以帮助插图。

makefile

.PHONY: all clean
all: test
%.o: %.c %.cpp
    gcc -c $?
test: main.o hw.o
    g++ -o $@ $^
clean:
    rm -f test *.o  

我们有:

hw.c

#include <stdio.h>
void hw(void)
{
    puts("Hello from C");
}

hw.cpp

#include <iostream>
extern "C" void hw()
{
    std::cout << "Hello from C++" << std::endl;
}

和:

main.cpp

extern "C" void hw(void);
int main(void)
{
    hw();
    return 0;
}

从清洁和运行中进行:

$ make clean && make && ./test
rm -f test *.o
g++    -c -o main.o main.cpp
gcc -c hw.c hw.cpp
g++ -o test main.o hw.o
Hello from C++

根据模式规则汇总了hw.chw.cpp

其中每个都被编译到同一对象文件hw.o,第二个,c 编译覆盖C汇编。因此链接了C 对象文件,仅仅是因为这是最后建造的。明确您的期望当组合规则由多个先决条件

触发时发生。

现在让我们更新hw.c并重复:

$ touch hw.c
$ make && ./test
gcc -c hw.c
g++ -o test main.o hw.o
Hello from C

这次,hw.o仅从hw.c汇编,并链接。

更新hw.cpp并重复:

$ touch hw.cpp
make && ./test
gcc -c hw.cpp
g++ -o test main.o hw.o
Hello from C++

再次链接了来自C 的hw.o

组合模式规则的关键要素是$?,Means 所有比目标

更新的先决条件

最新更新