makepp:如何使用公共源代码管理多个构建?

时间:2014-11-12 05:36:34

标签: c build out-of-source makepp

我有一个源树:

/bootloader
/firmware
/system

并且希望为 firmware bootloader 管理两个单独的版本,每个版本都使用常见的系统,但编译方式不同(即有自己的一组选项)。

构建必须 out-of-tree 。 makepp明显的“存储库”功能在这里不是解决方案,因为它打破了这个原则。符号链接也不是解决方案,因为它必须在Windows上运行。

问题实际上在共享的系统源中,其相对路径结构与其他路径结构不同,导致常见的模式规则不适用于它们:

BUILD_PATH = $(relative_to $(PROJECT_PATH), .)/BUILD/$(relative_to ., $(PROJECT_PATH)) # trick to be able to extend rules for specific files at different subtree levels (if we use Makeppfile for each level)
...
$(BUILD_PATH)/%.o : %.c
    ...

使用单个RootMakeppfile进行处理并包含* .mk文件(而不是加载它们)也不允许我这样做:

$(BUILD_ROOT_PATH)/*/%.o : %.c

我尝试了很多完全不同的方法。它并不是那么微不足道,因为它似乎乍一看。请帮忙。

1 个答案:

答案 0 :(得分:0)

我终于设法解决了问题。

解决方案是将Rootmakeppfile项目划分为两个Rootmakeppfile子项目(以自己的方式加载 ../ system makeppfile),并为每个子项目(在其自己的构建目录中)单独执行构建。带有makefile的项目结构:

/bootloader/
  ...
  BUILD/
  Rootmakeppfile
/firmware/
  ...
  BUILD/
  Rootmakeppfile
/system/
  ...
  Makeppfile
/project.mk

通用定义.mk文件应包含以下行:

BUILD_ROOT_DIR = $(relative_to $(SUBPROJECT_PATH), .)/BUILD
BUILD_OBJ_REL_PATH = $(BUILD_ROOT_DIR)/$(relative_to ., $(BUILD_OBJ_REL_DIR))
BUILD_OBJ_REL_DIR ?= $(SUBPROJECT_PATH)

每个子项目应包括 system ,如下所示:

load_makefile BUILD_OBJ_REL_DIR="$(SUBPROJECT_PATH)/.." ../system

并定义:

global SUBPROJECT_PATH := $(abspath .)

这种方法可以定义模式规则如下:

$(BUILD_OBJ_REL_PATH)/%.o : %.c

希望,它有助于某人!