Saya memiliki proyek C / C ++ yang diselenggarakan seperti ini:

project
   |
   +---- c
   |     |
   |     +---- subproject1
   |     |         |
   |     |         +---- bin
   |     |         |
   |     |         +---- obj
   |     |         |
   |     |         +---- src
   |     |
   |     +---- subproject2
   |               |
   |               +---- bin
   |               |
   |               +---- obj
   |               |
   |               +---- src
   |     
   +-----+ cpp
   |     |
   |     +---- subproject1
   |     |         |
   |     |         +---- bin
   |     |         |
   |     |         +---- obj
   |     |         |
   |     |         +---- src


  etcetera

Pada level project, ada makefile yang berisi yang berikut:

SUBDIRS = c cpp

all: $(SUBDIRS)

.PHONY: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -C $@

Sub-direktori c dan cpp berisi makefile serupa dengan definisi SUBDIRS yang berbeda. Mengetik make pada prompt perintah dari project, c atau cpp Penyebab membuat untuk mengubah direktori ke setiap direktori sudb di SUBDIRS dan menjalankan Makefile sub-direktori itu. Ini berperilaku persis seperti yang dijelaskan dalam GNU membuat manual $@ dan itu akan memohon target itu dalam makefile sub-direktori. Juga hebat, tetapi apa manual tidak memberikan panduan tentang apa yang harus dilakukan ketika SUBDIRS berisi lebih dari satu sub-direktori, sebagai direktori {{x10} dan {{{x11} saya. Saya akan memberi Anda dua metode yang saya tahu bekerja dan kemudian saya akan mengajukan pertanyaan saya.

  1. Tambahkan target untuk setiap sub-direktori dalam resep target clean:
  clean:
      $(MAKE) -C c $@
      $(MAKE) -C cpp $@
  1. Loop atas setiap sub-direktori dalam resep target clean (pada dasarnya sama dengan metode 1, tetapi lebih mudah untuk menambahkan lebih banyak sub-proyek ke):
  clean:
      @for subdir in $(SUBDIRS); do $(MAKE) -C $$subdir $@; done

Pertanyaan saya adalah, apakah ada cara untuk mencapai hal di atas yang membutuhkan hanya menggunakan GNU yang ada, sesuatu seperti ini (yang tidak berfungsi btw):

$(SUBDIRS) clean:
    $(MAKE) -C c $@
0
Moebius-Rex 5 April 2021, 00:12

1 menjawab

Jawaban Terbaik

Saya akan mendeklarasikan per-direktori phony membersihkan target dan menambahkannya sebagai prasyarat clean:

CLEANSUBDIRS = $(addprefix clean-,$(SUBDIRS))
.PHONY: clean $(CLEANSUBDIRS)
clean: $(CLEANSUBDIRS)
$(CLEANSUBDIRS): clean-%:
    $(MAKE) -C $* clean
1
Renaud Pacalet 5 April 2021, 09:03