Apa keuntungan menggunakan `make` untuk proyek kecil? [Tutup]

8

Saya telah melihat bahwa makeini berguna untuk proyek-proyek besar, terutama dengan dependensi membingungkan yang dijelaskan dalam Makefile, dan juga membantu dengan alur kerja. Saya belum pernah mendengar keuntungan menggunakan makeproyek kecil. Apakah ada?

Goodwin Lu
sumber
2
optimisme untuk pertumbuhan? :) kebiasaan baik? Ini mungkin menyimpang ke wilayah opini.
Jeff Schaller
ketik makeuntuk menemukan jawabannya. membuat templat Makefile yang layak dan hanya mengedit variabel file sumbernya. tidak perlu mengetik semua jazz itu.
user2497
mereka semacam mimpi buruk untuk proyek-proyek besar, jadi jujur, saya katakan itu hanya baik untuk proyek-proyek kecil;)
Eevee
Saya bisa menggunakan makefiles, tetapi saya tidak. Saya telah membagi kode sumber saya untuk proyek (pribadi) terbesar saya menjadi 10 file, kompilasi ulang yang pertama, dan yang pertama telah # termasuk untuk sembilan lainnya. Dengan kecepatan kompilasi ulang, tidak masalah bagiku jika semuanya dikompilasi ulang setiap saat.
Jennifer
1
Kemalasan :-) makeadalah perintah yang jauh lebih cepat untuk diketik daripada kebanyakan orang lain, bahkan jika Anda tidak membuat Makefile yang cerdas untuk menangani dependensi dengan bersih :-)
Stephen Harris

Jawaban:

11

Bertentangan dengan apa?

Misalkan Anda memiliki program yang telah Anda bagi menjadi dua file, yang Anda beri nama secara imajinatif file1.cdan  file2.c. Anda dapat mengkompilasi program dengan menjalankan

cc file1.c file2.c -o yourprogram

Tetapi ini membutuhkan kompilasi ulang kedua file setiap kali, bahkan jika hanya satu yang berubah. Anda dapat menguraikan langkah kompilasi menjadi

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

dan kemudian, ketika Anda mengedit salah satu file, kompilasi ulang hanya file itu (dan lakukan langkah menghubungkan apa pun yang Anda ubah). Tetapi bagaimana jika Anda mengedit satu file, dan yang lainnya, dan Anda lupa bahwa Anda mengedit kedua file, dan secara tidak sengaja mengkompilasi ulang satu file saja?

Juga, bahkan untuk hanya dua file, Anda memiliki perintah senilai sekitar 60 karakter di sana. Itu cepat membosankan untuk mengetik. Oke, tentu saja, Anda bisa memasukkannya ke dalam skrip, tetapi kemudian Anda kembali mengkompilasi ulang setiap waktu. Atau Anda bisa menulis skrip rumit yang mewah yang memeriksa file apa yang telah dimodifikasi dan hanya melakukan kompilasi yang diperlukan. Apakah Anda melihat ke mana saya akan pergi dengan ini?

G-Man Mengatakan 'Reinstate Monica'
sumber
Untuk proyek yang sangat kecil, gcc -O3 -march=native -fwhole-program *.c pada dasarnya baik untuk siklus edit / kompilasi / profil. Tetapi Anda masih menginginkan Makefile untuk digunakan orang lain . Mampu menggunakan -fwhole-programadalah keuntungan yang menyenangkan dari kompilasi semuanya, tetapi -fltobiasanya memberi Anda cukup banyak optimasi yang sama.
Peter Cordes
2
Setelah saya mulai menambahkan sakelar ke baris perintah kompiler (bahkan untuk satu file sumber), saya merasa sulit mengingatnya di lain waktu. Kadang-kadang saya hanya akan memberikan komentar di file sumber, tetapi pada saat itu saya harus menggunakan Makefile ...
Roger Lipscombe
@ger Lipscombe: Dan jika Anda perlu mengkompilasi untuk lingkungan yang berbeda, itu semudah mendefinisikan beberapa makro di makefile Anda. Dan dengan sedikit kreativitas, Anda dapat mengaitkan perintah make ke tombol fungsi editior, menangkap output dalam file, dan menggunakan tombol lain untuk menempatkan Anda pada posisi kesalahan ...
jamesqf
15

