隐式构建规则:GNU Make Multiple Makefiles Multiple Directories

Implicit Build Rules: GNU Make Multiple Makefiles Multiple Directories

本文关键字:Multiple Make Makefiles Directories GNU 构建 规则      更新时间:2023-10-16

我有以下目录结构:

.
..
./Graphic/
./Graphic/SymbolXLib

在这个项目中还有其他几个目录,但为了简单起见,我不会列出它们。我想要一个主要的makefile,它驱动存储在自己目录中的其他makefile的构建。有几个项目同时进行,所以我不能随便移动源代码。

主makefile定义为:

[mehoggan@hogganz400 Core]$ cat ./Makefile 
CORE_LIBS_DIR = libs
OBJS_DIR = obj/symb_obj
include ./Graphic/SymbolXLib/Makefile

图形生成文件定义为:

#
# make BUILD_MODE={release|debug} OS_ARCH={32|64}
# 
# default is 32-bit release build
#
BUILD_MODE = release
OS_ARCH = 64
OBJS_DIR = $(BUILD_MODE)$(OS_ARCH)
SRC = 
  ./Graphic/SymbolXLib/CartoCursor.cpp 
  ...
  ./Graphic/SymbolXLib/TextureConversion.cpp 
  $(NULL)
CC = gcc -fPIC
OBJS = $(SRC:%.cpp=$(OBJS_DIR)/%.o)
COPTS = -m$(OS_ARCH) -O2
CDEFS = -DLINUXx86 
        -I../../../SharedArcGIS/Include/GraphicsPipeline/Display/SymbolX/SymbolXLib 
        -I../../../SharedArcGIS/Include/System/Geometry/GeometryXLib 
        -I../../../ArcSDE/pe/include 
        -I../../../ArcSDE/shape/include
CFLAGS = $(COPTS) $(CDEFS) $(CINCS)
TARGET = libSymbolXLib.a
all : $(OBJS_DIR) $(OBJS_DIR)/$(TARGET)
$(OBJS_DIR) : 
        mkdir -p $(OBJS_DIR) 
$(OBJS_DIR)/$(TARGET) : $(OBJS)
        ar qc $@ $^
$(OBJS_DIR)/%.o : %.cpp
        $(CC) -c $(CFLAGS) -o $@ $<

上一篇文章的回应只有在我移动了很多东西的时候才有帮助。我做不到。所以问题仍然存在,我如何让make从主Makefile识别子目录中的隐式构建?

我得到的错误是
make: *** No rule to make target `release64/./Graphic/SymbolXLib/CartoCursor.o', needed by `release64/libSymbolXLib.a'.  Stop.

我不得不认为,如果你避免使用include而使用递归make,你会取得更大的成功。在顶级Makefile中,类似于:

graphic:
    $(MAKE) -C Graphic

Graphic/Makefile中的Makefile可以有子项目:

symbolxlib:
    $(MAKE) -C SymbolXLib

等等。您可能需要将每个目标添加到默认目标或类似的东西中,以便在一次执行中将它们全部挂在一起。您可以为每个目标指定一个实际的依赖项(如果它们没有依赖项,它们应该是.PHONY:…),以便仅在必要时或由touch(1)称为"命令文件"的上层目标命令时重新构建它们。

或者,这篇论文推荐了一种不同的方法来避免递归make,但是我还没有读过它——并且发现递归make在我参与的项目中工作得很好,所以我不介意推荐它。

这个gnumake文档对你有帮助吗?