我正在与多个架构协议工作的项目。该代码被划分成特定结构和一般模块(其可在体系结构之间共享)。
我打算组织如下面的代码
TOP
|
|---- Makefile
|
|---- src (arch independent)
|---- inc (arch independent)
|
|----arch1 (arch specific)
|---- src
|---- inc
|---- Makefile
|----arch2 (arch specific)
|---- src
|---- src
|---- Makefile
拱具体项目将在Makefile中的拱目录中进行编译。此生成的文件包括在顶层的Makefile文件。
想法是,在拱特定生成文件将具有所有的src代码从拱目录和顶层Makefile定义一个变量,它是简单的顶层目录的路径内,从而使拱的特定生成文件可以从包括代码在顶级src文件夹。
然而,包括顶层生成文件,定义的路径变量(通过壳pwd命令)时,在所述拱特定目录级别evaluuated。
我该如何解决这个问题?是他们这样做的更好的办法?
现在它是一个2级结构。但在未来,我计划顶部让它多层次与最里面级别为拱具体和层变得越来越普遍作为一个移出到顶层。
什么是你的顶层Makefile在干什么? - 我的意思是,你可以运行make就可以了独立位置?如果没有,那么你真的会从中获益是源文件和头位置的列表 - 它会更容易只指定那些在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项目组合在一起,你可以添加那些成为超级回购与它自己生成文件只是做:
make -C arch1
make -C arch2
我看到两个选项
# ./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)
事情。但也许这只是我个人的观点,把它当作一粒盐...