Můžete vytvořit individualizované prostředí pro vyvolání konkrétního příkazu:
VAR1=val1 VAR2=val2 VAR3=val3 make
Připadá mi to čistší než:
export VAR1=val1
export VAR2=val2
export VAR3=val3
make
pokud nejste ve skriptu wrapper a možná i tehdy jako u VAR1=val1 VAR2=val2 VAR3=val3 make
VAR
proměnné budou stejné, jako byly před vyvoláním make (včetně, ale nejen neexportovaných a neexistujících).
Dlouhé řádky nejsou problém, vždy je můžete rozdělit na několik řádků:
VAR1=val1\
VAR2=val2\
VAR3=val3\
make
Proměnné prostředí, jako je tato, můžete nastavit pro jakýkoli příkaz Unix. Shell to nastaví. Některé aplikace (například make
nebo rake
) upraví své prostředí na základě argumentů, které vypadají jako definice proměnných (viz odpověď prodev_paris), ale to závisí na aplikaci.
Jak všichni víme, je vhodnější integrovat standardní nástroje pro úkol, jako je vytváření vašich produktů, namísto vytváření vlastního přístupu. Úsilí se obvykle dlouhodobě vyplatí.
Jak již bylo řečeno, jednoduchým přístupem by bylo definovat různé soubory prostředí (např. build-phone.env
) nastavení pracovního adresáře, PATH
, CC
atd. pro vaše různé produkty a interaktivně na vyžádání zdrojové soubory vašeho prostředí:
. /path/to/build-phone.env
[your build commands]
. /path/to/build-watch.env
[your build commands]
Je lepší použít k nastavení konfigurace sestavení prostředí místo vlastních makefiles?
Nejlepším postupem pro systémy sestavení je nezáviset na žádných proměnných prostředí. Takže k vybudování vašeho projektu není potřeba nic víc než:
git clone ... my_project
make -C my_project
Nutnost nastavit proměnné prostředí je náchylná k chybám a může vést k nekonzistentním sestavám.
Jak správně upravit existující proměnné prostředí?
Možná je nebudete muset upravovat vůbec. Použitím úplných cest k nástrojům, jako jsou kompilátory, oddělíte svůj systém sestavení od prostředí.
Když mám k nastavení několik proměnných, napíšu obal skript, který pak používám jako předponu příkazu, který chci upravit. To mi umožňuje použít předponu buď
- použití na jeden příkaz, například
make
nebo - inicializace shellu, aby následující příkazy používaly změněná nastavení.
Používám obaly pro
- nastavení možností kompilátoru (například
clang
, nastavteCC
proměnná, takže konfigurační skripty ji „vidí“ jako vybraný kompilátor), - nastavení proměnných národního prostředí pro testování s POSIX
C
oprotien_US
oprotien_US.UTF-8
atd. - testování v redukovaných prostředích, jako je
cron
.
Každý z obalů dělá to, co je potřeba k identifikaci správného PATH
, LD_LIBRARY_PATH
a podobné proměnné.
Například tento ad hoc skript jsem napsal asi před deseti lety, abych ho otestoval s místním sestavením pythonu:
#!/bin/bash
ver=2.4.2
export TOP=/usr/local/python-$ver
export PATH=$TOP/bin:$PATH
export LD_LIBRARY_PATH=`newpath -n LD_LIBRARY_PATH -bd $TOP/lib $TOP/lib/gcc/i686-pc-linux-gnu/$ver`
if test -d $TOP
then
exec $*
else
echo no $TOP
exit 1
fi
a použili jej jako with-python-2.4.2
myscript .
Některé obaly jednoduše volají jiný skript. Tento obal například používám kolem konfiguračního skriptu k nastavení proměnných pro křížovou kompilaci:
#!/bin/sh
# $Id: cfg-mingw,v 1.7 2014/09/20 20:49:31 tom Exp $
# configure to cross-compile using mingw32
BUILD_CC=${CC:-gcc}
unset CC
unset CXX
TARGET=`choose-mingw32`
if test -n "$TARGET"
then
PREFIX=
test -d /usr/$TARGET && PREFIX="--prefix=/usr/$TARGET"
cfg-normal \
--with-build-cc=$BUILD_CC \
--host=$TARGET \
--target=$TARGET \
$PREFIX "[email protected]"
else
echo "? cannot find MinGW compiler in path"
exit 1
fi
kde choose-mingw32
a cfg-normal
jsou skripty, které (a) najdou dostupný cílový název pro křížový kompilátor a (b) poskytují další možnosti konfiguračnímu skriptu.
Ostatní mohou navrhovat aliasy shellu nebo funkce . K tomuto účelu je nepoužívám, protože můj shell příkazového řádku je obvykle tcsh
, zatímco tyto příkazy spouštím z (a) jiných shellových skriptů, (b) adresářového editoru nebo (c) textového editoru. Ty používají shell POSIX (samozřejmě kromě skriptů vyžadujících specifické vlastnosti), takže aliasy nebo funkce jsou málo použitelné.