2016-05-05 8 views
0

Mein Projekt hat ein Verzeichnis namens tests/, die eine beliebige Anzahl von C-Quelldateien enthält, jedes ist ein in sich geschlossenes Programm zum Testen einer Bibliothek. Für jede dieser Quelldateien möchte ich eine ausführbare Datei mit demselben Namen in meinem Verzeichnis build/ erstellen.Iterieren über ein Verzeichnis von Dateien mit GNU Make

z. tests/test_init.c würde in eine ausführbare Datei kompilieren build/test_init.

Derzeit mein Makefile-Schnipsel sieht wie folgt aus:

BUILD_DIR = build 
TEST_DIR = tests 

test_sources:= $(TEST_DIR)/*.c 
test_executables:= $(patsubst %.c, %, $(test_sources)) 

.PHONY: tests 

tests: $(test_executables) 
    $(CC) $^ -o [email protected] -g 

Aber dies nicht gelingt, um die gewünschte Ergebnis zu erzielen. Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Zuerst müssen Sie die wildcard function die Quellen zu finden:

test_sources:= $(wildcard $(TEST_DIR)/*.c) 

dann die richtigen Namen für die ausführbaren Dateien:

test_executables:= $(patsubst $(TEST_DIR)/%.c, $(BUILD_DIR)/%, $(test_sources)) 

Dann wird ein pattern rule einen Test ausführbare Datei von der entsprechenden Quelle zu bauen:

$(BUILD_DIR)/%: $(TEST_DIR)/%.c 
    $(CC) $< -o [email protected] -g 

(A static pattern rule könnte ein wenig aufgeräumter sein, aber es ist eine erweiterte Methode)

Endlich ein phony Ziel alle Tests zu bauen.

.PHONY: tests 
tests: $(test_executables) 

Wenn Sie Stellen auf laufen alle diese Tests wollten, Sie könnten eine falsche Musterregel run_test_% machen, aber das kann auf einen anderen Tag warten.

0

Dieses Makefile werden alle Dateien in test/*.c erkennen und bietet Aufgaben build_tests, run_tests und clean_tests.

all: build_tests 

define test_template 

build_tests: test/$(1) 

run_tests: build_tests run_test_$(1) 

test/$(1) : test/$(1).c 
    $$(CC) $$^ -o [email protected] 

.PHONY : run_test_$(1) 
run_test_$(1) : test/$(1) 
    test/$(1) 

endef 

clean: clean_tests 

clean_tests: 
    rm -fv $(foreach test, $(tests),test/$(test)) 

# Auto detect the tests (any .c file in the test directory), 
# and store the list of tests names. 
tests := $(foreach test, $(wildcard test/*.c),$(patsubst %.c,%,$(notdir $(test)))) 

# Add information about each test to the Makefile. 
$(foreach test, $(tests), $(eval $(call test_template,$(test)))) 

Hinweis: Ich bin nicht sicher, wie Tabs innerhalb eines Codeblocks in Abschlags zum Laufen zu bringen, so dass Sie Räume mit einer einzigen Lasche auf jeder eingekerbten Linie ersetzen müssen, wenn Sie diese kopieren und einfügen.