我有一个源树:
/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
我尝试了很多完全不同的方法。它并不是那么微不足道,因为它似乎乍一看。请帮忙。
答案 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
希望,它有助于某人!