Apa yang dimaksud .PHONY
dengan Makefile? Saya sudah melalui ini , tetapi terlalu rumit.
Adakah yang bisa menjelaskannya kepada saya secara sederhana?
sumber
Apa yang dimaksud .PHONY
dengan Makefile? Saya sudah melalui ini , tetapi terlalu rumit.
Adakah yang bisa menjelaskannya kepada saya secara sederhana?
Secara default, target Makefile adalah "target file" - target tersebut digunakan untuk membuat file dari file lain. Anggap targetnya adalah file, dan ini membuat penulisan Makefiles relatif mudah:
foo: bar
create_one_from_the_other foo bar
Namun, kadang-kadang Anda ingin Makefile Anda menjalankan perintah yang tidak mewakili file fisik dalam sistem file. Contoh yang baik untuk ini adalah target umum "bersih" dan "semua". Kemungkinannya bukan ini masalahnya, tetapi Anda mungkin berpotensi memiliki nama file clean
di direktori utama Anda. Dalam kasus seperti itu, Make akan menjadi bingung karena secara default clean
target akan dikaitkan dengan file ini dan Make hanya akan menjalankannya ketika file tersebut tampaknya tidak mutakhir sehubungan dengan dependensinya.
Target khusus ini disebut palsu dan Anda dapat secara eksplisit memberi tahu Make mereka tidak terkait dengan file, misalnya:
.PHONY: clean
clean:
rm -rf *.o
Sekarang make clean
akan berjalan seperti yang diharapkan bahkan jika Anda memiliki file bernama clean
.
Dalam hal Make, target palsu hanyalah target yang selalu kedaluwarsa, jadi setiap kali Anda bertanya make <phony_target>
, itu akan berjalan, terlepas dari keadaan sistem file. Beberapa umum make
target yang sering palsu adalah: all
, install
, clean
, distclean
, TAGS
, info
, check
.
Mari kita asumsikan Anda memiliki
install
target, yang sangat umum di makefile. Jika Anda tidak menggunakan.PHONY
, dan file bernamainstall
ada di direktori yang sama dengan Makefile, makamake install
tidak akan melakukan apa pun . Ini karena Make menafsirkan aturan berarti "menjalankan resep ini-dan-itu untuk membuat file bernamainstall
". Karena file sudah ada di sana, dan dependensinya tidak berubah, tidak ada yang akan dilakukan.Namun jika Anda membuat
install
target PHONY, itu akan memberi tahu alat make bahwa target tersebut fiktif, dan yang membuat tidak boleh mengharapkannya untuk membuat file yang sebenarnya. Karenanya ia tidak akan memeriksa apakahinstall
file itu ada, artinya: a) perilakunya tidak akan diubah jika file itu ada dan b) ekstrastat()
tidak akan dipanggil.Secara umum semua target di Makefile Anda yang tidak menghasilkan file output dengan nama yang sama dengan nama target harus PHONY. Hal ini biasanya meliputi
all
,install
,clean
,distclean
, dan sebagainya.sumber
.sh
atau.bash
ekstensi untuk "program" yang berjalan seperti mereka memiliki fungsi utama dan cadangan menambahkan ekstensi untuk perpustakaan yang Anda sertakan (source mylib.sh
). Bahkan, saya sampai pada pertanyaan SO ini karena saya punya skrip di direktori yang sama dengan Makefile saya dipanggilinstall
.PHONY
semua waktu ....PHONY
versinya.CATATAN : Alat make membaca makefile dan memeriksa stempel waktu modifikasi file di kedua sisi simbol ':' dalam aturan.
Contoh
Dalam direktori 'test' file berikut ada:
Dalam makefile aturan didefinisikan sebagai berikut:
Sekarang asumsikan file 'halo' adalah file teks yang berisi beberapa data, yang dibuat setelah file 'hello.c'. Jadi cap waktu modifikasi (atau kreasi) 'halo' akan lebih baru daripada 'hello.c'. Jadi ketika kita akan memanggil 'make hello' dari baris perintah, itu akan dicetak sebagai:
Sekarang akses file 'hello.c' dan letakkan beberapa spasi putih di dalamnya, yang tidak memengaruhi sintaksis atau logika kode lalu simpan dan keluar. Sekarang cap waktu modifikasi hello.c lebih baru daripada 'hello'. Sekarang jika Anda memanggil 'make hello', itu akan menjalankan perintah sebagai:
Dan file 'halo' (file teks) akan ditimpa dengan file biner baru 'halo' (hasil dari perintah kompilasi di atas).
Jika kita menggunakan .PHONY di makefile sebagai berikut:
dan kemudian memanggil 'make hello', itu akan mengabaikan semua file yang ada di pwd 'test' dan menjalankan perintah setiap waktu.
Sekarang anggaplah, bahwa target 'halo' tidak memiliki ketergantungan menyatakan:
dan file 'halo' sudah ada di pwd 'test', maka 'make hello' akan selalu ditampilkan sebagai:
sumber
make
secara keseluruhan masuk akal, ini semua tentang file! Terima kasih atas jawaban ini.sumber
Ini adalah target bangun yang bukan nama file.
sumber
Penjelasan terbaik adalah GNU make manual sendiri: 4,6 bagian Target Phony .
.PHONY
adalah salah satu dari Nama Target Built-in Khusus make . Ada target lain yang mungkin Anda minati, jadi ada baiknya membaca sekilas referensi ini.Anda mungkin juga tertarik dengan Target Standar make seperti
all
danclean
.sumber
Ada juga satu trik rumit yang penting dari ".PHONY" - ketika target fisik bergantung pada target palsu yang tergantung pada target fisik lain:
TARGET1 -> PHONY_FORWARDER1 -> PHONY_FORWARDER2 -> TARGET2
Anda hanya berharap bahwa jika Anda memperbarui TARGET2, maka TARGET1 harus dianggap basi terhadap TARGET1, sehingga TARGET1 harus dibangun kembali. Dan itu benar-benar bekerja seperti ini .
Bagian yang sulit adalah ketika TARGET2 tidak basi terhadap TARGET1 - dalam hal ini Anda harus mengharapkan bahwa TARGET1 tidak boleh dibangun kembali.
Ini mengejutkan tidak berfungsi karena: target palsu dijalankan pula (seperti yang biasanya dilakukan target palsu) , yang berarti bahwa target palsu dianggap diperbarui . Dan karena itu TARGET1 dianggap basi terhadap target palsu .
Mempertimbangkan:
Anda dapat bermain-main dengan ini:
Anda dapat melihat bahwa file semua tergantung pada file1 secara tidak langsung melalui target palsu - tetapi selalu dibangun kembali karena ketergantungan ini. Jika Anda mengubah ketergantungan dalam
fileall
darifilefwd
menjadifile
, sekarangfileall
tidak bisa dibangun kembali setiap kali, tetapi hanya ketika salah satu dari target bergantung basi terhadap itu sebagai file.sumber
Target khusus
.PHONY:
memungkinkan untuk mendeklarasikan target palsu, sehinggamake
tidak akan memeriksanya sebagai nama file yang sebenarnya: itu akan berfungsi sepanjang waktu walaupun file tersebut masih ada.Anda dapat menempatkan beberapa
.PHONY:
diMakefile
:Ada cara lain untuk mendeklarasikan target palsu: sederhananya '::'
'::' memiliki arti khusus: target palsu ditambah mereka dapat muncul beberapa kali:
Blok perintah akan dipanggil satu demi satu.
sumber
Saya sering menggunakannya untuk memberi tahu target default untuk tidak menembak.
Tanpa palsu,
make superclean
akan memecatclean
,andsomethingelse
dancatcher superclean
; tetapi dengan PHONY,make superclean
tidak akan memecatcatcher superclean
.Kita tidak perlu khawatir untuk mengatakan bahwa
clean
targetnya adalah PHONY, karena itu tidak sepenuhnya palsu. Meskipun tidak pernah menghasilkan file bersih, ia memiliki perintah untuk diaktifkan sehingga membuat akan berpikir itu adalah target akhir.Namun,
superclean
target tersebut benar-benar palsu, jadi make akan mencoba menumpuknya dengan hal lain yang menyediakan deps untuksuperclean
target - ini termasuksuperclean
target lain dan%
target.Perhatikan bahwa kami tidak mengatakan apa-apa tentang
andsomethingelse
ataublah
, jadi mereka jelas pergi ke penangkap.Outputnya terlihat seperti ini:
sumber