隐式构建规则:GNU制作多个Makefile多个目录

时间:2011-12-30 01:25:25

标签: c++ c makefile

我有以下目录结构:

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

这个项目中还有其他几个目录,但我不会为了简单而列出它们。我想要一个主makefile来驱动存储在自己目录中的其他Makefile的构建。有几个项目汇集在一起​​,所以我不能只是移动源代码。

主makefile定义为:

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

Graphic 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 $@ $<

上一篇文章(Previous Post)的回复只有在我搬了很多东西时才有帮助。我不能这样做。所以问题仍然存在,如何让make识别主Makefile中子目录中的隐式构建?

我得到的错误是

make: *** No rule to make target `release64/./Graphic/SymbolXLib/CartoCursor.o', needed by `release64/libSymbolXLib.a'.  Stop.

2 个答案:

答案 0 :(得分:3)

如果你避免include而是使用recursive make,我必须认为你会有更好的成功。在顶级Makefile中,类似于:

graphic:
    $(MAKE) -C Graphic

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

symbolxlib:
    $(MAKE) -C SymbolXLib

等等。您可能需要将每个目标添加到默认目标或类似的东西,以便在一次执行时将它们全部挂起。您可以为这些目标中的每一个提供一个实际的依赖关系(如果它们没有依赖关系,它们应该是.PHONY: ...)仅在必要时或在由{{的高级目标命令时重建它们... 1}} es“命令文件”。

或者,this paper建议采用不同的方法避免递归touch(1),但我还没有读过它 - 并且发现了递归make的工作原理在项目中,我已经参与其中,我不介意推荐它。

答案 1 :(得分:2)

this gnumake documentation会帮助你吗?

相关问题