循环遍历Makefile中的文件列表

时间:2016-06-10 12:26:54

标签: makefile

我使用以下代码编译我的C源文件:

CC=clang -std=c11
CFLAGS=-Wall -g
ASSEMBLY=-S -masm=intel
OPTIMIZE=-Ofast

FOLDER_SRC=./src/
FOLDER_BIN=./bin/
FOLDER_ASSEMBLY=./ass/

clean:
  rm -f \
  $(FOLDER_BIN)1.1-hello $(FOLDER_ASSEMBLY)1.1-hello \
  $(FOLDER_BIN)1.2-fahrenheit $(FOLDER_ASSEMBLY)1.2-fahrenheit \
  $(FOLDER_BIN)1.2-fahrenheit-floating $(FOLDER_ASSEMBLY)1.2-fahrenheit-floating

all:
  $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.1-hello.c -o $(FOLDER_BIN)1.1-hello
  $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit.c -o $(FOLDER_BIN)1.2-fahrenheit
  $(CC) $(CFLAGS) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit-floating.c -o $(FOLDER_BIN)1.2-fahrenheit-floating

assembly:
  $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.1-hello.c -o $(FOLDER_ASSEMBLY)1.1-hello
  $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit.c -o $(FOLDER_ASSEMBLY)1.2-fahrenheit
  $(CC) $(ASSEMBLY) $(OPTIMIZE) $(FOLDER_SRC)1.2-fahrenheit-floating.c -o $(FOLDER_ASSEMBLY)1.2-fahrenheit-floating

我尝试实现某种循环来减少写入。我添加了这段代码,但它只会产生错误:

FILENAME_SRC := $(wildcard $(FOLDER_SRC)*.c)
FILENAME_BUILD := $(patsubst $(FOLDER_SRC)%.c,%,$(FILENAME_SRC))

echo : $(FILENAME_SRC)
  @echo $^
  @echo $(FILENAME_BUILD)

build : $(FILENAME_SRC)
  $(CC) $(CFLAGS) $(OPTIMIZE) $^ -o $(FILENAME_BUILD)

make echo将其打印到控制台:

$ make echo
src/1.2-fahrenheit.c src/1.1-hello.c src/1.2-fahrenheit-floating.c
1.2-fahrenheit 1.1-hello 1.2-fahrenheit-floating

make build命令生成此错误:

$ make build
clang -std=c11 -Wall -g -Ofast src/1.2-fahrenheit.c src/1.1-hello.c src/1.2-fahrenheit-floating.c -o 1.2-fahrenheit 1.1-hello 1.2-fahrenheit-floating
clang.exe: error: no such file or directory: '1.1-hello'
clang.exe: error: no such file or directory: '1.2-fahrenheit-floating'
make: *** [Makefile:21: build] Error 1

我希望预期的输出看起来像make all

$ make all
clang -std=c11 -Wall -g -Ofast ./src/1.1-hello.c -o ./bin/1.1-hello
clang -std=c11 -Wall -g -Ofast ./src/1.2-fahrenheit.c -o ./bin/1.2-fahrenheit
clang -std=c11 -Wall -g -Ofast ./src/1.2-fahrenheit-floating.c -o ./bin/1.2-fahrenheit-floating

最终解决方案

CC := clang -std=c11
GCC := gcc -std=c11
CFLAGS := -Wall -g
ASSEMBLY := -Wall -S -masm=intel
OPTIMIZE := -O3 -march=native

SRC := $(wildcard src/*.c)
BIN := $(patsubst src/%.c,bin/%,$(SRC))
ASS := $(patsubst src/%.c,ass/%,$(SRC))

clean:
  rm -f bin/* ass/*

build: $(BIN)
$(BIN): bin/%: src/%.c
  $(CC) $(CFLAGS) $(OPTIMIZE) $^ -o $@

assembly: $(ASS)
$(ASS): ass/%: src/%.c
  $(CC) $(ASSEMBLY) $(OPTIMIZE) $^ -o $@

clean ass/*非常抱歉,它不能被称为assembly,因为项目中的文件夹名称相似。

1 个答案:

答案 0 :(得分:2)

您的all规则需要类似

CC := clang
CFLAGS := -std=c11 -Wall -g -Ofast

targets := bin/1.1-hello bin/1.2-fahrenheit bin/1.2-fahrenheit-floating

.PHONY: all
all: $(targets)
$(targets): bin/%: src/%.c
    $(LINK.c) $^ $(LDLIBS) -o $@
相关问题