質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1265閲覧

[Makefile] ディレクトリを再帰的に走査してコンパイルする方法

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/13 03:52

提示のMakefileですが以下のディレクトリ構成でComponentディレクトリにもソースファイルがある場合lib/srcを再帰的に走査してソースファイルのパスを一つの変数に入れてそれをコンパイルしてオブジェクトファイルにしたいのですがそれをするにはどんな関数を用いればいいのでしょうか? おそらくdir関数だと思うのですがそれを用いた続きの処理の書き方が知りたいです。

参考サイト:https://qiita.com/chibi929/items/b8c5f36434d5d3fbfa4a

Tree
shigurechan@shigurechan-System-Product-Name:~/Program/ScriptEditor$ tree . ├── Makefile ├── doc ├── lib │   ├── obj │   └── src │   ├── Component │   ├── Console.cpp │   ├── Console.hpp │   ├── Data.hpp │   ├── Debug.cpp │   ├── Debug.hpp │   ├── Help.cpp │   ├── Help.hpp │   ├── Input.cpp │   ├── Input.hpp │   ├── ListWindow.cpp │   ├── ListWindow.hpp │   ├── MenuWindow.cpp │   ├── MenuWindow.hpp │   ├── Render.cpp │   └── Render.hpp ├── log │   ├── error.log │   └── log.log ├── null.d ├── obj ├── run.sh └── src ├── Main.cpp ├── MainScreen.cpp └── MainScreen.hpp 8 directories, 23 files shigurechan@shigurechan-System-Product-Name:~/Program/ScriptEditor$
Makefile

makefile

1# ライブラリ 2LIB_DIR :=lib 3LIB_SRC_DIR :=$(LIB_DIR)/src 4LIB_OBJ_DIR :=$(LIB_DIR)/obj 5LIB_DEP_DIR :=$(LIB_DIR)/obj 6LIB_DEP :=$(wildcard $(LIB_DEP_DIR)/*.d) 7LIB_SRC :=$(wildcard $(LIB_SRC_DIR)/*.cpp) 8LIB_OBJ :=$(addprefix $(LIB_OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(LIB_SRC)))) $(wildcard $(LIB_OBJ_DIR)/*.o) 9LIB :=lib/libconsole.a 10 11# プロジェクト 12SRC_DIR :=src 13OBJ_DIR :=obj 14DEP_DIR :=obj 15DEP :=$(wildcard $(DEP_DIR)/*.d) 16SRC :=$(wildcard $(SRC_DIR)/*.cpp) 17OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 18PRG :=program 19 20# プロジェクト 21$(PRG): $(OBJ) $(LIB) 22 $(CXX) $(OBJ) -o $@ $(LIB) 23 24$(OBJ_DIR)/%.o: src/%.cpp 25 $(CXX) -c -MMD -MP $< -o $@ 26-include $(DEP) 27 28# ライブラリ 29$(LIB): $(LIB_OBJ) 30 ar rcs $@ $(LIB_OBJ) 31 32$(LIB_OBJ_DIR)/%.o: lib/src/%.cpp 33 $(CXX) -c -MMD -MP $< -o $@ 34-include $(LIB_DEP) 35 36# ライブラリ オブジェクト抽出 37ext_lib: 38 ar x /usr/lib/libncurses.a --output $(LIB_OBJ_DIR) 39 40# プロジェクトクリーン 41clean_pro: 42 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG) $(OBJ)/*.o 43 44# ライブラリクリーン 45clean_lib: 46 rm -f ./$(LIB) ./$(LIB_OBJ_DIR)/*.o ./$(LIB_DEP_DIR)/*.d 47 48# すべてクリーン 49clean: 50 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d $(PRG) $(OBJ)/*.o 51 rm -f ./$(LIB) ./$(LIB_OBJ_DIR)/*.o ./$(LIB_DEP_DIR)/*.d 52 53# すべて実行 54all: 55 make ext_lib 56 make 57

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

おそらくdir関数だと思うのですが

そう考えたらならどうしてマニュアルを読まないのですか? 読めば間違っていることがすぐにわかったはずです。

dir はパス (を表す文字列) からディレクトリ部分を抽出する関数です。 たとえば src/foo.c といったような文字列から src/ の部分を得るという用途の関数です。


GNU Make の直接的な機能としてはパスを再帰的に辿る機能は無いです。 Make は記述された依存関係を元に必要なアクションを実行するというのが役割ですので、ちょっとした関数があるのは便利なオマケ程度のものです。 そんなに充実した機能は期待できません。

Make は各種コマンドを呼出すのが役割ですから、シェルなどを呼出してファイル一覧を生成させればよいのです。

あるいは Component の中にそのディレクトリの中のものをビルドするための makefile を作っておくというのもよく行われる手法です。 トップレベルの makefile からはその makefile を元にビルドするように make コマンドを呼出すわけです。 独立性の高いライブラリをまとめる形でプロジェクトを構成する場合、個別のライブラリごとにもビルドが可能なようになっているのは好ましい構成です。

あるいは今の GNU Make には Guile (プログラミング言語 Scheme の処理系) が組み込まれていて、 Guile の機能を全面的に使うこともできるのでこれを活用すればよいのですが……。 そのために Scheme を学習するのも面倒でしょうし、 GNU Make をビルドするときに Guile を有効にしておく必要があるので使っている環境にある GNU Make で有効になっているかどうかはわかりません。 これはあまり頼りにならないですね。

投稿2022/08/13 09:25

SaitoAtsushi

総合スコア5515

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そういうことはふつーに行われてますんで、
適当にオープンソースのプロジェクトのソース一式を取得してきてmakefileを見てみれば参考になるかともいます。

投稿2022/08/13 04:29

y_waiwai

総合スコア87849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問