如何编写“选择性” Makefile?

时间:2018-10-07 16:55:05

标签: c makefile gnu-make

noob问题在这里。

我的目录中包含许多.c文件,它们基本上是libc函数,我将自己编码为练习。

我在这些文件中写了一个main()来测试功能,并且我想编写一个Makefile,该文件允许我仅编译我想测试的文件,例如:

make memset.c

仅获取在memset.c中编写的代码的可执行文件。

我试图做这样的事情:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

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

但是显然它不起作用。我没有什么可以代替“全部”。 我知道这是非常基础的,但是我没有做到,我做了研究,但没有找到这个特定问题的答案。

预先感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果您执行make -n -p,则会得到make中所有内置规则的转储。在GNU Make 4.1中,这包括:

%: %.o
#  recipe to execute (built-in):
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

因此,您可能仅需要在您的makefile中当前拥有%的地方all

您还可能会发现不需要内置的那些规则。假设您有三个C文件,每个文件都有您指定的main()abs.c,{{1} }和div.c。您的Makefile不得超过两行:

fmax.c

这将允许您执行CFLAGS = -Wall -Wextra -pedantic all: abs div fmax 来使make abs可执行,而执行abs来使它们全部可用。

答案 1 :(得分:1)

您可以定义static pattern rules来构建目标文件和可执行文件,然后以所需的可执行文件名称作为目标调用make:

CC     = gcc
CFLAGS = -Wall -Wextra -pedantic

SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,%.o,$(SRC))
EXE := $(patsubst %.c,%,$(SRC))

.PHONY: all obj

all: $(EXE)

obj: $(OBJ)

$(EXE): %: %.o
    $(CC) $(LDFLAGS) $< -o $@

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

.PHONY: clean

clean:
    rm -f $(OBJ) $(EXE)

然后:

$ make memset.o

仅构建memset.o

$ make memset

仅构建memset(如果需要,则构建memset.o

$ make obj

构建所有目标文件,

$ make # or make all

构建所有可执行文件(和目标文件,如果需要),并且

$ make clean

删除所有可执行文件和目标文件。

答案 2 :(得分:0)

使用wildcard,您可以实现自己想要的。

请注意,如果每个程序仅依赖一个.c文件,则不需要%.o规则:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

SRC  := $(wildcard *.c)
EXEC = $(SRC:%.c=%)

all: $(EXEC)

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

只需调用这种方式即可:

make memset

答案 3 :(得分:0)

您已经有足够的选择性地编译可执行文件:

CC = gcc
CFLAGS = -Wall -Wextra -pedantic

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

然后,您只需要使用所需的目标(可执行文件)调用make:

make select

如果您有几套带有不同标志的可执行文件,则可以使用:

EX0 = drink clean
${EXE0}: % : %.o
        $(CC) $(LDLAGS) -lwater $< -o $@
EX1 = burn melt
{EX1}: % : %.o
        $(CC) $(LDLAGS) -lfire  $< -o $@