我正在从事的项目涉及多种架构。该代码分为特定于体系结构的模块和通用模块(可以在各个体系结构之间共享)。
我计划组织如下代码
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级结构。但是将来我计划将顶层设置为多层,最内层是特定于拱形的,随着一层移到顶层,这些层将变得越来越普遍。
答案 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)
我为您提供了两种选择
# ./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
# common stuff
include $(PWD)/../Makefile.template
# arch specific targets follow here...
现在您已经可以使用来运行构建
$ make -C arch1
# ./Makefile
ifndef ARCH
$(error you must specifiy ARCH=)
endif
# forward all targets to arch directory
%:
$(MAKE) -C $(ARCH) $(MAKECMDGOAL)
现在您可以使用来运行构建
$ make ARCH=arch1
我个人根本不会编写顶层makefile,而只使用前一种方法。
恕我直言,您应该避免使用$(shell)
之类的东西。但这也许只是我个人的看法,再加一点盐...