1

我有一个源代码树:

/bootloader
/firmware
/system

并希望为固件引导加载程序管理两个单独的构建,每个构建都使用通用系统,但编译方式不同(即使用自己的一组选项)。

构建必须是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

我尝试了很多完全不同的方法。这并不像乍一看那样微不足道。请帮忙。

4

1 回答 1

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)

每个子项目应包括以下系统

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

并定义:

global SUBPROJECT_PATH := $(abspath .)

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

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

希望,它可以帮助某人!

于 2014-11-13T11:55:09.527 回答