Anda tidak bisa melakukan ini. Tidak mungkin¹ proses make dapat mengubah lingkungan induknya (atau direktori saat ini, yang mungkin Anda pikirkan selanjutnya).
Faktanya, bahkan lebih sedikit yang membahagiakan daripada yang Anda pikirkan.
- Tidak semua
make
implementasi mencerminkan penugasan ke PATH
variabel make di lingkungan; GNU make (ditemukan di Linux dan sistem lain) tidak, tetapi BSD make tidak.
- Setiap baris perintah di bawah target berjalan dalam subkulit terpisah. (Kecuali dalam beberapa implementasi BSD yang lebih tua.) Jadi
export PATH
baris tersebut berjalan pada shell yang berakhir segera setelah itu. Bukan berarti baris ini akan melakukan apa pun di tempat pertama - jika PATH
didefinisikan pada titik itu, itu karena sudah ada di lingkungan shell.
Buat adalah untuk membangun sesuatu secara otomatis. Jika Anda ingin mengatur variabel untuk lingkungan interaktif Anda, ini bukan alat yang harus Anda lihat. Alih-alih, tulis snippet shell, dan sumber di shell saat ini:
. ./define-my-variables.sh
Di makefile Anda, sumber skrip di setiap subkulit . Anda bisa menggunakan backslash untuk membuat perintah panjang; ingat bahwa
- Urutan backslash-newline dilucuti oleh make, sehingga shell tidak akan melihat baris baru di sana.
- Ingatlah untuk mengawali setiap baris dengan sebuah tab.
- Perilaku kesalahan Make adalah untuk membatalkan jika suatu perintah gagal. Shell tidak akan melakukan itu secara default, dan kegagalan perintah apa pun tetapi yang terakhir tidak diketahui secara default, jadi Anda harus menjalankannya
set -e
.
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ Wajib catatan: tidak ada cara waras. Bahkan jauh memohon chdir
melalui ptrace
dari debugger tidak akan bekerja seperti kebanyakan kerang karena mereka tidak ingin memiliki direktori mereka saat ini berubah di bawah kaki mereka.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Kamu tidak bisa Subproses (seperti
make
) tidak mungkin mengubah lingkungan proses induknya.Anda bisa melakukan sesuatu seperti
Di mana
pathupdate
targetnya terlihat seperti:sumber
Jawaban Anda dapat ditemukan di sini: https://stackoverflow.com/a/8942216/367461
Pada dasarnya, Anda harus melakukan ini:
Saya menguji ini pada Fedora 23 dengan GNU Make 4.0, dan itu berfungsi dengan baik untuk saya.
sumber
.SHELL: name=sh path=/path/to/wrapper-script
dan kemudian membuat skrip pembungkus sepertiexport FOO=bar; exec bash "$@"
Saya akan mengajukan pertanyaan yang sama karena saya tidak bisa mendapatkan contoh jawaban yang lain untuk bekerja.
Namun, saya berhasil mencapai solusi kerja untuk saya dengan menggunakan
eval
perintah. Saya tidak terlalu yakin mengapa ini tidak diposting sebelumnya.sumber
export PATH=…
dido_something:
telepon, Anda tidak perlueval
.Anda dapat menyebabkan Make untuk menyebut dirinya secara rekursif dengan lingkungan yang dimodifikasi, seperti:
Jika Anda ingin menggunakan potongan shell:
sumber