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

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

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

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

Q&A

解決済

1回答

514閲覧

makefile入門者 -Iが必要なファイルとそうじゃないファイルでコンパイルを分岐したい。

退会済みユーザー

退会済みユーザー

総合スコア0

makefile

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

0グッド

0クリップ

投稿2021/09/29 06:55

提示コードですが構文エラが出ます。コメント部のコードなのですが-I/usr/local/include/freetype2 が必要なファイルとそうじゃないファイルがif文よる分岐で警告文を避けたのですがなぜ構文エラーがでるのでしょうか?

参考サイト: https://scrapbox.io/ebiken/Makefile_%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%AD%98%E5%9C%A8%E7%A2%BA%E8%AA%8D

参考サイト: https://qiita.com/wyamamo/items/09d03351818b760df9f1

makefile

1PRG :=GL 2SRC_DIR :=source 3OBJ_DIR :=obj 4DEP_DIR :=obj 5DEP :=$(wildcard $(DEP_DIR)/*.d) 6SRC :=$(wildcard $(SRC_DIR)/*.cpp) 7OBJ :=$(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRC)))) 8LDFLAGS :=`pkg-config --libs=opengl glew glfw3 freetype2` 9 10 11 12$(PRG): $(OBJ) 13 #$(CXX) $^ -l ncurses -o $@ 14 $(CXX) $^ -o $@ $(LDFLAGS) 15 16///////////////////////////////////////////////////////////////////////////////////////////////// 17$(OBJ_DIR)/%.o: source/%.cpp 18 ifeq ($<,source/text.cpp) 19 $(CXX) -std=c++2a -I/usr/local/include/freetype2 -c -MMD -MP $< -o $@ 20 -include $(DEP) 21 else 22 $(CXX) -std=c++2a -c -MMD -MP $< -o $@ 23 -include $(DEP) 24 endif 25//////////////////////////////////////////////////////////////////////////////////////////////// 26 27clean: 28 rm -f ./$(OBJ_DIR)/*.o *.out ./$(OBJ_DIR)/*.d *.a $(PRG) 29

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

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

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

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

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

guest

回答1

0

ベストアンサー

makefile

1$(OBJ_DIR)/%.o: source/%.cpp 2 ifeq ($<,source/text.cpp) 3 $(CXX) -std=c++2a -I/usr/local/include/freetype2 -c -MMD -MP $< -o $@ 4 -include $(DEP) 5 else 6 $(CXX) -std=c++2a -c -MMD -MP $< -o $@ 7 -include $(DEP) 8 endif

この構文ではifeq以降はシェルコマンドとして認識され、そのままシェルで実行されます。

makefile

1$(OBJ_DIR)/%.o: source/%.cpp 2ifeq ($<,source/text.cpp) 3 $(CXX) -std=c++2a -I/usr/local/include/freetype2 -c -MMD -MP $< -o $@ 4 -include $(DEP) 5else 6 $(CXX) -std=c++2a -c -MMD -MP $< -o $@ 7 -include $(DEP) 8endif

とすればよいかと。

なお、これはあくまでも構文の誤りの指摘で、上記のような判定と分岐がパターンルール適用時に可能かどうかは私はわかりません。まあやってみればいいと思います。

GNU make 日本語訳(Coop編) - Makefileの条件分岐部分

条件分岐ではmakeがmakefile中に実際に「見る部分」を制御するため、実行時のシェルコマンドを制御するのに条件分岐は使えません。

投稿2021/09/29 07:00

編集2021/09/29 07:04
itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/09/29 07:16 編集

質問ですがif文によるインクルードするしないの処理は分岐は正解なのでしょうか?
itagagaki

2021/09/29 07:28

コマンドに-Iオプションを付けるか付けないかという意味ですよね? 特殊な場合以外、普通は余計に付ける分には害が無いので、だいたい全部付けちゃったりしますけどね。 つまり、わざわざそんな分岐をmakefileの中に入れる必要はあまりないかなと。 でもまあそれは自由だし状況次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問