首页 > 解决方案 > 根据目标修改makefile中的INCS?

问题描述

我有一个生成文件,我想在其中创建一个新目标。现在基本上用于新目标的第三方库版本将是升级版本。我们想为专门使用升级版本的应用程序创建一个新目标。因此,到目前为止,有许多不同的应用程序编译成一个二进制文件(可能不是一件好事,在历史上已经完成)使用该第三方库的旧版本。我们不想制作多个 GNUmakefile,所以我们正在考虑添加和构建一个新目标。但是我们有类似 INCS 的东西,它告诉编译 c++ 代码时要包含哪些所有文件夹。现在到目前为止,我们已经包含了旧版本的第三方库。如果我的目标不同,INCS 中是否有条件语句包含最新的第三方文件夹?

INCS += \
        -I${DEP_PATH}/3rdPartyLib-1.0/include \
        -I${DEP_PATH}/3rdPartyLib-2.0/include \
        -I${DEP_PATH}/Util/include \

all: Application1${EXEEXT}
     ${EXETOOL} ${CCC} ${CCFLAGS} -o $@ $? $(LIBS)

app2: Application2${EXEEXT}
      ${EXETOOL} ${CCC} ${CCFLAGS} -o $@ $? $(LIBS)

当我们让 app2 使用 3rdPartyLib-2.0 而让所有使用 3rdPartyLib-1.0 时?

谢谢

标签: c++makefilegnu-make

解决方案


当然。您可以使用特定于目标的变量分配,它将为目标设置并向下传播到所有依赖项。考虑以下内容Makefile

DEP_PATH := dep

INCS += \
        -I$(DEP_PATH)/Util/include

all: INCS += -I$(DEP_PATH)/3rdPartyLib-1.0/include
all: Application1$(EXEEXT)

app2: INCS += -I$(DEP_PATH)/3rdPartyLib-2.0/include
app2: Application2$(EXEEXT)

all app2:
        echo Making $@ with INCS = $(INCS)

Application1$(EXEEXT) Application2$(EXEEXT):
        echo Making $@ with INCS = $(INCS)

输出:

$ make -s all app2
Making Application1 with INCS = -Idep/Util/include -Idep/3rdPartyLib-1.0/include
Making all with INCS = -Idep/Util/include -Idep/3rdPartyLib-1.0/include
Making Application2 with INCS = -Idep/Util/include -Idep/3rdPartyLib-2.0/include
Making app2 with INCS = -Idep/Util/include -Idep/3rdPartyLib-2.0/include

请注意如何使用不同的包含all以及app2如何将其传播到...$(EXEEXT)目标。


推荐阅读