Saya perlu membuat direktori di makefile saya dan saya tidak ingin "direktori sudah ada kesalahan" berulang-ulang meskipun saya dapat dengan mudah mengabaikannya.
Saya terutama menggunakan mingw / msys tetapi ingin sesuatu yang berfungsi di shell / sistem lain juga.
Saya mencoba ini tetapi tidak berhasil, ada ide?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
tidak berfungsi pada Windows, yang mungkin ditanyakan oleh pertanyaan itu. Tidak yakin bagaimana ini bisa diterima.make -p
Unix atau Linux?Melihat dokumentasi resmi make , berikut adalah cara yang baik untuk melakukannya:
Anda harus melihat di sini penggunaan | operator pipa, hanya mendefinisikan prasyarat pesanan. Artinya
$(OBJDIR)
target harus ada (bukan yang lebih baru ) untuk membangun target saat ini.Perhatikan bahwa saya dulu
mkdir -p
. The-p
bendera ditambahkan dibandingkan dengan contoh dokumentasi. Lihat jawaban lain untuk alternatif lain.sumber
$(OBJDIR)
target harus ada " . Lakukan pemeriksaan untuk keberadaan file (dan stempel waktu) untuk memutuskan apakah perlu membangun target. Oleh karena itu di sini, jika$(OBJDIR)
tidak ada maka akan dibangun, sehingga ada untuk membangun target saat ini$(OBJS)
, yang akan dibuat di dalam.Anda dapat menggunakan perintah tes:
sumber
make -j
) karena kondisi balapan antara saat direktori diuji keberadaan dan dibuat. Satu pekerjaan dapat menguji bahwa itu tidak ada, tetapi sebelum membuatnya, pekerjaan lain membuat direktori. Kemudian ketika yang pertama mencoba membuatnya akan gagal karena direktorinya sudah ada. Solusi terbaik dalam hal ini adalah menggunakan prasyarat hanya pesanan seperti yang disebutkan dalam jawaban @ TeKa (yang seharusnya merupakan jawaban yang diterima).Berikut adalah trik yang saya gunakan dengan GNU make untuk membuat direktori compiler-output. Pertama tentukan aturan ini:
Kemudian buat semua file yang masuk ke direktori bergantung pada file .d di direktori itu:
Catat penggunaan $ <bukan $ ^.
Terakhir, cegah file .d dihapus secara otomatis:
Melewati file .d, dan bergantung langsung pada direktori, tidak akan berfungsi, karena waktu modifikasi direktori diperbarui setiap kali file ditulis dalam direktori itu, yang akan memaksa pembangunan kembali di setiap pemanggilan make.
sumber
Jika memiliki direktori yang sudah ada bukanlah masalah bagi Anda, Anda bisa mengarahkan stderr untuk perintah itu, menyingkirkan pesan kesalahan:
sumber
Di dalam makefile Anda:
sumber
Di Windows
Di Unix | Linux
sumber
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
sumber
Yang juga berfungsi untuk beberapa direktori, mis.
Menambahkan
$(OBJDIR)
sebagai target pertama bekerja dengan baik.sumber
Ia bekerja di bawah mingw32 / msys / cygwin / linux
sumber
Jika Anda secara eksplisit mengabaikan kode pengembalian dan membuang aliran kesalahan maka make Anda akan mengabaikan kesalahan jika itu terjadi:
Ini seharusnya tidak menyebabkan bahaya balapan secara paralel - tetapi saya belum mengujinya untuk memastikannya.
sumber
Sedikit lebih sederhana dari jawaban Lars:
dan aturan umum:
Tidak ada file sentuh untuk dibersihkan atau dibuat. BERHARGA :-)
Jika Anda ingin melihat sedikit trik gmake umum lainnya, atau jika Anda tertarik dengan pembuatan non-rekursif dengan perancah minimal, Anda mungkin perlu memeriksa Dua trik gmake murah lainnya dan pos terkait make lainnya di blog itu.
sumber