Возможно ли переопределить глобальную переменную в целевой переменной в make? - PullRequest
2 голосов
/ 06 ноября 2011

Рассмотрим следующий make-файл:

# various settings, lots of them
# (supposed to be in defaults.mk)
option1="glob_val1"
option2="glob_val2"
#option3="glob_val3" # uncomment and it will override target-specific in sub-make
option4="glob_val4"

# goal is to make many items with various options
# which share common setup, but change in details.
all: item1 item2

# Item 1 is common + changed option3
item1: export option3="i1_val3"
item1:
    @echo "start item1:option3=$(option3)"
    $(MAKE) generic_item
    @echo "done item1"

# Item 2 is common + another option3
item2: export option3="i2_val3"
item2:
    @echo "start item2: option3=$(option3)"
    $(MAKE) generic_item
    @echo "done item2"

# This is generic item that does everything
# basing on options settings
generic_item:
    @echo "do generic option3=$(option3) [expecting i<X>_val3 here]"

Я хочу переопределить любой из параметров в target и затем вызовите универсальную подпрограмму в 'generic_item'.

Проблема в том, что если опция 3 определена поверх файла Makefile, оно передается без изменений в суб-марку. Если опция 3 сверху прокомментирована тогда все работает как положено:

start item1:option3=i1_val3
make generic_item
make[1]: Entering directory `/tmp/make_items'
do generic option3=i1_val3 [expecting i<X>_val3 here]
make[1]: Leaving directory `/tmp/make_items'
done item1
start item2: option3=i2_val3
make generic_item
make[1]: Entering directory `/tmp/make_items'
do generic option3=i2_val3 [expecting i<X>_val3 here]
make[1]: Leaving directory `/tmp/make_items'
done item2

Я не хочу использовать $ (MAKE) option1 = ... option2 = ... generic_item синтаксис, так как он не выглядит хорошо, и может быть много вариантов с длинными значениями, и все это войдет в журнал и не выглядит хорошо.

Цель состоит в том, чтобы иметь одну общую цель, которая делает вещи, основываясь на ценностях опций (их много) и возможность расширять их дополнительными цели, которые должны только переопределить определенные значения / добавить новые действия и оставь покой общей цели.

Пожалуйста, предложите другой подход, если я выгляжу неправильно.

1 Ответ

0 голосов
/ 06 ноября 2011

Основным исправлением является добавление -e к субмаху

Я предлагаю ряд улучшений. Руководство по GNU Make - это клад для такого продвинутого скриптинга.

Обратите внимание, что при подходе, показанном ниже, субмака вряд ли необходима. Я делаю субмаке только когда

  • Мне нужно перезагрузить основной Makefile из-за измененных включений (я считаю, что дизайн пахнет и стараюсь его избегать)
  • Я хочу разделить работу по субмейкам

Для вашего удобства я придерживался вашего подхода к submake, чтобы показать вам, что это можно сделать:

export option="glob_val"

.SECONDEXPANSION: # http://www.gnu.org/s/hello/manual/make/Secondary-Expansion.html

TARGETS=item1 item2 item3 item4 item5

all: $(TARGETS)

$(TARGETS): option="$(@)_val"
$(TARGETS):
    @echo "start $@:option=$(option)"
    $(MAKE) -e generic_item
    @echo "done $@"

generic_item:
    @echo "do generic option=$(option)"

Выход make -s

start item1:option=item1_val
start item2:option=item2_val
start item3:option=item3_val
start item4:option=item4_val
start item5:option=item5_val
do generic option=item1_val
do generic option=item2_val
done item1
do generic option=item4_val
done item2
do generic option=item3_val
done item4
do generic option=item5_val
done item5
done item3
...