Předávání dalších proměnných z příkazové řádky, aby se

hlasů
408

Mohu předat proměnné do GNU Makefile jako argumenty příkazového řádku? Jinými slovy, chci předat některé argumenty, které se nakonec stane proměnné v Makefile.

Položena 13/05/2010 v 11:31
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
507

Máte několik možností, jak nastavit proměnné zvenčí makefile:

  • Z prostředí - každá proměnná prostředí je transformován do Makefile proměnné se stejným názvem a hodnotou.

    Můžete také nastavit -emožnost (aka --environments-override) na a vaše proměnné prostředí přepíše úkoly provedené do makefile (není-li těchto úkolů sami používat overridesměrnici . Nicméně, to není doporučeno, a to je mnohem lepší a flexibilnější použít ?=přiřazení (podmíněné proměnné operátor přiřazení, to má vliv pouze v případě, že proměnná není dosud stanovena):

    FOO?=default_value_if_not_set_in_environment
    

    Všimněte si, že některé proměnné se nedědí z prostředí:

    • MAKE se dostal z názvu skriptu
    • SHELLje buď nastaven v rámci makefile nebo implicitní hodnota /bin/sh(zdůvodnění: příkazy jsou specifikovány v rámci makefile, a oni jsou shell specifický).
  • Z příkazové řádky - makemůže mít variabilní úkoly jako součást jeho příkazového řádku, mísil s cíli:

    make target FOO=bar
    

    Ale pak všechna přiřazení do FOOproměnné v rámci makefile budou ignorovány , pokud použijete overridedirektivu v zadání. (Tento efekt je stejný jako u -eopcí na proměnné prostředí).

  • Exportu z mateřské značky - pokud zavoláte Udělat z Makefile, obvykle neměli výslovně psát variabilní úkoly, jako je tento:

    # Don't do this!
    target:
            $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
    

    Místo toho, lepším řešením by mohlo být pro export těchto proměnných. Export proměnné dělá to do prostředí každé skořepinové vyvolání a Volání z těchto příkazů vyzvednout tyto proměnné prostředí, jak je uvedeno výše.

    # Do like this
    CFLAGS=-g
    export CFLAGS
    target:
            $(MAKE) -C target
    

    Můžete také exportovat všechny proměnné pomocí exportbez argumentů.

Odpovězeno 13/05/2010 v 11:57
zdroj uživatelem

hlasů
127

Nejjednodušší způsob je:

make foo=bar target

Pak v makefile se můžete obrátit na $(foo). Všimněte si, že to nebude šířit do sub-dělá automaticky.

Pokud používáte sub-značky, naleznete v tomto článku: Komunikace proměnné do Sub-make

Odpovězeno 13/05/2010 v 11:38
zdroj uživatelem

hlasů
40

Řekněme, že máte Makefile, jako je tento:

action:
    echo argument is $(argument)

Ty by pak říkat make action argument=something

Odpovězeno 13/05/2010 v 11:38
zdroj uživatelem

hlasů
16

Z manuálu :

Proměnné v make mohou pocházet z prostředí, ve kterém je spuštěn dělat. Každý proměnná prostředí, aby si všiml, když to nastartuje se přemění na make proměnné se stejným názvem a hodnotou. Nicméně explicitní přiřazení v makefile, nebo s argumentu příkazu, přepíše prostředí.

Takže si můžete udělat (od bash):

FOOBAR=1 make

což má za následek proměnné FOOBARve vaší Makefile.

Odpovězeno 13/05/2010 v 11:38
zdroj uživatelem

hlasů
2
export ROOT_DIR=<path/value>

Pak použijte proměnnou, $(ROOT_DIR)do Makefile.

Odpovězeno 07/01/2016 v 16:03
zdroj uživatelem

hlasů
2

Uděláte-li soubor s názvem Makefile a přidat proměnnou jako tento $ (unittest), pak budete moci použít tuto proměnnou uvnitř Makefile dokonce se zástupnými znaky

příklad:

make unittest=*

Používám BOOST_TEST a tím, že divokou kartu do parametru --run_test = $ (unittest), pak budu moci použít regulární výraz pro filtrování test Chci Makefile spustit

Odpovězeno 08/03/2014 v 14:29
zdroj uživatelem

hlasů
1

Je tu další možnost zde není uveden, který je obsažen v GNU make knihy Stallman a McGrath (viz http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Poskytuje příklad:

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
        +touch archive.a
        +ranlib -t archive.a
else
        ranlib archive.a
endif

To spočívá v ověření, zda se objeví daný parametr MAKEFLAGS. Například .. Předpokládám, že jste studoval o závitů v C ++ 11 a vy jste rozděleny své studium na více souborů ( class01, ... classNM) a chcete-li: sestavovat pak vše a spustit jednotlivě nebo sestavit jeden po druhém čas a spusťte jej, pokud je zadán příznak ( -rnapříklad). Takže byste mohli přijít s následující 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

Mít to, že byste:

  • vytvoření a spuštění souboru w / make -r class02;
  • stavět všechny w / makenebo make all;
  • vybudovat a provozovat všechny w / make -r(předpokládám, že všechny z nich obsahují nějaký určitý druh assert věci a vy prostě chcete, aby jim vyzkoušet všechny)
Odpovězeno 21/05/2015 v 02:53
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more