Saya punya proyek di mana struktur direktori seperti ini:
$projectroot
|
+---------------+----------------+
| | |
part1/ part2/ part3/
| | |
+------+-----+ +---+----+ +---+-----+
| | | | | | |
data/ src/ inc/ src/ inc/ src/ inc/
Bagaimana saya harus menulis file makefile yang berada di bagian / src (atau di mana pun benar-benar) yang dapat mengisi / menautkan pada file sumber c / c ++ di bagian? / Src?
Dapatkah saya melakukan sesuatu seperti -I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src ...
Jika itu akan berhasil, apakah ada cara yang lebih mudah untuk melakukannya. Saya telah melihat proyek di mana ada file makefile di masing-masing bagian yang sesuai? folder. [di posting ini saya menggunakan tanda tanya seperti pada sintaks bash]
recursive invocation
, bahwa coule akan cukup elegan.Jawaban:
Cara tradisional adalah untuk memiliki
Makefile
di setiap subdirektori (part1
,part2
, dll) yang memungkinkan Anda untuk membangun mereka secara independen. Selanjutnya, milikiMakefile
di direktori root proyek yang membangun semuanya. "Root"Makefile
akan terlihat seperti berikut:Karena setiap baris dalam target make dijalankan di shell-nya sendiri, tidak perlu khawatir tentang melintasi kembali pohon direktori atau ke direktori lain.
Saya sarankan melihat GNU make manual bagian 5.7 ; ini sangat membantu.
sumber
+$(MAKE) -C part1
dll. Ini memungkinkan kontrol pekerjaan Make untuk bekerja ke dalam subdirektori.Jika Anda memiliki kode dalam satu subdirektori bergantung pada kode di subdirektori lain, Anda mungkin lebih baik dengan satu makefile di tingkat atas.
Lihat Membuat Rekursif Dianggap Berbahaya untuk dasar pemikiran penuh, tetapi pada dasarnya Anda ingin membuat memiliki informasi lengkap yang diperlukan untuk memutuskan apakah suatu file perlu dibangun kembali atau tidak, dan tidak akan ada jika Anda hanya memberi tahu sekitar sepertiga dari proyek Anda.
Tautan di atas tampaknya tidak dapat dijangkau. Dokumen yang sama dapat dijangkau di sini:
sumber
Opsi VPATH mungkin berguna, yang memberi tahu direktori apa yang harus dicari untuk kode sumber. Anda masih membutuhkan opsi -I untuk setiap path yang disertakan. Sebuah contoh:
Ini secara otomatis akan menemukan file partXapi.cpp yang cocok di salah satu direktori yang ditentukan VPATH dan mengkompilasinya. Namun, ini lebih berguna ketika direktori src Anda dipecah menjadi subdirektori. Untuk apa yang Anda gambarkan, seperti yang dikatakan orang lain, Anda mungkin lebih baik dengan makefile untuk setiap bagian, terutama jika setiap bagian dapat berdiri sendiri.
sumber
VPATH=..
bekerja untuk saya!Anda dapat menambahkan aturan ke root Makefile Anda untuk mengkompilasi file cpp yang diperlukan di direktori lain. Contoh Makefile di bawah ini harus menjadi awal yang baik untuk membawa Anda ke tempat yang Anda inginkan.
sumber
Jika sumber tersebar di banyak folder, dan masuk akal untuk memiliki Makefile individual maka seperti yang disarankan sebelumnya, make rekursif adalah pendekatan yang baik, tetapi untuk proyek yang lebih kecil saya merasa lebih mudah untuk membuat daftar semua file sumber di Makefile dengan jalur relatif mereka ke Makefile seperti ini:
Saya kemudian dapat mengatur
VPATH
seperti ini:Lalu saya membangun objek:
Sekarang aturannya sederhana:
Dan membangun output lebih mudah:
Satu bahkan dapat membuat
VPATH
generasi otomatis oleh:Atau menggunakan fakta yang
sort
menghapus duplikat (meskipun seharusnya tidak masalah):sumber
Saya pikir lebih baik menunjukkan bahwa menggunakan Make (rekursif atau tidak) adalah sesuatu yang biasanya Anda ingin hindari, karena dibandingkan dengan alat saat ini, sulit untuk belajar, mempertahankan, dan skala.
Ini adalah alat yang luar biasa tetapi penggunaan langsungnya harus dianggap usang pada tahun 2010+.
Kecuali, tentu saja, Anda bekerja di lingkungan khusus yaitu dengan proyek warisan dll.
Gunakan IDE, CMake atau, jika Anda kesulitan, Autotools .
(diedit karena downvotes, ty Honza untuk menunjukkan)
sumber
Posting RC sangat bermanfaat. Saya tidak pernah berpikir untuk menggunakan fungsi $ (dir $ @), tetapi ia melakukan apa yang saya butuhkan.
Di parentDir, memiliki banyak direktori dengan file sumber di dalamnya: dirA, dirB, dirC. Berbagai file bergantung pada file objek di direktori lain, jadi saya ingin dapat membuat satu file dari dalam satu direktori, dan meminta agar membuat dependensi itu dengan memanggil makefile yang terkait dengan dependensi itu.
Pada dasarnya, saya membuat satu Makefile di parentDir yang memiliki (di antara banyak hal lain) aturan umum yang mirip dengan RC:
Setiap subdirektori menyertakan makefile tingkat atas ini untuk mewarisi aturan umum ini. Di Makefile masing-masing subdirektori, saya menulis aturan khusus untuk setiap file sehingga saya bisa melacak semua yang bergantung pada masing-masing file.
Setiap kali saya perlu membuat file, saya menggunakan (pada dasarnya) aturan ini untuk secara rekursif membuat semua / semua dependensi. Sempurna!
CATATAN: ada utilitas yang disebut "makepp" yang tampaknya melakukan tugas ini bahkan lebih secara intuitif, tetapi demi portabilitas dan tidak bergantung pada alat lain, saya memilih untuk melakukannya dengan cara ini.
Semoga ini membantu!
sumber
Penggunaan Make secara Rekursif
Ini memungkinkan untuk
make
dipisah menjadi beberapa pekerjaan dan menggunakan banyak coresumber
make -j4
?make
untuk menggunakan kontrol pekerjaan sama sekali. Saat menjalankan proses make yang terpisah, itu tidak tunduk pada kontrol pekerjaan.Saya mencari sesuatu seperti ini dan setelah beberapa kali mencoba dan jatuh saya membuat makefile saya sendiri, saya tahu itu bukan "cara idiomatis" tetapi ini adalah permulaan untuk memahami make dan ini bekerja untuk saya, mungkin Anda bisa mencoba dalam proyek Anda.
Saya tahu itu sederhana dan bagi sebagian orang flag saya salah, tetapi seperti yang saya katakan ini adalah Makefile pertama saya untuk mengkompilasi proyek saya dalam beberapa dir dan menghubungkan semua itu bersama-sama untuk membuat bin saya.
Saya menerima saran: D
sumber
Saya sarankan untuk menggunakan
autotools
://##
Tempatkan file objek yang dihasilkan (.o) ke direktori yang sama dengan file sumbernya, untuk menghindari tabrakan saat make non-rekursif digunakan.hanya memasukkannya ke dalam
Makefile.am
hal-hal sederhana lainnya.Ini tutorialnya .
sumber