在嵌套目录中使用Makefile

时间:2019-02-07 07:21:24

标签: makefile gnu-make

我正在从事的项目涉及多种架构。该代码分为特定于体系结构的模块和通用模块(可以在各个体系结构之间共享)。

我计划组织如下代码

TOP
|
|---- Makefile
|
|---- src (arch independent)
|---- inc (arch independent)
|
|----arch1 (arch specific)
     |---- src 
     |---- inc 
     |---- Makefile
|----arch2 (arch specific)
     |---- src
     |---- src
     |---- Makefile

特定于arch的项目将由arch目录中的Makefile编译。此makefile包括TOP级的Makefile。

这个想法是,在特定于arch的Makefile中,将拥有arch目录中的所有src代码,并且顶层Makefile定义了一个变量,该变量只是TOP级别目录的路径,因此特定于Arch的Makefile可以包含顶层src文件夹中的代码。

但是,当包含顶层Makefile时,已定义的路径变量(通过shell pwd命令)在arch特定目录级别进行评估。

我该如何解决?他们是这样做的更好方法吗?

现在它是2级结构。但是将来我计划将顶层设置为多层,最内层是特定于拱形的,随着一层移到顶层,这些层将变得越来越普遍。

2 个答案:

答案 0 :(得分:1)

您的顶级makefile在做什么? -我的意思是,您可以独立运行它吗?如果不是这样,那么您真正能从中获得的仅仅是源文件和标头位置的列表-仅在common_make.mk或仅包含以下内容的东西中指定这些内容会更容易:

SOURCES += ../src/test1.c
SOURCES += ../src/test2.c
SOURCES += ../src/test3.c
INC += ../inc

然后,您的两个较低级别的文件都包含了这个非常基本的makefile“片段”,您不必担心路径。

通常,我将公共元素放入单独的配置控制的存储库中,而我的项目则相反:

arch1/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 

arch2/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 

所以在这里,我有两个单独的仓库,一个共享子仓库。如果要将两个archx项目绑定在一起,则可以将它们添加到具有自己的makefile的超级存储库中,该文件可以执行以下操作:

make -C arch1
make -C arch2

答案 1 :(得分:0)

我为您提供了两种选择

archX /目录的通用makefile模板

# ./Makefile.template
ARCH_DIR        := $(PWD)
TOP_DIR         := $(ARCH_DIR)/..
BUILD_DIR       := $(TOP_DIR)/build

# non-architecture specific source code
NOARCH_SRC_DIR  := $(TOP_DIR)/src
NOARCH_INC_DIR  := $(TOP_DIR)/inc

# non-architecture specific source code
ARCH_SRC_DIR    := $(ARCH_DIR)/src
ARCH_INC_DIR    := $(ARCH_DIR)/inc

# other stuff...
CFLAGS          := -I$(ARCH_INC_DIR) -I$(NOARCH_INC_DIR)

# directory specific variables, e.g. XXX_SRCS
include $(NOARCH_SRC_DIR)/Makefile.include
include $(ARCH_SRC_DIR)/Makefile.include

# generate object file lists
NOARCH_OBJS     := $(NOARCH_SRCS:%.c=$(BUILD_DIR)/%.o)
ARCH_OBJS       := $(ARCH_SRCS:%.c=$(BUILD_DIR)/%.o)

# add paths to source files
NOARCH_SRCS     := $(addprefix $(NOARCH_SRC_DIR)/, $(NOARCH_SRC_DIR))
ARCH_SRCS       := $(addprefix $(ARCH_SRC_DIR)/,   $(ARCH_SRC_DIR))

# target-specific pattern rules for C files
$(NOARCH_OBJS): %.o: $(NOARCH_SRC_DIR)/%.c | $(BUILD_DIR)
      $(CC) $(CFLAGS) -o $@ -c $<

$(ARCH_OBJS): %.o: $(ARCH_SRC_DIR)/%.c | $(BUILD_DIR)
      $(CC) $(CFLAGS) -o $@ -c $<

... and so ...

ArchX /目录makefile

# archX/Makefile
# common stuff
include $(PWD)/../Makefile.template

# arch specific targets follow here...

现在您已经可以使用来运行构建

 $ make -C arch1

顶级目录Makefile

 # ./Makefile
 ifndef ARCH
 $(error you must specifiy ARCH=)
 endif

 # forward all targets to arch directory
 %:
      $(MAKE) -C $(ARCH) $(MAKECMDGOAL)

现在您可以使用来运行构建

 $ make ARCH=arch1

我个人根本不会编写顶层makefile,而只使用前一种方法。


恕我直言,您应该避免使用$(shell)之类的东西。但这也许只是我个人的看法,再加一点盐...