Saya ingin menulis Makefile yang akan menjalankan tes. Tes ada di direktori './tests' dan file yang dapat dieksekusi untuk diuji ada di direktori './bin'.
Ketika saya menjalankan tes, mereka tidak melihat file exec, karena direktori ./bin tidak ada di $ PATH.
Ketika saya melakukan sesuatu seperti ini:
EXPORT PATH=bin:$PATH
make test
semuanya bekerja. Namun saya perlu mengubah $ PATH di Makefile.
Konten Makefile sederhana:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Ini mencetak jalur dengan benar, namun tidak menemukan file x.
Ketika saya melakukan ini secara manual:
$ export PATH=bin:$PATH
$ x
semuanya baik-baik saja.
Bagaimana saya bisa mengubah $ PATH di Makefile?
../test/test_to_run
? Maaf jika saya salah paham dengan pertanyaannya..
. Namun ini mungkin tidak praktis.Jawaban:
Apakah Anda mencoba
export
direktif Make sendiri (dengan asumsi Anda menggunakan GNU Make)?Juga, ada bug dalam contoh Anda:
Pertama, nilai yang sedang
echo
diedit adalah perluasanPATH
variabel yang dilakukan oleh Make, bukan shell. Jika mencetak nilai yang diharapkan maka, saya kira, Anda telah menetapkanPATH
variabel di suatu tempat sebelumnya di Makefile Anda, atau di shell yang memanggil Make. Untuk mencegah perilaku seperti itu, Anda harus menghindari dolar:Kedua, bagaimanapun juga ini tidak akan berhasil karena Make mengeksekusi setiap baris resep di shell terpisah . Ini dapat diubah dengan menulis resep dalam satu baris:
sumber
$(PATH)
akan disetel ke nilai dariPATH
shell yang memanggil make. Sesuai manual , "Setiap variabel lingkungan yang membuat melihat saat dijalankan diubah menjadi variabel make dengan nama dan nilai yang sama."PATH
dengan benar tercermin dalam variabel (echo $(PATH)
) dan dalam lingkungan perintah (env
,which python
,bash -c python
), tetapi tampaknya tidak digunakan saat menemukan executable untuk perintah: perintahpython
masih menjalankan Python dapat dieksekusi pada aslinyaPATH
.Dengan desain
make
parser mengeksekusi baris dalam pemanggilan shell terpisah, itulah mengapa mengubah variabel (misalnyaPATH
) dalam satu baris, perubahan mungkin tidak diterapkan untuk baris berikutnya (lihat posting ini ).Salah satu cara untuk mengatasi masalah ini, adalah dengan mengubah beberapa perintah menjadi satu baris (dipisahkan oleh
;
), atau menggunakan target khusus Satu Shell (.ONESHELL
, seperti GNU Make 3.82).Sebagai alternatif, Anda dapat memberikan
PATH
variabel pada saat shell dipanggil. Sebagai contoh:sumber
$(shell)
pemanggilan! : D Contoh: pastebin.com/Pii8pmkDPerubahan jalur tampaknya tetap jika Anda menyetel variabel SHELL di makefile Anda terlebih dahulu:
Saya tidak tahu apakah ini perilaku yang diinginkan atau tidak.
sumber
which
danenv
sekarang ambil PATH baru, tetapi secara langsung mengeksekusi biner masih tidak ditemukan di PATH yang dimodifikasi, hanya di yang asli.Apa yang biasanya saya lakukan adalah menyediakan jalur ke yang dapat dieksekusi secara eksplisit:
Saya juga menggunakan teknik ini untuk menjalankan biner non-native di bawah emulator seperti QEMU jika saya melakukan kompilasi silang:
Jika make menggunakan shell sh, ini seharusnya berfungsi:
sumber
Untuk mengatur
PATH
variabel, di dalam Makefile saja, gunakan sesuatu seperti:sumber