「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > GNU Make を使用して同様のルールで複数の実行可能ファイルをビルドするにはどうすればよいですか?

GNU Make を使用して同様のルールで複数の実行可能ファイルをビルドするにはどうすればよいですか?

2024 年 11 月 7 日に公開
ブラウズ:972

 How to Build Multiple Executables with Similar Rules Using GNU Make?

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

Scons は有能なビルド ツールですが、目的の機能を実装するのは難しい場合があります。より簡単なアプローチは、GNU Make を利用することです。これにより、トップレベルと個々のプロジェクト ディレクトリの両方から簡単にビルドとクリーンアップが可能になります。

Makefile Setup

提供される Makefile all_lessons ディレクトリと個々のプロジェクト ディレクトリの両方からのビルドとクリーニングを有効にします。各プロジェクトの実行可能ファイルは、そのディレクトリに基づいて名前が付けられます。

プロジェクト構造

これを実現するには、次の例のようなプロジェクト構造をセットアップする必要があります。

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        user_created_add.cpp
        main.cpp

メイクファイルの内容

project.mk

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

Makefile

# project configuration

project_dirs := $(shell find * -maxdepth 0 -type d )
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

# rules

.SECONDEXPANSION:
objects = $(patsubst %.cpp,%.o,$(wildcard $(dir ${1})*.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 dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

使用法

個別からの構築プロジェクト ディレクトリ

[project_directory]$ ln -s ../project.mk Makefile  # create a symlink
[project_directory]$ make

最上位ディレクトリからのビルド

[all_lessons]$ make

個々のプロジェクト ディレクトリのクリーニング

[project_directory]$ cd ..
[all_lessons]$ make clean

すべてのプロジェクトのクリーニング

[all_lessons]$ make clean
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3