Make: Можем ли мы оптимизировать цели создания файлов? - PullRequest
0 голосов
/ 27 февраля 2019

Мы поддерживаем 32-битную и 64-битную сборку в нашем рабочем процессе. Для этого у нас есть несколько правил в make-файлах, которые являются отдельными для 32-битной и 64-битной.Позвольте мне показать пару одинаковых правил, за исключением строки «32» и «64».

Фрагмент Makefile: -

$(TGTDIR32)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
    $(file_transfer)

$(TGTDIR64)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
    $(file_transfer)

Если вы заметили, у нас есть цели с тем же, кромедля строки «32» против «64» я хочу заменить их одним правилом / определением.Потому что у нас есть сотни правил, как указано выше в нашем коде инфраструктуры.

Есть ли в GNUmake какой-либо упрощенный способ сделать это?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Два правила семантически идентичны, они используют только другой способ ссылки на «параметризованную» цель.Почему вы не просто используете одну цель для этого

$(TGTDIR)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
    $(file_transfer)

и используете правильно настроенный TGTDIR (я подозреваю, что это будет что-то вроде "xxxx_32" против "xxxx_64")?

Вы можете достичь этого несколькими способами;один типичный будет

ifdef choose32
  TGTDIR=xxxx_32
else
  TGTDIR=xxxx_64
endif
0 голосов
/ 27 февраля 2019

По моему мнению, это подходящее место для использования рекурсивного make, по крайней мере, для сборки верхнего уровня.

В этой ситуации вы можете сделать что-то вроде этого:

TGTDIR64 = ...
TGTDIR32 = ...

.PHONY: all all32 all64 build

all: all32 all64

all32:
        $(MAKE) TGTDIR=$(TGTDIR32) build
all64:
        $(MAKE) TGTDIR=$(TGTDIR64) build

# Things below here should just use TGTDIR

build: $(TGTDIR)/b1 $(TGTDIR)/b2

$(TGTDIR)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
        $(file_transfer)

$(HEADERGEN_NOTSPLIT_H_COPY): $(TGTDIR)/%.h: %.h $(copy_file)
        ...
0 голосов
/ 27 февраля 2019

Цели, которые имеют одинаковые предпосылки и рецепт, могут быть просто объединены, например, так:

$(TGTDIR32)/logdir/set_user.c $(TGTDIR64)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
    $(file_transfer)

или, в более общем случае:

THESE_TARGETS := $(TGTDIR32)/logdir/set_user.c $(TGTDIR64)/logdir/set_user.c # More...?
...
$(THESE_TARGETS): $(CURDIR)/slv/set_user.c
    $(file_transfer)

Если Make решит, что любой член $(THESE_TARGETS) устарел относительно предварительных условий, тогда он запустит рецепт для этой цели .

Этот make-файл:

.PHONY: all clean

all: a b c

a: d e
    touch $@

b: d e
    touch $@

c: d e
    touch $@

d:
    touch $@

e:
    touch $@

clean:
    $(RM) a b c d e

эквивалентенвот это:

.PHONY: all clean

all: a b c

a b c: d e
    touch $@

d e:
    touch $@

clean:
    $(RM) a b c d e

Позже

Существуют некоторые статические правила шаблонов ...

То же самое относится.Этот make-файл со статическими шаблонными правилами:

.PHONY: default clean

default: a.k b.k

a.k: %.k: %.j
    cp -f $< $@

b.k: %.k: %.j
    cp -f $< $@

a.j:
    touch $@

b.j:
    touch $@


clean:
    $(RM) a.k b.k a.j b.j

эквивалентен этому:

.PHONY: default clean

JS := a.j b.j
KS := $(JS:.j=.k)

default: $(KS)

$(KS): %.k: %.j
    cp -f $< $@

$(JS):
    touch $@

clean:
    $(RM) $(JS) $(KS)
...