Saya perlu menjalankan beberapa aturan make secara kondisional, hanya jika Python yang diinstal lebih besar dari versi tertentu (katakanlah 2.5).
Saya pikir saya bisa melakukan sesuatu seperti mengeksekusi:
python -c 'import sys; print int(sys.version_info >= (2,5))'
dan kemudian menggunakan output ('1' jika ok, '0' jika tidak) dalam ifeq
pernyataan make.
Dalam skrip bash shell sederhana, itu hanya:
MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`
tapi itu tidak berhasil di Makefile.
Ada saran? Saya bisa menggunakan solusi yang masuk akal lainnya untuk mencapai ini.
Jawaban:
Gunakan Make
shell
builtin seperti diMY_VAR=$(shell echo whatever)
sumber
$
.Membungkus penugasan dalam
eval
adalah untuk saya.sumber
.PHONY always make these targets
.Berikut ini contoh yang sedikit lebih rumit dengan perpipaan dan penetapan variabel di dalam resep:
sumber
PODNAME
dengan nama penyebaran:$(eval PODNAME=$(shell sh -c "kubectl get pod -l app=sqlproxy -o jsonpath='{.items[0].metadata.name}'"))
Saya menulis jawaban untuk meningkatkan visibilitas ke sintaks aktual yang memecahkan masalah. Sayangnya, apa yang seseorang mungkin anggap sepele bisa menjadi sakit kepala yang sangat signifikan bagi seseorang yang mencari jawaban sederhana untuk pertanyaan yang masuk akal.
Masukkan yang berikut ke dalam file "Makefile".
Perilaku yang ingin Anda lihat adalah sebagai berikut (dengan asumsi Anda memiliki python baru diinstal).
Jika Anda menyalin dan menempelkan teks di atas ke dalam Makefile, apakah Anda akan mendapatkannya? Mungkin tidak. Anda mungkin akan mendapatkan kesalahan seperti yang dilaporkan di sini:
makefile: 4: *** pemisah yang hilang. Berhenti
Mengapa: Karena meskipun saya secara pribadi menggunakan tab asli, Stack Overflow (berusaha membantu) mengubah tab saya menjadi sejumlah ruang. Anda, warga internet yang frustrasi, sekarang salin ini, berpikir bahwa Anda sekarang memiliki teks yang sama yang saya gunakan. Perintah make, sekarang membaca spasi dan menemukan bahwa perintah "semua" salah diformat. Jadi salin teks di atas, tempel, lalu konversikan spasi putih sebelum "@echo" menjadi sebuah tab, dan contoh ini seharusnya, akhirnya, semoga berhasil untuk Anda.
sumber
Waspadai resep seperti ini
Itu melakukan dua hal yang salah. Baris pertama dalam resep dijalankan dalam instance shell terpisah dari baris kedua. Sementara itu variabel hilang. Hal kedua yang salah adalah bahwa hal
$
itu tidak luput.Kedua masalah telah diperbaiki dan variabel dapat digunakan. Garis miring terbalik menggabungkan kedua baris untuk berjalan dalam satu shell tunggal, maka pengaturan variabel dan pembacaan kata penutup variabel, bekerja.
Saya menyadari posting asli mengatakan bagaimana cara mendapatkan hasil dari perintah shell ke dalam variabel MAKE, dan jawaban ini menunjukkan bagaimana memasukkannya ke dalam variabel shell. Tetapi pembaca lain mungkin mendapat manfaat.
Satu perbaikan terakhir, jika konsumen mengharapkan "variabel lingkungan" untuk ditetapkan, maka Anda harus mengekspornya.
akan membutuhkan ini di makefile
Semoga itu bisa membantu seseorang. Secara umum, seseorang harus menghindari melakukan pekerjaan nyata di luar resep, karena jika seseorang menggunakan makefile dengan opsi '--dry-run', untuk hanya MELIHAT apa yang akan dilakukan, itu tidak akan memiliki efek samping yang tidak diinginkan. Setiap
$(shell)
panggilan dievaluasi pada waktu kompilasi dan beberapa pekerjaan nyata dapat dilakukan tanpa sengaja. Lebih baik meninggalkan pekerjaan nyata, seperti membuat id, ke bagian dalam resep bila memungkinkan.sumber
Dengan GNU Make, Anda dapat menggunakan
shell
daneval
untuk menyimpan, menjalankan, dan menetapkan output dari pemanggilan baris perintah sewenang-wenang. Perbedaan antara contoh di bawah ini dan yang digunakan:=
adalah:=
penugasan terjadi sekali (ketika ditemui) dan untuk semua. Variabel yang diperluas secara rekursif diatur dengan=
sedikit lebih "malas"; referensi ke variabel lain tetap sampai variabel itu sendiri direferensikan, dan ekspansi rekursif berikutnya terjadi setiap kali variabel direferensikan , yang diinginkan untuk membuat "konsisten, dapat dipanggil, snippet". Lihat manual tentang pengaturan variabel untuk info lebih lanjut.sumber
$(SET_ID)
hidup di dalamif
klausa yang salah maka itu masih disebut .Dalam contoh di bawah ini, saya telah menyimpan path folder Makefile ke
LOCAL_PKG_DIR
dan kemudian menggunakanLOCAL_PKG_DIR
variabel dalam target.Makefile:
Output terminal:
sumber