GNU Make:强制使用我自己的规则版本
GNU Make: Force use of my own version of a rule
我的 Makefile 中有这条规则:
%: ${OBJ}/%.o ${OBJ}/AgentProgram.o ${LIB}
$(CXX) $^ ${LDFLAGS} ${LIB_DIRS} ${LIBS} $(OUTPUT_OPTION)
如果obj/Foo.o 存在,make 将使用此规则。但是,如果该对象尚不存在,它将使用内置规则并尝试直接从我的 .cpp 进行编译。
有没有办法将此规则定义为默认规则,或关闭内置规则?
我的解决方法是修改我的 make bins
目标以首先生成所有 .o 文件。在这种情况下并不难,我改变了:
bins: ${BINS}
并将其变成这样:(我已经有可用的 ${OBJECTS})
bins: ${OBJECTS} ${BINS}
您可以 cancel pattern rules,包括内置模式规则,通过在没有配方的情况下定义它们:
%: %.c
%: %.cpp
将删除从 .c
和 .cpp
创建二进制文件的模式规则。
或者,使用足够新的 GNU make 版本,您可以通过将此添加到您的 makefile 来禁用所有内置规则:
MAKEFLAGS += -r
(-r
选项的含义见手册)
我的 Makefile 中有这条规则:
%: ${OBJ}/%.o ${OBJ}/AgentProgram.o ${LIB}
$(CXX) $^ ${LDFLAGS} ${LIB_DIRS} ${LIBS} $(OUTPUT_OPTION)
如果obj/Foo.o 存在,make 将使用此规则。但是,如果该对象尚不存在,它将使用内置规则并尝试直接从我的 .cpp 进行编译。
有没有办法将此规则定义为默认规则,或关闭内置规则?
我的解决方法是修改我的 make bins
目标以首先生成所有 .o 文件。在这种情况下并不难,我改变了:
bins: ${BINS}
并将其变成这样:(我已经有可用的 ${OBJECTS})
bins: ${OBJECTS} ${BINS}
您可以 cancel pattern rules,包括内置模式规则,通过在没有配方的情况下定义它们:
%: %.c
%: %.cpp
将删除从 .c
和 .cpp
创建二进制文件的模式规则。
或者,使用足够新的 GNU make 版本,您可以通过将此添加到您的 makefile 来禁用所有内置规则:
MAKEFLAGS += -r
(-r
选项的含义见手册)