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.

Author: pillravi, 2010-05-13

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żyjesz override 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.

 543
Author: P Shved,
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

 138
Author: Mark Byers,
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

 44
Author: nc3b,
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

Z instrukcji :

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.

 16
Author: Thomas,
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.

 3
Author: parasrish,
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

 2
Author: serup,
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 or make all;
  • Zbuduj i uruchom wszystkie w/ make -r (Załóżmy, że wszystkie zawierają pewne pewne rzeczy assert i po prostu chcesz je przetestować)
 1
Author: Ciro Costa,
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