У меня есть Makefile, который условно определяет компилятор следующим образом:
CC?=$(SOMETHING)
Это необходимо, потому что файл иногда вызывается сценарием, который определяет другой компилятор. Раньше это работало нормально, но в моей новой установке Linux, когда я запускаю make, я обнаруживаю, что CC уже где-то определен как «cc», чего я не хочу. Это не в моей среде оболочки. Это похоже на то, что make имеет свою собственную частную среду. Откуда он берется и как от него избавиться (без изменения Makefile)?
COMPILER?=$(SOMETHING)
тогда CC=$(COMPILER)
Что ж, это объясняет. Теперь вопрос в том, почему это когда-либо работало в первую очередь...
cc
— это значение по умолчанию/неявное для CC
в GNU Make, см. gnu.org/software/make/manual/html_node/Implicit-Variables.html (спасибо Paul R)
Один из способов обойти это — использовать переменную посередине (спасибо Matheus):
COMPILER?=$(SOMETHING)
CC=$(COMPILER)
Также возможно подавить все неявные переменные, вызвав make like make --no-builtin-variables
, хотя это также подавляет все неявные правила.
Если вы используете GNU make и не хотите, чтобы значение CC
по умолчанию применялось, вы можете использовать функцию origin
и условное выражение ifeq
, чтобы избавиться от него:
ifeq ($(origin CC),default)
CC = $(SOMETHING)
else
CC ?= $(SOMETHING)
endif
См. Раздел Origin Function руководства GNU make для полного объяснения.
cc
— это значение по умолчанию дляCC
в GNU make: gnu.org/software/make/manual/html_node/Implicit-Variables.html (на той же странице также упоминается возможность использования-R
для избавления от эти значения по умолчанию)