GNU/Linux >> Belajar Linux >  >> Linux

Buat file dengan file sumber di direktori berbeda

Cara tradisional adalah memiliki Makefile di setiap subdirektori (part1 , part2 , dll.) memungkinkan Anda membuatnya secara mandiri. Selanjutnya, miliki Makefile di direktori root proyek yang membangun segalanya. "Akar" Makefile akan terlihat seperti berikut:

all:
    +$(MAKE) -C part1
    +$(MAKE) -C part2
    +$(MAKE) -C part3

Karena setiap baris dalam make target dijalankan dalam cangkangnya sendiri, tidak perlu khawatir untuk menelusuri kembali pohon direktori atau ke direktori lain.

Saya sarankan untuk melihat manual make GNU bagian 5.7; ini sangat membantu.


Anda dapat menambahkan aturan ke Makefile root Anda untuk mengkompilasi file cpp yang diperlukan di direktori lain. Contoh Makefile di bawah harus menjadi awal yang baik untuk membawa Anda ke tempat yang Anda inginkan.

CC=g++
TARGET=cppTest
OTHERDIR=../../someotherpath/in/project/src

SOURCE = cppTest.cpp
SOURCE = $(OTHERDIR)/file.cpp

## End sources definition
INCLUDE = -I./ $(AN_INCLUDE_DIR)  
INCLUDE = -I.$(OTHERDIR)/../inc
## end more includes

VPATH=$(OTHERDIR)
OBJ=$(join $(addsuffix ../obj/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.o))) 

## Fix dependency destination to be ../.dep relative to the src dir
DEPENDS=$(join $(addsuffix ../.dep/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.d)))

## Default rule executed
all: $(TARGET)
        @true

## Clean Rule
clean:
        @-rm -f $(TARGET) $(OBJ) $(DEPENDS)


## Rule for making the actual target
$(TARGET): $(OBJ)
        @echo "============="
        @echo "Linking the target [email protected]"
        @echo "============="
        @$(CC) $(CFLAGS) -o [email protected] $^ $(LIBS)
        @echo -- Link finished --

## Generic compilation rule
%.o : %.cpp
        @mkdir -p $(dir [email protected])
        @echo "============="
        @echo "Compiling $<"
        @$(CC) $(CFLAGS) -c $< -o [email protected]


## Rules for object files from cpp files
## Object file for each file is put in obj directory
## one level up from the actual source directory.
../obj/%.o : %.cpp
        @mkdir -p $(dir [email protected])
        @echo "============="
        @echo "Compiling $<"
        @$(CC) $(CFLAGS) -c $< -o [email protected]

# Rule for "other directory"  You will need one per "other" dir
$(OTHERDIR)/../obj/%.o : %.cpp
        @mkdir -p $(dir [email protected])
        @echo "============="
        @echo "Compiling $<"
        @$(CC) $(CFLAGS) -c $< -o [email protected]

## Make dependancy rules
../.dep/%.d: %.cpp
        @mkdir -p $(dir [email protected])
        @echo "============="
        @echo Building dependencies file for $*.o
        @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^../obj/$*.o^" > [email protected]'

## Dependency rule for "other" directory
$(OTHERDIR)/../.dep/%.d: %.cpp
        @mkdir -p $(dir [email protected])
        @echo "============="
        @echo Building dependencies file for $*.o
        @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^$(OTHERDIR)/../obj/$*.o^" > [email protected]'

## Include the dependency files
-include $(DEPENDS)


Opsi VPATH mungkin berguna, yang memberi tahu membuat direktori apa yang harus dicari untuk kode sumber. Anda masih memerlukan opsi -I untuk setiap jalur penyertaan. Contoh:

CXXFLAGS=-Ipart1/inc -Ipart2/inc -Ipart3/inc
VPATH=part1/src:part2/src:part3/src

OutputExecutable: part1api.o part2api.o part3api.o

Ini akan secara otomatis menemukan file partXapi.cpp yang cocok di salah satu direktori yang ditentukan VPATH dan mengompilasinya. Namun, ini lebih berguna saat direktori src Anda dipecah menjadi subdirektori. Untuk apa yang Anda gambarkan, seperti yang dikatakan orang lain, Anda mungkin lebih baik menggunakan makefile untuk setiap bagian, terutama jika setiap bagian dapat berdiri sendiri.


Jika Anda memiliki kode di satu subdirektori yang bergantung pada kode di subdirektori lain, Anda mungkin lebih baik menggunakan satu makefile di tingkat teratas.

Lihat Membuat Rekursif Dianggap Berbahaya untuk alasan lengkapnya, tetapi pada dasarnya Anda ingin make memiliki informasi lengkap yang diperlukan untuk memutuskan apakah suatu file perlu dibangun kembali atau tidak, dan itu tidak akan terjadi jika Anda hanya menceritakannya sekitar sepertiga dari proyek Anda.

Tautan di atas sepertinya tidak dapat dijangkau. Dokumen yang sama dapat dijangkau di sini:

  • aegis.sourceforge.net (diarsipkan)
  • lcgapp.cern.ch

Linux
  1. Salin file &direktori di Linux

  2. File Cat Dengan Direktori?

  3. Menggabungkan Folder Dengan Mv?

  1. Pindahkan File Dengan Membaca Nama File Mereka Ke Direktori Berbeda?

  2. CloudCross – Menyinkronkan File dan Direktori dengan Beberapa Penyimpanan Cloud

  3. Cara Menyalin / Memindahkan File dan Direktori di Linux dengan perintah "cp" dan "mv"

  1. Temukan file dan direktori di Linux dengan perintah find

  2. Temukan direktori dengan semua file di dalamnya lebih tua dari X?

  3. File dengan konten yang sama tetapi dengan md5sum berbeda saat di-gzip?