Przekazywanie dodatkowych zmiennych z wiersza poleceń do
Czy mogę przekazać zmienne do GNU Makefile jako argumenty linii poleceń? Innymi słowy, chcę przekazać kilka argumentów, które ostatecznie staną się zmiennymi w pliku Makefile.
7 answers
Masz kilka opcji, aby skonfigurować zmienne spoza makefile:
-
From environment - każda zmienna środowiskowa jest przekształcana w zmienną makefile o tej samej nazwie i wartości.
Możesz również ustawić opcję
-e
(aka--environments-override
), a twoje zmienne środowiskowe nadpiszą przypisania wykonane w pliku makefile (chyba że same te przypisania używająoverride
dyrektywa . Jednak nie jest to zalecane, a to znacznie lepsze i elastyczne użycie?=
przypisanie (operator przypisania zmiennej warunkowej, ma to wpływ tylko wtedy, gdy zmienna nie jest jeszcze zdefiniowana):FOO?=default_value_if_not_set_in_environment
Zauważ, że niektóre zmienne nie są dziedziczone ze środowiska:
- {[8] } pochodzi z nazwy skryptu
-
{[9] } jest albo ustawione w pliku makefile, albo domyślnie
/bin/sh
(uzasadnienie: polecenia są określone w pliku makefile i są specyficzne dla powłoki).
-
Od wiersz poleceń -
make
może przyjmować zmienne zadania jako część swojej linii poleceń, zmieszane z celami:make target FOO=bar
Ale wtedy wszystkie przypisania do zmiennej
FOO
w pliku makefile będą ignorowane , chyba że użyjeszoverride
dyrektywa {[26] } w przypisaniu. (Efekt jest taki sam jak w przypadku opcji-e
dla zmiennych środowiskowych). -
Eksportowanie z rodzica Make - jeśli wywołujesz Make z pliku Makefile, zwykle nie powinieneś jawnie Zapisz przypisania zmiennych w następujący sposób:
# Don't do this! target: $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Zamiast tego lepszym rozwiązaniem może być eksport tych zmiennych. Eksportowanie zmiennej powoduje, że jest ona wprowadzana do środowiska każdego wywołania powłoki, a wywołania z tych poleceń wybierają tę zmienną środowiskową, jak opisano powyżej.
# Do like this CFLAGS=-g export CFLAGS target: $(MAKE) -C target
Możesz również wyeksportować wszystkie zmienne używając
export
bez argumentów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 21:44:01
Najprostszy sposób to:
make foo=bar target
Następnie w pliku makefile możesz odnieść się do $(foo)
. Zauważ, że nie będzie to automatycznie propagowane do sub-make.
Jeśli używasz pod-Marki, zobacz ten artykuł: przekazywanie zmiennych do Pod-marki
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 10:55:40
Powiedzmy, że masz taki makefile:
action:
echo argument is $(argument)
Nazwałbyś to make action argument=something
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 10:38:10
Zmienne w make mogą pochodzić ze środowiska, w którym make jest uruchamiany. Każda zmienna środowiskowa make widzi po uruchomieniu jest przekształcana w zmienną make o tej samej nazwie i wartości. Jednak jawne przypisanie w pliku makefile lub z argumentem polecenia nadpisuje środowisko.
Więc możesz zrobić (z Basha):
FOOBAR=1 make
Dając zmienną FOOBAR
w Twoim pliku Makefile.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 10:38:17
export ROOT_DIR=<path/value>
Następnie użyj zmiennej $(ROOT_DIR)
w pliku Makefile.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 16:03:31
Jeśli utworzysz plik o nazwie Makefile i dodasz zmienną taką jak $(unittest) wtedy będziesz mógł użyć tej zmiennej wewnątrz pliku Makefile nawet z symbolami wieloznacznymi
Przykład:
make unittest=*
Używam BOOST_TEST i przez podanie wildcard do parametru -- run_test=$(unittest) wtedy będę mógł użyć wyrażenia regularnego, aby odfiltrować test, który chcę mój plik Makefile to run
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-08 13:29:37
Jest jeszcze jedna opcja nie cytowana tutaj, która jest zawarta w książce GNU Make autorstwa Stallmana i McGratha (zobacz http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). podaje przykład:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Polega na sprawdzeniu, czy dany parametr pojawia się w MAKEFLAGS
. Na przykład .. Załóżmy, że studiujesz na temat wątków w c++11 i podzieliłeś swoje badanie na wiele plików (class01
,... , classNM
) i chcesz: skompilować następnie wszystkie i uruchomić pojedynczo lub skompiluj po kolei i uruchom je, jeśli podano flagę (na przykład-r
). Możesz więc wymyślić następujące Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./[email protected]
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Mając to, byś:
- budowanie i uruchamianie pliku w/
make -r class02
; - build all w /
make
ormake all
; - Zbuduj i uruchom wszystkie w/
make -r
(Załóżmy, że wszystkie zawierają pewne pewne rzeczy assert i po prostu chcesz je przetestować)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 02:53:20