我正在研究一箇中等規模的項目,該項目包含幾個相互依賴的庫,我最近使用非遞歸makefile進行了轉換。我的下一個目標是同時在同一個源代碼樹中構建調試版本和發佈版本(進行調試;發佈)。我的第一步是使調試和發佈目標包含正確的構建標誌。我這樣做是使用目標特定的變量,就像這樣: CXXFLAGS = -Wall -Wextra -Werror -DLINUX使用GNU Make同時構建調試目標和發佈目標
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: build
這工作得很好,但你只能建立調試,或釋放,不能同時在同一時間。同時,我並不是指在同一個版本中,我的意思是在同一個源代碼樹中進行調試(make debug; make release)。爲了做到這一點,我需要將目標文件放在一個調試/版本特定的目錄中,這樣它們不會互相覆蓋,我需要用'D'來調試目標二進制名稱。我以爲這將是容易,因爲我可以再次使用目標特定的變量,就像這樣: CXXFLAGS = -Wall -Wextra -Werror -DLINUX
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: MODULE_BLD_TYPE=D
debug: OUT_DIR=debug_obj
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: MODULE_BLD_TYPE:=
release: OUT_DIR=release_obj
release: build
.PHONY: build
build: TARGET_NAME=HelloWorld$(MODULE_BLD_TYPE)
build: TARGET_BUILD_DIR=$(PROJECT_ROOT_DIR)/$(OUT_DIR)
build: TARGET_BUILD_OBJS=$(addprefix $(TARGET_BUILD_DIR)/,$(SOURCES:.cpp=.o))
build: $(TARGET_NAME)
你讓專家閱讀這已經知道這會不會是因爲工作您不能使用目標特定變量來創建實際目標。他們爲我的CXXFLAGS var正常工作,因爲該變量未用於目標名稱。
是否存在使用非遞歸makefile管理調試/發佈版本的設計模式和/或最佳實踐?具體而言,如何構建目標文件目錄路徑和目標名稱(根據目標構建目標)?
在先決條件中如何分配變量? – Michael 2012-09-26 20:10:49
不出所料,該文檔有一個答案:https://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html – 2015-09-13 22:18:25