基于ifeq测试的条件包含子Makefile

时间:2019-07-11 12:17:59

标签: makefile include conditional-statements

是否有一种方法可以根据如下建议的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

1 个答案:

答案 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