Anda dapat membuat lingkungan individual untuk pemanggilan perintah tertentu:
VAR1=val1 VAR2=val2 VAR3=val3 make
Saya menemukan ini lebih bersih daripada melakukan:
export VAR1=val1
export VAR2=val2
export VAR3=val3
make
kecuali jika Anda menggunakan skrip pembungkus dan bahkan mungkin seperti VAR1=val1 VAR2=val2 VAR3=val3 make
VAR
variabel akan menjadi apa pun sebelum pemanggilan make (termasuk tetapi tidak terbatas pada tidak diekspor dan tidak ada).
Antrean panjang bukan masalah, Anda selalu dapat membaginya menjadi beberapa baris:
VAR1=val1\
VAR2=val2\
VAR3=val3\
make
Anda dapat mengatur variabel lingkungan seperti ini untuk setiap perintah Unix. Semua shell akan mengaturnya. Beberapa aplikasi (seperti make
atau rake
) akan mengubah lingkungannya berdasarkan argumen yang terlihat seperti definisi variabel (lihat jawaban prodev_paris), tetapi itu tergantung pada aplikasinya.
Seperti yang kita semua tahu, lebih disukai untuk mengintegrasikan alat standar untuk tugas seperti membangun produk Anda daripada membuat pendekatan Anda sendiri. Upaya tersebut biasanya membuahkan hasil dalam jangka panjang.
Karena itu, pendekatan sederhana adalah dengan mendefinisikan file lingkungan yang berbeda (mis. build-phone.env
) mengatur direktori kerja, PATH
, CC
dll. untuk berbagai produk Anda dan sumber file lingkungan Anda secara interaktif sesuai permintaan:
. /path/to/build-phone.env
[your build commands]
. /path/to/build-watch.env
[your build commands]
Apakah lebih baik menggunakan lingkungan daripada makefile khusus untuk menyetel konfigurasi build?
Praktik terbaik untuk membangun sistem adalah tidak bergantung pada variabel lingkungan sama sekali. Sehingga tidak ada lagi yang diperlukan untuk membangun proyek Anda selain:
git clone ... my_project
make -C my_project
Harus menyetel variabel lingkungan rawan kesalahan dan dapat menyebabkan build yang tidak konsisten.
Bagaimana cara menyesuaikan variabel lingkungan yang ada dengan benar?
Anda mungkin tidak perlu menyesuaikannya sama sekali. Dengan menggunakan jalur lengkap ke alat seperti kompiler, Anda memisahkan sistem build dari lingkungan.
Ketika saya memiliki beberapa variabel untuk diatur, saya menulis sebuah wrapper skrip yang kemudian saya gunakan sebagai awalan dari perintah yang ingin saya modifikasi. Itu memungkinkan saya menggunakan awalan juga
- menerapkan satu perintah, seperti
make
, atau - menginisialisasi shell, sehingga perintah selanjutnya menggunakan pengaturan yang telah diubah.
Saya menggunakan pembungkus untuk
- mengatur opsi kompiler (seperti
clang
, untuk menyetelCC
variabel, membuat skrip konfigurasi "melihatnya" sebagai kompiler yang dipilih), - mengatur variabel lokal, untuk menguji dengan POSIX
C
versusen_US
versusen_US.UTF-8
, dll. - menguji dengan lingkungan yang diperkecil, seperti di
cron
.
Setiap pembungkus melakukan apa yang diperlukan untuk mengidentifikasi PATH
yang tepat , LD_LIBRARY_PATH
, dan variabel serupa.
Misalnya, saya menulis skrip ad hoc ini sekitar sepuluh tahun yang lalu untuk menguji dengan versi lokal python:
#!/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
dan menggunakannya sebagai with-python-2.4.2
skrip saya .
Beberapa pembungkus cukup memanggil skrip lain. Sebagai contoh, saya menggunakan pembungkus ini di sekitar skrip configure untuk menyiapkan variabel untuk kompilasi silang:
#!/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
di mana choose-mingw32
dan cfg-normal
adalah skrip yang (a) menemukan nama target yang tersedia untuk kompiler silang dan (b) menyediakan opsi tambahan untuk skrip konfigurasi.
Orang lain mungkin menyarankan alias shell atau fungsi . Saya tidak menggunakannya untuk tujuan ini karena shell baris perintah saya biasanya tcsh
, sementara saya menjalankan perintah ini dari (a) skrip shell lain, (b) editor direktori, atau (c) editor teks. Itu menggunakan shell POSIX (kecuali tentu saja, untuk skrip yang membutuhkan fitur khusus), membuat alias atau fungsi tidak banyak berguna.