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

Надеюсь, это кому-то поможет!

Другие вопросы по тегам