GNU/Linux >> Znalost Linux >  >> Linux

Makefiles se zdrojovými soubory v různých adresářích

Tradičním způsobem je mít Makefile v každém z podadresářů (part1 , part2 , atd.), což vám umožní postavit je samostatně. Dále mějte Makefile v kořenovém adresáři projektu, který vše vytváří. "Root" Makefile bude vypadat nějak takto:

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

Vzhledem k tomu, že každý řádek v cíli make je spuštěn ve svém vlastním shellu, není třeba se starat o procházení stromu adresářů nebo do jiných adresářů.

Doporučuji podívat se do GNU make manual sekce 5.7; je to velmi užitečné.


Do svého kořenového souboru Makefile můžete přidat pravidla, abyste mohli zkompilovat potřebné soubory cpp v jiných adresářích. Níže uvedený příklad Makefile by měl být dobrým začátkem k tomu, abyste se dostali tam, kde chcete být.

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)


Mohla by se hodit volba VPATH, která říká make, ve kterých adresářích hledat zdrojový kód. Stále byste však potřebovali volbu -I pro každou cestu začlenění. Příklad:

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

OutputExecutable: part1api.o part2api.o part3api.o

To automaticky najde odpovídající soubory partXapi.cpp v libovolném adresáři specifikovaném VPATH a zkompiluje je. To je však užitečnější, když je váš adresář src rozdělen na podadresáře. Pro to, co popisujete, jak již řekli jiní, je pro vás pravděpodobně lepší vytvořit soubor makefile pro každou část, zvláště pokud každá část může stát samostatně.


Pokud máte kód v jednom podadresáři závislý na kódu v jiném podadresáři, pravděpodobně vám bude lépe s jedním makefile na nejvyšší úrovni.

Úplné zdůvodnění naleznete v části Rekurzivní způsob, který je považován za škodlivý, ale v zásadě chcete mít k dispozici úplné informace, které potřebuje k rozhodnutí, zda je třeba soubor znovu sestavit, a nebude to mít, pokud mu řeknete jen asi třetinu váš projekt.

Zdá se, že výše uvedený odkaz není dostupný. Stejný dokument je dostupný zde:

  • aegis.sourceforge.net (archivováno)
  • lcgapp.cern.ch

Linux
  1. Najít největší soubory nebo adresáře?

  2. Linux – různé formáty objektových souborů v Linuxu?

  3. CloudCross – Synchronizace souborů a adresářů s více cloudovými úložišti

  1. Jak kopírovat / přesouvat soubory a adresáře v Linuxu pomocí příkazů „cp“ a „mv“.

  2. Přiřaďte všechny soubory ve všech vnořených adresářích pomocí shell globbing

  3. Jak mohu zrcadlit adresář pomocí wget bez vytváření nadřazených adresářů?

  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Jak komprimovat soubory a adresáře v systému Linux (s příklady)

  3. Soubory se stejným obsahem, ale s různými součty md5 při gzipování?