Di GNUmakefile saya, saya ingin memiliki aturan yang menggunakan direktori sementara. Sebagai contoh:
out.tar: TMP := $(shell mktemp -d)
echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
Seperti yang tertulis, aturan di atas membuat direktori sementara pada saat aturan diuraikan . Ini berarti bahwa, bahkan saya tidak melihat. Sepanjang waktu, banyak direktori sementara dibuat. Saya ingin menghindari / tmp saya dikotori dengan direktori sementara yang tidak digunakan.
Apakah ada cara untuk menyebabkan variabel hanya didefinisikan ketika aturan dipecat, berbeda dengan setiap kali didefinisikan?
Pikiran utama saya adalah untuk membuang mktemp dan tar ke dalam skrip shell tetapi sepertinya agak tidak enak dipandang.
$(eval $@_TMP := $(shell mktemp -d))
akan terjadi ketika Makefile pertama kali dievaluasi bukan dalam urutan prosedur aturan. Dengan kata lain,$(eval ...)
terjadi lebih cepat dari yang Anda pikirkan. Meskipun itu mungkin oke untuk contoh ini, metode ini akan menyebabkan masalah untuk beberapa operasi berurutan.Cara yang relatif mudah untuk melakukan ini adalah dengan menulis seluruh urutan sebagai skrip shell.
Saya telah menggabungkan beberapa kiat terkait di sini: https://stackoverflow.com/a/29085684/86967
sumber
@
daneval
dan melakukan pekerjaan yang sama). Perhatikan bahwa dalam output Anda, Anda melihat$TMP
(misalnyatar -C $TMP ...
) meskipun nilainya benar diteruskan ke perintah.SHELL := /bin/bash
di makefile Anda mengaktifkan fitur spesifik BASH.Kemungkinan lain adalah dengan menggunakan baris terpisah untuk mengatur variabel Make ketika aturan menyala.
Sebagai contoh, ini adalah makefile dengan dua aturan. Jika aturan diaktifkan, itu menciptakan dir temp dan mengatur TMP ke nama temp dir.
Menjalankan kode menghasilkan hasil yang diharapkan:
sumber
ruleA: TMP = $(shell mktemp -d testruleA_XXXX)
danruleB: TMP = $(shell mktemp -d testruleB_XXXX)
akan terjadi ketika Makefile pertama kali dievaluasi. Dengan kata lain,ruleA: TMP = $(shell ...
terjadi lebih cepat dari yang Anda pikirkan. Meskipun ini mungkin bekerja untuk kasus khusus ini, metode ini akan menyebabkan masalah untuk beberapa operasi berurutan.Saya tidak suka jawaban "Jangan", tapi ... jangan.
make
Variabel bersifat global dan seharusnya dievaluasi selama tahap "parsing" makefile, bukan selama tahap eksekusi.Dalam hal ini, selama variabel lokal ke target tunggal, ikuti jawaban @ nobar dan jadikan variabel shell.
Variabel spesifik target juga dianggap berbahaya oleh implementasi make lainnya: kati , Mozilla pymake . Karena itu, target dapat dibangun secara berbeda tergantung pada apakah itu dibangun sendiri, atau sebagai ketergantungan dari target induk dengan variabel target-spesifik. Dan Anda tidak akan tahu ke mana itu , karena Anda tidak tahu apa yang sudah dibangun.
sumber