2016-06-10 4 views
0

Я компиляции мои C исходные файлы с помощью этого кода:Перебор списка файлов в Makefile

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 [email protected] 

assembly: $(ASS) 
$(ASS): ass/%: src/%.c 
    $(CC) $(ASSEMBLY) $(OPTIMIZE) $^ -o [email protected] 

Действительно извините за clean ass/*, хотя, это нельзя назвать assembly потому подобное имя папки в проекте.

ответ

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 [email protected] 
+0

Это точный код creatint следующее сообщение об ошибке: 'сделать: *** Нет правила, чтобы сделать целевой«SRC/1,2-farenheit.c», требуемой 'бен/1,2-Farenheit'. Stop.' – Lanti

+0

Извините, он работает, вы просто ошибаетесь 'fahrenheit', поэтому не компилируются на моем ПК. – Lanti

+1

@ Lanti Упс, исправлено. – user657267

Смежные вопросы