makepp: как управлять несколькими сборками с общим исходным кодом dir?
У меня есть исходное дерево:
/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
Я перепробовал много совершенно разных подходов. Это не так тривиально, как кажется на первый взгляд. Пожалуйста помоги.
1 ответ
Наконец-то мне удалось решить проблему.
Решение состоит в том, чтобы разделить проект Rootmakeppfile на два подпроекта Rootmakeppfile (оба загружают make-файл../system по-своему) и выполнить сборку отдельно для каждого подпроекта (в своем собственном каталоге сборки). Структура проекта с make-файлами:
/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
Надеюсь, это кому-то поможет!