将多个源构建到目录中的多个目标中

时间:2014-08-19 18:21:23

标签: makefile gnu-make

人。我正在学习GNU-Make,我有以下项目结构:

~/projects
    /sysCalls
        ex1.c
        ex2.c
        ex3.c
        ex4.c
        ex5.c
        ex6.c
        ex7.c

每个.c源都非常简单,有自己的main函数,必须构建到相应的二进制文件中(最好以其源代码命名)。但我想构建一个bin目录(添加到我的.gitignore文件中)。

我当前的Makefile是:

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:.c=)

all: bin $(TARGET)
    mv $(TARGET) bin/

bin:
    mkdir bin

clean:
    rm -fr bin/

它按预期工作,但始终构建每个源。而且我不喜欢手动将所有内容移至bin

有关如何改进此Makefile的任何提示或想法?

2 个答案:

答案 0 :(得分:1)

TARGET行替换为

TARGET := $(addprefix bin/,$(SRC:.c=))

并添加(使用适当的编译/链接规则)

bin/%: %.c

make仍然会构建任何不是最新的二进制文件,而make bin/ex1将直接在bin目录中构建该单个二进制文件。

面对all参数,-j目标上的操作顺序并不健全。

对于GNU make,这是order-only prerequisites的用途。

答案 1 :(得分:1)

感谢Etan Reisner的回答,我发现了我认为它的解决方案。

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:%.c=bin/%)

all: | bin $(TARGET)

bin/% : %.c
    $(CC) $(CFLAGS) $< -o $@

bin:
    mkdir bin

clean:
    rm -fr bin/

关键是使用bin/% : %.c规则。

相关问题