2016-05-05 10 views
0

私のプロジェクトには、任意の数のCソースファイルを含むtests/というディレクトリがあり、それぞれがライブラリをテストするための自己完結型プログラムです。これらのソースファイルごとに、build/ディレクトリに同じ名前の実行可能ファイルを作成したいとします。GNU Makeを使用してファイルのディレクトリを反復する

など。 tests/test_init.cは実行可能ファイルbuild/test_initにコンパイルされます。

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 

しかし、これは、所望の結果を生成するために失敗します。

は現在、私のMakefileのスニペットは次のようになります。どんな助けでも大歓迎です。対応するソースからテスト実行可能ファイルを構築するために

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

pattern rule

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

正しい名前の実行可能ファイル用:

答えて

2

まずあなたがソースを見つけてwildcard functionが必要

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

(A static pattern ruleは少し整然とかもしれませんが、それは、より高度な方法です)

が最後にphonyターゲットは、すべてのテストビルドするために:あなたは実行これらのテストの全てに作りたい場合

.PHONY: tests 
tests: $(test_executables) 

を、あなたは偽のパターンルールrun_test_%を作ることができますが、それは別の日を待つことができます。

0

このMakefileはtest/*.cのすべてのファイルを検出し、build_testsrun_tests、および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)))) 

注:私はタブが値下げでコードブロック内部の作業を取得するかどうかはわかりませんので、あなたはこれをコピーして貼り付ける場合は、各インデントライン上の単一のタブとスペースを交換する必要があります。

関連する問題