[英]makefile target specific variables as prerequisites
相關: 特定於目標的變量作為 Makefile 中的先決條件
我正在嘗試制作一個 Makefile,它使用特定於目標的變量來指定目標文件和最終可執行文件的輸出目錄。 這個想法是維護兩個單獨的二進制版本,一個“發布”版本和一個帶有額外調試信息的“調試”版本。
我的問題是 'make' 每次都做一個干凈的構建,即使我沒有改變任何東西。 我很確定這是因為“make”在“debug”或“release”目標的先決條件中的變量聲明之前評估目標“corewars”的先決條件。
Makefile 如下所示。
CXX=g++
LD=g++
LDFLAGS=
CXXFLAGS=-Iinclude -Wall -Wextra
OBJECTS=main.o Machine.o Core.o ProcessQueue.o Instruction.o
OUTPUT_DIR:=Test/
.PHONY: default
.PHONY: all
.PHONY: release
default: release
all: release
release: OUTPUT_DIR:=Release/
release: corewars
.PHONY: debug
debug: CXXFLAGS+=-DDEBUG -g
debug: OUTPUT_DIR:=Debug/
debug: corewars
corewars: $(OUTPUT_DIR) $(addprefix $(OUTPUT_DIR),$(OBJECTS))
$(LD) -o $(addprefix $(OUTPUT_DIR),corewars) $(addprefix $(OUTPUT_DIR),$(OBJECTS))
Release:
mkdir -p $@
Debug:
mkdir -p $@
%.o: %.cpp include/%.h
$(CXX) -c $(CXXFLAGS) $< -o $(OUTPUT_DIR)$@
.PHONY: clean
clean:
$(RM) -r Release
$(RM) -r Debug
首先,非虛假配方必須創建目標$@
,而不是$(OUTPUT_DIR)$@
。 還可以考慮將目錄依賴項轉換為僅限訂單的先決條件。
為了在先決條件列表中獲得正確的$(OUTPUT_DIR)
值,您必須使用輔助擴展,否則,在主擴展期間,將使用全局定義OUTPUT_DIR:=Test/
而不是特定於目標的一。
不幸的是,我想不出一種理智的方法來使用特定於目標的變量使其工作,而不訴諸二次擴展和 vpath 魔法。 就我個人而言,我寧願先設置環境(找出OUTPUT_DIR
的值等),然后使用正確的值重新執行 Make。
ifndef OUTPUT_DIR
.PHONY: default all release debug
default all: release
release: export OUTPUT_DIR := Release/
debug: export OUTPUT_DIR := Debug/
debug: export EXTRA_CXXFLAGS := -DDEBUG -g
release debug:
@$(MAKE)
else
# ...
CXXFLAGS := -Iinclude -Wall -Wextra $(EXTRA_CXXFLAGS)
PROGRAM := $(OUTPUT_DIR)corewars
OBJECTS := $(addprefix $(OUTPUT_DIR), \
main.o Machine.o Core.o ProcessQueue.o Instruction.o)
# Default target.
$(PROGRAM): $(OBJECTS) | $(OUTPUT_DIR)
$(LD) -o $@ $<
$(OUTPUT_DIR)%.o: %.cpp | $(OUTPUT_DIR)
$(CXX) -c $(CXXFLAGS) $< -o $@
$(OUTPUT_DIR):
mkdir -p $@
endif # OUTPUT_DIR
可以將這兩部分拆分為單獨的 makefile,根(啟動器)一個和執行實際工作的一個,以使整個事情更易於管理。
特定於目標的變量僅在目標配方及其遞歸先決條件的上下文中可用。 也就是說,特定於目標的變量不能用作目標或先決條件。
一種解決方法是使用那里的 makefile。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.