簡體   English   中英

用於測試目標的具有不同源文件夾的 Makefile

[英]Makefile with different source folder for test target

我對 C++ 生成文件非常陌生,我有下面的生成文件,我主要是從互聯網上的某個地方復制的。 我對 makefile 的貢獻是“測試”目標,這就是問題所在。

我的代碼組織在include (用於標題)、 src (用於源)和test (用於測試源)目錄中。 對於標准目標,我想在 src 文件夾中構建所有文件,其中還包括 main.cpp 文件。 為了進行測試構建,我想構建src文件夾中main.cpp 之外的所有文件以及test文件夾中的所有文件。 我希望我的測試目標能夠實現這一目標,但它失敗了。 它只是從標准目標構建文件。

我該如何糾正我的錯誤。

謝謝

我使用的生成文件:

APP=myappname

SRC_DIR=src
INC_DIR=include
OBJ_DIR=obj
BIN_DIR=bin
TEST_SRC_DIR=test
MAIN_CPP_NAME=main.cpp

CC=g++
LD=g++
CFLAGS=-O2 -c -Wall -std=c++17
LFLGAS=
DFLAGS=-g3 -O0 -DDEBUG
INCFLAGS=-I$(INC_DIR)

SOURCES=$(wildcard $(SRC_DIR)/*.cpp)
HEADERS=$(wildcard $(INC_DIR)/*.hpp)
OBJECTS=$(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
DEPENDS=$(OBJ_DIR)/.depends


.PHONY: all
all: $(BIN_DIR)/$(APP)

.PHONY: debug
debug: CFLAGS+=$(DFLAGS)
debug: all

.PHONY: test
test:   SOURCES=$(wildcard $(SRC_DIR)/*.cpp)
test: SOURCES=$(filter-out $(SRC_DIR)/$(MAIN_CPP_NAME), $(SOURCES))
test: OBJECTS=$(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
test: TEST_SOURCES=$(wildcard $(TEST_SRC_DIR)/*.cpp)
test: OBJECTS+=$(TEST_SOURCES:$(TEST_SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
test: all

$(BIN_DIR)/$(APP): $(OBJECTS) | $(BIN_DIR)
$(LD) $(LFLGAS) -o $@ $^

$(OBJ_DIR)/%.o: | $(OBJ_DIR)
$(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<

$(DEPENDS): $(SOURCES) | $(OBJ_DIR)
$(CC) $(INCFLAGS) -MM $(SOURCES) | sed -e 's!^!$(OBJ_DIR)/!' >$@

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPENDS)
endif


$(BIN_DIR):
    mkdir -p $@
$(OBJ_DIR):
    mkdir -p $@

.PHONY: clean
clean:
    rm -rf $(BIN_DIR) $(OBJ_DIR)

您試圖在不了解基礎知識的情況下編寫復雜的 makefile,這幾乎是不可能的。 讓我們嘗試一個非常簡單的方法。

首先,假設源文件是

src/main.cpp
src/func.cpp
test/unit.cpp
test/global.cpp

現在我們需要一個test需要的目標文件列表。

SOURCES:=$(wildcard $(SRC_DIR)/*.cpp) # this will be src/main.cpp src/func.cpp
NON_MAIN_SOURCES:=$(filter-out $(SRC_DIR)/$(MAIN_CPP_NAME), $(SOURCES)) # this will be src/func.cpp
TEST_DIR_SOURCES:=$(wildcard $(TEST_SRC_DIR)/*.cpp) # this will be test/unit.cpp test/global.cpp
TEST_SOURCES:=$(notdir $(NON_MAIN_SOURCES) $(TEST_DIR_SOURCES)) # this will be func.cpp unit.cpp global.cpp
TEST_OBJECTS:=$(patsubst %.cpp,$(OBJ_DIR)/%.o,$(TEST_SOURCES)) # this will be obj/func.o obj/unit.o obj/global.o

(請注意,您必須避免src/test/之間的名稱沖突,例如具有src/func.cpptest/func.cpp 。這是您的目錄結構的結果;makefile test/func.cpp它。)

現在我們必須告訴 Make 如何構建這些目標文件。 我們可以從src的源規則開始:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    $(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<

(為了簡單起見,我省略了$(OBJ_DIR)先決條件。現在,您將負責確保obj/存在。)

現在是test的來源。 一種粗略但有效的方法是為它們添加規則:

$(OBJ_DIR)/%.o: $(TEST_DIR)/%.cpp
    $(CC) $(CFLAGS) $(INCFLAGS) -o $@ $<

還有更復雜的方法,但你必須先掌握基礎知識。

最后,構建bin/mytestname的規則:

$(BIN_DIR)/mytestname: $(TEST_OBJECTS)
    $(LD) $(LFLAGS) -o $@ $^

現在就夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM