Pertanyaan Timpa target di makefile untuk menambah lebih banyak perintah?


Di tempat kerja kami menggunakan makefile umum yang dibuat oleh makefile lain (melalui pernyataan include) dan memiliki target "bersih" generik yang membunuh beberapa file umum. Saya ingin menambahkan ke target itu di makefile baru saya sehingga saya bisa menghapus beberapa file tertentu, tetapi jika saya menambahkan target bersih di makefile saya, itu hanya menimpa yang lama.

Saya tahu saya bisa membuat target baru dengan nama baru dan memanggilnya bersih, dan kemudian melakukan hal-hal lain, tetapi demi konsistensi saya ingin dapat hanya membuat bersih dan memilikinya melakukan segalanya.

Apakah itu mungkin?


32
2017-10-29 16:24


asal


Jawaban:


Anda dapat menulis sendiri bersih dan membuatnya menjadi praq dari bersih umum.

bersih: myclean

myclean:
    apa pun

Anda akan berlari lebih dulu. Jika karena suatu alasan Anda ingin bersih umum dijalankan terlebih dahulu maka solusinya akan lebih rumit.


28
2017-10-29 16:52



Saya telah melihat ini dilakukan di beberapa toko. Pendekatan yang paling umum adalah menggunakan aturan kolon ganda, dengan asumsi Anda menggunakan sesuatu seperti GNU make. Di common makefile Anda, Anda akan memiliki sesuatu seperti ini:

clean::
        # standard cleanup, like remove all .o's:
        rm -f *.o

Perhatikan bahwa ada dua titik dua berikut clean, bukan hanya satu!

Di makefile Anda yang lain yang baru saja Anda deklarasikan clean lagi, sebagai aturan dua titik dua:

clean::
        # custom cleanup, like remove my special generated files:
        rm -f *.h.gen

Ketika Anda memanggil make clean, GNU make secara otomatis akan menjalankan kedua "cabang" aturan bersih ini:

% make clean
rm -f *.o
rm -f *.h.gen

Ini mudah diatur dan cukup rapi menurut saya. Perhatikan bahwa secara khusus karena ini adalah aturan dua titik dua, Anda tidak mendapatkan kesalahan "mengesampingkan perintah" yang biasanya Anda dapatkan ketika Anda menetapkan dua aturan untuk target yang sama. Itu semacam titik aturan dua titik dua.


54
2017-10-29 17:29



Sepertinya aturan makefile umum harus disebut sesuatu seperti common-clean. Kemudian masing-masing makefile utama akan mendeklarasikan aturan clean mereka sebagai

clean: common-clean

dan Anda siap.

Jika itu bukan pilihan, Anda bisa melihatnya aturan dua titik dua, tetapi mereka memperkenalkan serangkaian masalah lain yang perlu dipertimbangkan.


5
2017-10-29 16:36



Gunakan aturan implisit:

existing-target: my-extention

my-extention:
    echo running command 1
    echo running command 2

Tutorial membuat sangat sederhana untuk meningkatkan.

Ketika menggunakan :: Anda dapat mengalami masalah karena membuat komplain ketika Anda mencampur satu titik dua : dan double colon :: aturan:

a:
    echo a

a::
    echo aa

akan menghasilkan:

. . .
*** target file `a' has both : and :: entries.  Stop.

4
2018-05-15 23:58



Untuk kita, kita mendefinisikan variabel, EXTRAFILESTOCLEAN, lalu ketika aturan bersih berjalan, ia memiliki langkah untuk menghapus apa pun yang ditentukan dalam variabel EXTRAFILESTOCLEAN

clean:
    rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
    rm -f $(EXTRAFILESTOCLEAN)
endif

Itu dapat menyebabkan masalah yang tidak terduga jika Anda menetapkan variabel tersebut ke nilai aneh, tetapi Anda dapat mencegahnya dengan menambahkan awalan atau pengujian lainnya.


1
2017-08-09 01:27



Menambahkan solusi lain yang mungkin saya lihat untuk anak cucu ... Saya tahu OP waspada tentang mengubah makefile umum, tetapi sesuatu seperti ini bekerja dan melibatkan perubahan minimal.

makefile lokal 1:

CLEAN=MyExe1 MyExe2
....
include /my/common/makefile

makefile lokal 2:

CLEAN=MyExe3 MyExe4
....
include /my/common/makefile

makefile umum:

clean:
     rm -f *.dep *.o *.a $(CLEAN)

Pada dasarnya idenya adalah mendefinisikan beberapa variabel (dalam hal ini CLEAN) di setiap makefile lokal dengan semua item spesifik yang ingin Anda hapus. Kemudian makefile umum dijalankan rm -fpada semua jenis file umum untuk dihapus, ditambah apa pun yang secara khusus ditandai untuk dihapus di setiap file makefile lokal melalui CLEAN variabel. Jika tidak ada yang spesifik untuk dihapus, cukup abaikan deklarasi variabel atau biarkan kosong (CLEAN=)

Jadi sekarang jika kita jalankan make clean untuk makefile lokal 1, dijalankan

rm -f *.dep *.o *.a MyExe1 MyExe2

Dan jika kita lari make clean untuk makefile 2 lokal, dijalankan

rm -f *.dep *.o *.a MyExe3 MyExe4

1
2018-03-20 16:12