ホームページ  >  記事  >  バックエンド開発  >  GNU Make は、ディレクトリ構造全体にわたって同様のルールを使用して多数の実行可能ファイルの構築を効率化し、メイン ディレクトリと個々のプロジェクト フォルダの両方からコンパイルできるようにすることができますか?

GNU Make は、ディレクトリ構造全体にわたって同様のルールを使用して多数の実行可能ファイルの構築を効率化し、メイン ディレクトリと個々のプロジェクト フォルダの両方からコンパイルできるようにすることができますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 16:07:02878ブラウズ

Can GNU Make streamline building numerous executables with similar rules across a directory structure, allowing compilation from both the main directory and individual project folders?

GNU Make を使用して同様のルールで複数の実行可能ファイルをビルドする

質問:

GNU Make はできますかディレクトリ構造内で同様のルールを持つ複数の実行可能ファイルのビルドを容易にし、メイン ディレクトリと個々のプロジェクト ディレクトリの両方からコンパイルできるようにしますか?

答え:

はい、GNU Make で処理できます。このタスクを簡潔かつ効率的なアプローチで実行します。以下は、目的の機能を実装する 2 つの Makefile:

project.mk:

all :
% : forward_ # build any target by forwarding to the main makefile
    $(MAKE) -C .. project_dirs=$(notdir ${CURDIR}) $@
.PHONY : forward_

Makefile:

# one directory per project, one executable per directory
project_dirs := $(shell find * -maxdepth 0 -type d )

# executables are named after its directory and go into the same directory
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

#  the rules

.SECONDEXPANSION:

objects = $(patsubst %.cpp,%.o,$(wildcard $(dir )*.cpp))

# link
${exes} : % : $$(call objects,$$*) Makefile
    g++ -o $@ $(filter-out Makefile,$^) ${LDFLAGS} ${LDLIBS}

# compile .o and generate dependencies
%.o : %.cpp Makefile
    g++ -c -o $@ -Wall -Wextra ${CPPFLAGS} ${CXXFLAGS} -MD -MP -MF ${@:.o=.d} $<

.PHONY: clean

clean :
    rm -f $(foreach exe,${exes},$(call objects,${exe})) $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d)) ${exes}

# include auto-generated dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

使用法:

  • 各プロジェクト ディレクトリに project.mk への Makefile という名前のシンボリック リンクを作成します。
  • 特定のプロジェクトをビルドするには、プロジェクト ディレクトリに移動します
  • すべてのプロジェクトをビルドするには、メイン ディレクトリ (all_lessons) から make を実行します。
  • 特定のプロジェクトをクリーンアップするには、プロジェクト ディレクトリから make clean を実行します。
  • すべてのプロジェクトをクリーンにするには、メイン ディレクトリから make clean を実行します。

利点:

  • 実装が簡単で、指定された要件に適しています。
  • メイン ディレクトリとプロジェクト ディレクトリの両方からのビルドとクリーンアップをサポートします。
  • 依存関係を自動的に生成し、完全に並列化できます。

以上がGNU Make は、ディレクトリ構造全体にわたって同様のルールを使用して多数の実行可能ファイルの構築を効率化し、メイン ディレクトリと個々のプロジェクト フォルダの両方からコンパイルできるようにすることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。