c-makepp:如何使用公共源目录管理多个构建



我有一个源树:

/bootloader
/firmware
/system

并且希望管理固件引导程序的两个独立构建,它们都使用公共系统,但编译方式不同(即使用自己的一组选项)。

生成必须在树之外。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

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

我终于设法解决了这个问题。

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

/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

希望,它能帮助别人!

相关内容

  • 没有找到相关文章

最新更新