Banyak orang masuk ke detail makefile yang lebih kompleks dan banyak kerumitan yang menyertai mereka. Saya biasanya menggunakan makefile untuk alasan yang sangat berbeda:

Saya tidak ingin mengingat apa pun.

Bahkan jika proyek Anda benar-benar membosankan dan sederhana, dan Anda tidak menggunakan makefile "dengan benar":

all:
    gcc main.c -o project

Saya tidak perlu memikirkannya atau memperlakukannya berbeda dari proyek yang lebih kompleks:

all:
    gcc libA.c libB.c main.c -o project2

Atau jika saya menentukan flag (mis. -O2) Saya tidak perlu mengingat apa itu.

Juga, jika Anda mulai dengan makefile sederhana, dan Anda perlu menggabungkan / memperbaiki hal-hal nanti, Anda tidak perlu ingat untuk membangun setiap proyek secara berbeda.

Stack Tracer
sumber
Saya menggunakan makefile bahkan dalam proyek yang tidak dikompilasi. Saya membuat aturan 'palsu' yang menjalankan perintah kompleks yang relevan hanya untuk direktori yang terlibat. Misalnya: pembersihan, instalasi ke lokasi yang tepat, menginstal gambar buruh pelabuhan. Itu hanya membuatnya lebih mudah.
anthony
5

Bahkan dengan proyek kecil akan sangat membantu menjaga logika dependensi tetap terkendali dan membangun otomatis. Saya juga menggunakannya untuk memicu instal dan deinstalasi, jadi itu adalah saklar utama yang mengatur ulang panggung.


sumber
3

Jika Anda menautkan aplikasi dari 2 sumber ( .cfile), Anda tidak perlu mengkompilasi ulang setiap file, tetapi hanya yang diubah jika Anda menggunakan make.

Juga, saya akan memberi Anda contoh dari dunia BSD. Mereka memiliki kerangka Makefiles berbasis sistem. Mereka memberi Anda jalur ke direktori sistem dan memiliki target untuk menginstal perangkat lunak dan halaman manual Anda.

Misalnya, Anda baru saja menulis beer.caplikasi dan manual untuk itu disebut beer.6. Anda membuat Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..dan panggilan make install. Secara otomatis mengkompilasi dan menginstal aplikasi Anda ke /usr/bindan mengkompilasi dan menginstal halaman manual Anda ke tempat di mana mandapat menemukannya. Anda baru saja menginstal aplikasi Anda dengan satu perintah sederhana!

Sangat nyaman dan benar-benar transparan bagi siapa saja yang akrab dengan BSD. Jauh lebih baik daripada skrip manual.

pengguna996142
sumber
1

Contoh Makefileuntuk proyek saya yang sangat kecil:getPixelColor

Itu tidak persis apa yang dikatakan namanya, mengambil dua argumen opsional, koordinat.

Saya terutama suka bagaimana hal-hal menjadi tergantung di sana.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

Seperti yang Anda lihat, ini dapat melakukan semua yang Anda butuhkan, tanpa mengetikkan tambahan:


Pemakaian

Anda dapat menjalankannya dengan cara ini:

  1. Bersihkan biner lama:

    make clean
  2. Kompilasi biner baru:

    make
  3. Jalankan executable dengan 2 cara:

    • koordinat default [0,0]

      make run     # equals COORDS='0 0'
    • koordinat yang diberikan

      COORDS='5 6' make run

Makefiles terkadang sangat membantu. Semakin besar proyek, semakin besar manfaatnya. Tetapi bahkan dengan proyek C ++ terkecil saya, seperti yang Anda lihat pada contoh menghemat banyak sakit kepala.

LinuxSecurityFreak
sumber
0

maketersedia cukup andal. Jika Anda mendistribusikan proyek Anda dengan a makefile, pengguna akan memiliki referensi sederhana tentang cara mencapai tugas dengan cara yang sama Anda lakukan. The makefilebisa untuk lebih dari sekedar kompilasi.

Ambil proyek yang tidak memerlukan kompilasi, misalnya. Saya ingat pernah bekerja pada proyek Python yang memiliki perintah make untuk menghapus semua .pycfile, perintah make untuk menjalankan tes, satu untuk mengunduh salinan data statis dari server pengembangan, dll.

Adam Barnes
sumber