Saya memiliki makefile berikut untuk proyek saya, dan saya ingin mengkonfigurasinya untuk rilis dan debug build. Dalam kode saya, saya punya banyak #ifdef DEBUG
makro di tempat, jadi itu hanya masalah pengaturan makro ini dan menambahkan -g3 -gdwarf2
bendera ke kompiler. Bagaimana saya bisa melakukan ini?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Hanya untuk memperjelas, ketika saya mengatakan rilis / debug builds, saya ingin bisa cukup mengetik make
dan mendapatkan rilis build atau make debug
dan mendapatkan build debug, tanpa secara manual mengomentari hal-hal di makefile.
.PHONY
Jawaban:
Anda dapat menggunakan Nilai Variabel spesifik Target . Contoh:
Ingatlah untuk menggunakan $ (CXX) atau $ (CC) di semua perintah kompilasi Anda.
Kemudian, 'make debug' akan memiliki flag tambahan seperti -DDEBUG dan -g sedangkan 'make' tidak.
Sebagai tambahan, Anda dapat membuat Makefile Anda jauh lebih ringkas seperti yang disarankan posting lain.
sumber
Pertanyaan ini sering muncul ketika mencari masalah yang sama, jadi saya merasa solusi yang sepenuhnya diimplementasikan dijamin. Terutama karena saya (dan saya akan berasumsi orang lain) telah berjuang mengumpulkan semua jawaban bersama.
Di bawah ini adalah contoh Makefile yang mendukung beberapa tipe build di direktori yang terpisah. Contoh yang diilustrasikan menunjukkan debug dan rilis build.
Mendukung ...
sumber
src
, maka modifikasi barisSRCS = file1.c file2.c file3.c file4.c
untuk dibacaSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Jika dengan mengkonfigurasi rilis / build, Anda berarti Anda hanya perlu satu konfigurasi per makefile, maka itu hanyalah masalah dan decoupling CC dan CFLAGS:
Bergantung pada apakah Anda dapat menggunakan gnu makefile, Anda dapat menggunakan kondisional untuk membuatnya lebih menarik, dan mengontrolnya dari baris perintah:
lalu gunakan:
Jika Anda perlu mengontrol kedua konfigurasi pada saat yang sama, saya pikir lebih baik membangun direktori, dan satu membangun direktori / konfigurasi.
sumber
ifeq (DEBUG, 1)
) untuk saya,DEBUG
variabel diperlukan dibungkus dalam tanda kurung suka jadi:ifeq ($(DEBUG), 1)
.Perhatikan bahwa Anda juga dapat membuat Makefile Anda lebih sederhana, pada saat yang sama:
Sekarang Anda tidak perlu mengulang nama file di semua tempat. File .l akan dilewatkan melalui flex dan gcc, semua file .y akan dilewatkan melalui bison dan g ++, dan file .cpp hanya melalui g ++.
Cukup daftarkan file .o yang Anda harapkan berakhir, dan Make akan melakukan pekerjaan mencari tahu aturan mana yang dapat memenuhi kebutuhan ...
untuk catatan:
$@
Nama file target (yang sebelum titik dua)$<
Nama file prasyarat pertama (atau hanya) (yang pertama setelah titik dua)$^
Nama-nama semua file prasyarat (spasi terpisah)$*
Batang (bit yang cocok dengan%
wildcard dalam definisi aturan.sumber
$^
untuk semua file prasyarat.Anda dapat memiliki variabel
maka Anda dapat menggunakan pernyataan kondisional
sumber
Melengkapi jawaban dari sebelumnya ... Anda perlu referensi variabel yang Anda tentukan info dalam perintah Anda ...
sumber
ifeq (DEBUG, 1)
seharusnya dicatatifeq ($(DEBUG), 1)
. Saya menduga itu mungkin merujuk pada Jawaban Anda di sini.Anda juga dapat menambahkan sesuatu yang sederhana ke Makefile Anda seperti
Kemudian kompilasi untuk debugging
make DEBUG=1
sumber