Sebenarnya Anda benar: ini menjalankan contoh make yang lain. Solusi yang mungkin adalah:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Dengan memanggil make fresh
Anda mendapatkan clean
target pertama , lalu clearscreen
yang berjalan clear
dan terakhir all
yang melakukan pekerjaan.
EDIT 4 Agustus
Apa yang terjadi dalam kasus build paralel dengan -j
opsi make ? Ada cara untuk memperbaiki pesanan. Dari manual make, bagian 4.2:
Namun, terkadang, Anda mengalami situasi di mana Anda ingin menerapkan urutan tertentu pada aturan yang akan dijalankan tanpa memaksa target untuk diperbarui jika salah satu aturan tersebut dijalankan. Dalam kasus tersebut, Anda ingin menentukan prasyarat khusus pesanan. Prasyarat hanya-pesanan dapat ditentukan dengan menempatkan simbol pipa (|) di daftar prasyarat: semua prasyarat di sebelah kiri simbol pipa adalah normal; semua prasyarat di sebelah kanan hanya dapat dipesan: target: normal-prasyarat | prasyarat hanya pesanan
Bagian prasyarat normal tentu saja mungkin kosong. Selain itu, Anda masih dapat mendeklarasikan beberapa baris prasyarat untuk target yang sama: mereka telah ditambahkan dengan tepat. Perhatikan bahwa jika Anda mendeklarasikan file yang sama sebagai prasyarat normal dan prasyarat hanya-pesanan, prasyarat normal akan diutamakan (karena prasyarat tersebut merupakan superset ketat dari perilaku prasyarat hanya-pesanan).
Karenanya makefile menjadi
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 5 Desember
Bukan masalah besar untuk menjalankan lebih dari satu contoh makefile karena setiap perintah di dalam tugas akan menjadi sub-shell . Tetapi Anda dapat memiliki metode yang dapat digunakan kembali menggunakan fungsi panggilan .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
diperlakukan sebagai beberapa kata kunci yang selalu dieksekusi, sedangkan target non-palsu dimaksudkan sebagai file.t2
akan bergantung padat0
,t1
dant3
. Jika Anda membutuhkan ini, Anda harus meletakkant3
seperti yang dipersyaratkan oleht2
,t1
sebagaimana diharuskan oleht3
dant0
sebagaimana diharuskan oleht1
. Ini berarti 3 aturan berbeda. Namun, Anda harus memverifikasi ini. Saya tidak 100% yakin.Jika Anda menghapus
make all
garis dari target "segar" Anda:Anda cukup menjalankan perintah
make fresh all
, yang akan dieksekusi sebagaimake fresh; make all
.Beberapa orang mungkin menganggap ini sebagai contoh kedua dari pembuatan, tetapi ini jelas bukan merupakan sub-contoh dari make (sebuah make inside dari make), yang tampaknya hasil dari usaha Anda.
sumber