扩展一个简单的makefile以支持不同的隐式编译器标志

Extending a simple makefile to support different implicit compiler flags

本文关键字:支持 标志 编译器 makefile 简单 一个 扩展      更新时间:2023-10-16

我一直在使用一个非常简单的makefile。我用.cc文件列表定义了OBJS。我设置了依赖项和include标志,并将所有这些附加到$CXXFLAGS中。它看起来像这样:

SRCS = file1.cc file2.cc file3.cc
OBJS = $(SRCS:.cc=.o)
CXXFLAGS=some flags
CXXFLAGS+=some include dirs
$(mylib.so): $OBJS
$CXX -shared -o $@ $^

mylib.so(隐式)使用CXXFLAGS,一切构建都很好。

除了mylib.so之外,我最近还需要mylib_1.so和mylib_2.so。每个.so都依赖于所有相同的.cc文件,但编译器标志都不同(包括目录)。

我该如何获得它,以便根据目标设置编译器标志。所以?我遇到的问题是,如果我多次设置CXXFLAGS,它就会被覆盖。我几乎需要一个if/else的情况。

我试着设置三个不同的标志,$CXXFLAGS1、$CXFLAGS2和$CXFLAgs3,并在行中使用它们

$(mylib1.so): $OBJS
$CXX $(CXXFLAGS1) -shared -o $@ $^

但这并不奏效。

我该如何完成我想要做的事情?有3个单独的makefile更好吗?我确实找到了让它发挥作用的方法。我可以停止使用$OBJS,并明确地为每个源文件拼写标志,但就按大小缩放而言,这似乎是一个可怕的想法。

您的示例中的CXXFLAGS1仅在创建.so文件的阶段使用,而不是用于编译实际的C++源代码(我认为这是您正在尝试做的)。

要实现上述目标,请考虑让Makefile为3个不同的目标调用自己3次,并将CXXFLAGS(具有不同的值)作为MAKEFLAGS的一部分或在命令行中传递。

更新:这里有一个示例

all:build-lib1 build-lib2 build-lib3build-lib1:$(MAKE)$(MAKEFLAGS)CXXFLAGS="$(CXXFLAGS1)"lib1.sobuild-lib2:$(MAKE)$(MAKEFLAGS)CXXFLAGS="$(CXXFLAGS2)"lib2.sobuild-lib3:$(MAKE)$(MAKEFLAGS)CXXFLAGS="$(CXXFLAGS3)"lib3.so$(lib1.so):$OBJS$(CXX)-共享-o$@$^等等。

Makefile可以具有特定于目标的变量值。类似于:

$(mylib1.so): CXXFLAGS += -lib1flags
$(mylib2.so): CXXFLAGS += -lib2flags
$(mylib3.so): CXXFLAGS += -lib3flags

根据文档,标志将传播到先决条件目标。

目标特定变量还有一个特殊功能:当定义一个特定于目标的变量,该变量值也在该目标的所有先决条件及其所有先决条件等(除非这些先决条件覆盖了该变量具有它们自己的目标特定变量值)。例如声明如下:

prog : CFLAGS = -g
prog : prog.o foo.o bar.o

将在prog的配方中将CFLAGS设置为"-g",但它也将CFLAGS到创建prog.o、foo.o和bar.o的食谱中的"-g",以及任何创造其先决条件的食谱。

我将使用递归调用来完成此操作。我会使用两个makefile:

Makefile:中

all:mylib1.so mylib2.soSRCS:=文件1.cc文件2.cc文件3.ccmylib1.so:$(SRCS)test-d mylib1||mkdir mylib1$(MAKE)-f/lib.mak-C mylib1 TARGET=mylib1.so CXXFLAGS=-DMYLIB=1cp mylib1/mylib1.so mylib1.somylib2.so:$(SRCS)test-d mylib2||mkdir mylib2$(MAKE)-f/lib.mak-C mylib2 TARGET=mylib2.so CXXFLAGS=-DMYLIB=2cp mylib2/mylib2.so mylib2.so

lib.mak中,在同一目录中:

VPATH=。。SRCS:=文件1.cc文件2.cc文件3.ccOBJS:=$(SRCS:.cc=.o)$(目标):$(对象)$(CXX)-shared-o$@$^

第二个makefile实际上构建了库,但只使用了一组CXXFLAGS。主makefile使用单独的CXXFLAGS并在单独的目录中为每个版本调用第一个makefile。VPATH使编译不在同一目录中的源文件变得更容易。

我用试运行测试了这个设置

test-d mylib1||mkdir mylib1make-f/lib.mak-C mylib1 TARGET=mylib1.so CXXFLAGS=-DMYLIB=1make[1]:正在进入目录`/home/dep/Maketest2/mylib1'g++-DMYLIB=1-c-o文件1.o../文件1.ccg++-DMYLIB=1-c-o文件2.o../文件2.ccg++-DMYLIB=1-c-o文件3.o…/file3.ccg++-共享-o mylib1.so文件1.o文件2.o文件3.omake[1]:正在离开目录`/home/dep/Maketest2/mylib1'cp mylib1/mylib1.so mylib1.sotest-d mylib2||mkdir mylib2make-f/lib.mak-C mylib2 TARGET=mylib2.so CXXFLAGS=-DMYLIB=2make[1]:正在进入目录`/home/dep/Maketest2/mylib2'g++-DMYLIB=2-c-o文件1.o../文件1.ccg++-DMYLIB=2-c-o文件2.o../文件2.ccg++-DMYLIB=2-c-o文件3.o…/file3.ccg++-共享-o mylib2.so文件1.o文件2.o文件3.omake[1]:正在离开目录`/home/dep/Maketest2/mylib2'cp mylib2/mylib2.so mylib2.so