小さなCプログラム用のMakefileを書き込もうとしています。構造は
project_root
- src(ソースファイル)
- テスト(テストファイル)
- ビルド(プログラムバイナリ)
私のmakeファイルは以下の通りです。
CFLAGS = -g -Wall -Isrc $(OPTFLAGS)
LDLIBS = $(OPTLIBS)
PREFIX ?= /usr/local/
OPTVALGRIND="valgrind --track-origins=yes --log-file=tests/valgrind.log"
TARGET_SRC = src/hello_make.c
TARGET = build/hello_make
SOURCES := $(wildcard src/*.c)
SOURCES := $(filter-out $(TARGET_SRC),$(SOURCES))
OBJECTS = $(patsubst %.c,%.o,$(SOURCES))
TEST_SRC = $(wildcard tests/*_tests.c)
TESTS = $(patsubst %.c,%,$(TEST_SRC))
TEST_FILE ?= hello_make_tests
all: $(TARGET) tests
$(TARGET): build $(OBJECTS)
$(CC) $(CFLAGS) $(TARGET_SRC) $(OBJECTS) $(LDLIBS) -o $@
.PHONY: compile_tests tests test testv valgrind build clean
compile_tests: LDLIBS += -lrt -lm
compile_tests: CFLAGS += $(OBJECTS)
compile_tests: build $(OBJECTS) $(TESTS)
@echo "TARGET=$(TARGET), TESTS=$(TESTS)"
@echo "compile_tests done"
tests: compile_tests
sh ./tests/run_tests.sh
test: compile_tests
sh ./tests/run_test.sh tests/$(TEST_FILE)
testv: compile_tests
sh ./tests/run_test.sh tests/$(TEST_FILE)
valgrind:
VALGRIND=$(OPTVALGRIND) $(MAKE) -s
clean:
rm -rf $(OBJECTS)
rm -rf $(TARGET)
rm -rf $(TESTS)
rm -rf build
rm -rf tests/*.log
build:
@mkdir -p build
ターゲットテストとtestv(valgrindでの実行に対応)があります。だから私がそうするとき、
make test TEST_FILE=hello_make_tests
このテストに必要なものをすべて構築する必要があります。次に、tests/hello_make_testsを実行します。
ほとんどのMakefileが機能しています。ソースファイルをビルドしてコンパイルし、それらをテストプログラムにリンクします。$ \
私の問題は、これは、最初にmake allを使用し、次にmaketestを使用した場合にのみ機能することです。私がきれいにした後、テストをするとき。次のエラーが発生します。
cc -g -Wall -Isrc src/get_one.o src/get_three.o src/get_two.o -c -o src/get_one.o src/get_one.c
cc: error: src/get_one.o: No such file or directory
cc: error: src/get_three.o: No such file or directory
cc: error: src/get_two.o: No such file or directory
make: *** [src/get_one.o] Error 1
cc呼び出しは、ソースとして機能するオブジェクトファイルで間違っているように見えますか?私は作るのがかなり新しく、これを理解することができません。助けてください。