GNU/Linux >> Linux の 問題 >  >> Linux

ソース ファイルが異なるディレクトリにある Makefile

伝統的な方法は Makefile を持つことです 各サブディレクトリ (part1part2 など) 独立してビルドできます。さらに、 Makefile を持っています すべてをビルドするプロジェクトのルート ディレクトリ。 「ルート」 Makefile 次のようになります:

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

make ターゲットの各行は独自のシェルで実行されるため、ディレクトリ ツリーをさかのぼったり、他のディレクトリに戻ったりすることを心配する必要はありません。

GNU make マニュアルのセクション 5.7 を参照することをお勧めします。とても役に立ちます。


他のディレクトリにある必要な cpp ファイルをコンパイルするために、ルート Makefile にルールを追加できます。以下の Makefile の例は、目的の場所に到達するための良い出発点となるはずです。

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)


ソースコードを検索するディレクトリを make に指示する VPATH オプションが役立つ場合があります。ただし、インクルード パスごとに -I オプションが必要です。例:

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

OutputExecutable: part1api.o part2api.o part3api.o

これにより、VPATH で指定されたディレクトリのいずれかで一致する partXapi.cpp ファイルが自動的に検索され、それらがコンパイルされます。ただし、これは、src ディレクトリがサブディレクトリに分割されている場合により便利です。他の人が言ったように、あなたが説明したことについては、特に各部分が独立している場合は、各部分のメイクファイルを使用する方がおそらく良いでしょう.


あるサブディレクトリのコードが別のサブディレクトリのコードに依存している場合は、トップレベルで単一の makefile を使用する方がよいでしょう。

完全な根拠については Recursive Make Considered Harmful を参照してください。ただし、基本的には、ファイルを再構築する必要があるかどうかを判断するために必要な完全な情報を make に持たせたいと考えています。あなたのプロジェクト。

上のリンクにアクセスできないようです。同じドキュメントにアクセスできます:

  • aegis.sourceforge.net (アーカイブ)
  • lcgapp.cern.ch

Linux
  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. 最大のファイルまたはディレクトリを見つけますか?

  3. ネストされたすべてのディレクトリの下にあるすべてのファイルを、シェルのグロビングで一致させます

  1. Linuxでファイルとディレクトリを圧縮する方法(例付き)

  2. Linuxでファイルとディレクトリをコピーする

  3. gzip を実行すると、内容は同じだが md5sums が異なるファイル?

  1. ディレクトリ付きの猫ファイル?

  2. フォルダをMvとマージしますか?

  3. ファイル名を別のディレクトリに読み取ってファイルを移動しますか?