Я решил это с помощью препроцессора C cpp
.
Мои сценарии компоновщика содержат «переменные», которые можно «заполнить» из Makefile, вызывая cpp
для фактических значений:
LDCSRC=script.lk.in
LDCDILE=script.lk
$(LDCFILE): $(LDCSRC)
$(Q)echo CPP $<
$(Q)$(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $$< -o $$@
сам скрипт компоновщика может быть затем «усилен» с помощью макросов cpp
:
#ifdef COMPILE_RAM
#define ROMFLAGS WX
#else
#define ROMFLAGS RX
#endif /* COMPILE_RAM */
MEMORY
{
_rom (ROMFLAGS) : ORIGIN = TARGET_ADDRESS, LENGTH = 0x00100000
В этом примере скрипт компоновщика даже #include
sa заголовочный файл C (не показан)) определить TARGET_ADDRESS
, чтобы убедиться, что у нас одинаковое определение в коде и в скрипте компоновщика.Вам просто нужно убедиться, что этот * .h файл не содержит операторов, которые мешают компоновщику (должен содержать только определения препроцессора).