gpt4 book ai didi

makefile 将特定变量作为先决条件

转载 作者:行者123 更新时间:2023-12-04 13:42:19 24 4
gpt4 key购买 nike

相关:Target-specific Variables as Prerequisites in a 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

最佳答案

首先,一个非假的食谱must create a target, $@ , not $(OUTPUT_DIR)$@ .还可以考虑将目录依赖转换为 order-only先决条件。
为了得到一个合适的值$(OUTPUT_DIR)在先决条件列表中,您必须使用 secondary expansion ,否则,在主要扩展期间,全局定义 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 将特定变量作为先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com