Предотвратить перезапись переменных в Makefiles? - PullRequest
1 голос
/ 19 января 2011

Я изучаю Makefiles и кросс-компиляцию приложений, и я хотел бы найти способ предотвратить переопределение переменных в Makefiles дальше по цепочке.

В качестве примера я пишу Makefile верхнего уровня /usr/src/someapp.mk, который будет ...

1) загрузить исходный код приложения из Интернета в /usr/src/someapp-1.2.3/

2) разархивировать источник и

3) запустите свой оригинальный /usr/src/someapp-1.2.3/Makefile

Поскольку исходный Makefile был написан как автономный скрипт, он будет неизвестным образом (пере) определять обычных подозреваемых (CC, AR / RANLIB и т. Д.) Локальными значениями, эффективно стирая значение, которое я выбрал в верхнем Makefile уровня:

#My top-level /usr/src/someapp.mk:
all:
    wget someapp-1.2.3.tar.gz
    tar xzvf someapp-1.2.3.tar.gz
    cd someapp-1.2.3 && $(MAKE)

#Original Makefile from www /usr/src/someapp-1.2.3/Makefile:
#RANLIB locally redefined... :-/
RANLIB=ranlib

all:
    $(RANLIB)...

Я бы хотел, чтобы пользователи могли загружать исходный исходный код вместо предоставления моей собственной измененной версии: есть ли способ заставить "make" игнорировать локальные переопределения переменных или переписывать их на лету?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Оператор ?= будет определять переменную, только если она не установлена.

VAR ?= value

Безусловно, самый полезный способ - определить переменные в командной строке make. Такие переменные становятся доступными только для чтения на время создания.

$ cat Makefile
VAR := hello
$(error [${VAR}])

тогда

$ make
Makefile:2: *** [hello].  Stop.

но

$ make VAR='value overridden'
Makefile:2: *** [value overridden].  Stop.

Это говорит о том, что ваш фрагмент cd someapp-1.2.3 && $(MAKE) становится $(MAKE) -C someapp-1.2.3 RANLIB=myval.

1 голос
/ 19 января 2011

Переменные, передаваемые через командную строку make, переопределяют присвоения make-файла.http://www.gnu.org/software/make/manual/make.html#Override-Directive

Вызовите этот сторонний make-файл следующим образом:

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