Альтернатива вторичному расширению в make-файле для GNU make 3.79.1 - PullRequest
1 голос
/ 22 февраля 2011

Я работал над make-файлом, который использует вторичное расширение, не зная, что эта функция существует только с версии 3.81 GNU make .К сожалению, здесь есть несколько старых машин, на которых установлена ​​только версия 3.79.1, и на этих машинах, конечно, не работает make-файл.Есть ли альтернатива вторичному расширению?

Правило для программы на C ++, где я ее использую, выглядит следующим образом:

.SECONDEXPANSION:

# Pattern rule for linking
%_$(SYSTEM) : $$(%_ofiles) $(EXEC)/%_$(SYSTEM).o
    $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)

# Example for an ofiles variable
prog1_ofiles = $(C1) $(C2)

C1 = $(OFILES)/C1.o

C2 = $(OFILES)/C2.o

Я знаю - лучшее решение - установить текущуюсделать версию.Но наш системный администратор не был в восторге от этого;) Поэтому я с нетерпением жду ваших предложений.

Кстати, кто-нибудь знает, где взять документацию по GNU make 3.79.1 - я не смог ее найтив любом месте.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

Просто добавьте make-3.81 источников в ваше дерево исходников.Ваш основной Makefile должен сначала скомпилировать make-3.81, используя любую доступную make, а затем использовать make-3.81 для компиляции всего остального.

1 голос
/ 22 февраля 2011

Нет $(eval) ?, ба!Вам нужно будет написать какую-нибудь оболочку, чтобы сгенерировать определенный синтаксис make в file.mk (скажем), а затем include в Makefile.Вы запускаете процесс, говоря make, что Makefile зависит от file.mk.Make first должен обновить Makefile до .Таким образом, он создаст file.mk, включит его и перезапустит сам.

В вашем случае это выглядит так: file.mk будет просто содержать зависимости и никаких рецептов.Краткий очерк:

%_${SYSTEM}: ${EXEC}/%_${SYSTEM}.o
    $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)

file.mk:
    echo '%_${SYSTEM}: ${prog1_ofiles}' >$@

Makefile: file.mk

include file.mk
1 голос
/ 22 февраля 2011

А как насчет функции / макроса? Использование eval даст тот же результат, что и вторичное расширение. Конечно, не так чисто, но менее типично, чем все явные правила.

define PROGRAM_template
$(1)_$(SYSTEM) : $$($(1)_ofiles) $(EXEC)/$(1)_$(SYSTEM).o
       $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
endef

$(foreach target, prog1 prog2 prog3, \
    $(eval $(call PROGRAM_template, $(target)))

Может быть, вы можете обернуть $$ (% _ ofiles) eval в свой исходный код и опустить foreach. Не уверен ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...