是否有一种方法可以根据如下建议的ifeq
测试结果有条件地包含子Makefile。
CC = g++
CENTOS_VERSION := $(shell rpm -E %{rhel})
TARGET = main
$(TARGET): $(TARGET).cpp
ifeq ($(CENTOS_VERSION),6)
@echo "Building on CentOS 6"
include(CentOS6_Makefile.mk)
else
@echo "Building on CentOS 7"
include(CentOS7_Makefile.mk)
endif
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).cpp
这不起作用并生成错误消息
Building on CentOS 6
include(CentOS6_Makefile.mk)
/bin/sh: -c: line 0: syntax error near unexpected token `CentOS6_Makefile.mk'
/bin/sh: -c: line 0: `include(CentOS6_Makefile.mk)'
make: *** [main] Error 1
根据@MadScientist的回答,我的问题的解决方案可以归结为2行
CENTOS_VERSION := $(shell rpm -E %{rhel})
include CentOS$(CENTOS_VERSION)_Makefile.mk
答案 0 :(得分:1)
您的问题与ifeq
无关;如果您删除ifeq
并始终包含一个或另一个,则会遇到相同的问题。
首先,您包含文件的语法错误。在make的include
指令中,文件名没有括号。应该是:
include CentOS6_Makefile.mk
第二,您不能将include
之类的makefile处理器命令用作配方的一部分(即由TAB缩进)。在make配方中,所有由TAB缩进的行都作为运行目标的命令传递给Shell,make不会解释它们(扩展宏除外)。另外,您不能在配方中间包含其他一些makefile:一旦make开始包含新的makefile,而该新makefile在当前正在定义的任何配方的结尾。
您可以这样做:
CENTOS_VERSION := $(shell rpm -E %{rhel})
ifneq ($(CENTOS_VERSION),6)
CENTOS_VERSION := 7
endif
include CentOS$(CENTOS_VERSION)_Makefile.mk
$(TARGET): $(TARGET).cpp
@echo "Building on CentOS $(CENTOS_VERSION)"
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).cpp