我有一个源树:
/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
希望,它能帮助别人!