Відповіді:
У вас є кілька варіантів налаштування змінних поза вашим makefile:
З середовища - кожна змінна середовища перетворюється на змінну makefile з тим самим назвою та значенням.
Ви також можете встановити -e
параметр (aka --environments-override
) увімкнено, і ваші змінні середовища замінять завдання, внесені в makefile (якщо тільки ці призначення самі не використовують override
директиву . Однак це не рекомендується, і набагато краще та гнучкіше використовувати ?=
призначення (умовна змінна) Оператор присвоєння, він має ефект, лише якщо змінна ще не визначена):
FOO?=default_value_if_not_set_in_environment
Зауважте, що певні змінні не успадковуються від середовища:
MAKE
отримується від імені сценаріюSHELL
або встановлюється в makefile, або за замовчуванням /bin/sh
(обгрунтування: команди задаються в makefile, і вони специфічні для оболонки).З командного рядка - make
може приймати змінні завдання як частину його командного рядка, змішану з цілями:
make target FOO=bar
Але тоді всі присвоєння FOO
змінній в makefile будуть ігноруватися, якщо ви не використовуєте override
директиву при призначенні. (Ефект такий же, як і -e
для параметра змінних оточуючих середовищ).
Експорт з батьківського Make - якщо ви викликаєте Make з Makefile, зазвичай не слід явно писати змінні завдання, як це:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Натомість, кращим рішенням може бути експорт цих змінних. Експорт змінної перетворює її в середовище кожного виклику оболонки, і Виконувати дзвінки з цих команд вибирають ці середовища змінними, як зазначено вище.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Ви також можете експортувати всі змінні, використовуючи export
без аргументів.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
та передавання його як make -C folder $(PROJECT_MAKE_FLAGS)
. Якщо є спосіб сказати файл файлу бібліотеки ігнорувати оточення, це було б ідеально (навпроти -e).
make target FOO=bar
make FOO=bar target
?
Найпростіший спосіб:
make foo=bar target
Потім у вашому makefile ви можете посилатися $(foo)
. Зауважте, що це не поширюватиметься на підмайстри автоматично.
Якщо ви використовуєте підмайстри, перегляньте цю статтю: Повідомлення змінних підмайстру
included
в основному makefile?
З посібника :
Змінні в make можуть надходити з середовища, в якому використовується запуск. Кожна змінна середовище, яка бачить, коли вона запускається, перетворюється на змінну make з тим самим іменем та значенням. Однак явне призначення в makefile або з аргументом команди перекриває середовище.
Так ви можете зробити (з bash):
FOOBAR=1 make
що призводить до змінної FOOBAR
у вашому Makefile.
Тут не вказана інша опція, яка включена до книги GNU Make by Stallman and McGrath (див. Http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Він наводить приклад:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Він включає перевірку, чи вказаний параметр відображається в MAKEFLAGS
. Наприклад .. припустимо, що ви вивчаєте теми в c ++ 11, і ви розділили своє дослідження на кілька файлів ( class01
, ..., classNM
) і хочете: компілювати потім усі та запускати окремо або компілювати один у a час і запустіть його, якщо вказано прапор ( -r
наприклад,). Отже, ви можете придумати таке Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Маючи це, ви:
make -r class02
;make
або make all
;make -r
(припустимо, всі вони містять певний тип аргументів, і ви просто хочете перевірити їх)Якщо ви створите файл під назвою Makefile і додасте таку змінну, як ця $ (unittest), то ви зможете використовувати цю змінну всередині Makefile навіть із символами підстановки
приклад:
make unittest=*
Я використовую BOOST_TEST і, даючи підстановку для параметра --run_test = $ (unittest), тоді я зможу використовувати регулярне вираження для фільтрації тесту, я хочу, щоб мій Makefile запускався
export ROOT_DIR=<path/value>
Потім використовуйте змінну $(ROOT_DIR)
в Makefile.
make A='"as df"'