- ベストアンサー
makefileの特殊な使用方法
アプリの構成管理を行っております。 先日、自社開発のアプリXXXを市場に送り出すことができました。 しかし、バグが多く再リリースを繰り返しております。 そんな中、XXXの機能拡張版XXX2のリリースが決まりました。 ただ、XXXとソースは同じものを使用しコンパイルオプションでXXX2を作成しわけるという方針になりました。 こういった場合、どうすれば実装者が混乱しないか考えております。 例 XXX用 make all XXX2用 make Xall make clean make Xclean make lib make Xlib もしこのような状況になった場合、上記よりもよい方法がありましたらご教授ください。 環境 DEBIAN(ETCH) コンパイラ gcc よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
追記です。 >心配事としては、同じソースからXXXとXXX2を生成するので >cleanミスからオブジェクトを消し忘れ、バグの元となることでした。 >あと、makefileの中に >VERSION=XXX >と定義するのもありかなと感じました。 中間ファイルやターゲットファイルの出力先パスを指定する際に、 VERSION 変数を指定するというのもありかと思われます。 例えば、中間ファイルの出力先を OBJ_PATH = ./obj/ と書いているのであれば、 OBJ_PATH = ./obj/$(VERSION)/ と書き換えれば OBJ_PATH 変数は VERSION 変数が XXX の場合は OBJ_PATH = ./obj/XXX/ に、XXX2 の場合は OBJ_PATH = ./obj/XXX2/ になりますので、異なるバージョンで同じ中間ファイルを 参照してしまうことを回避できると思われます。
その他の回答 (3)
- entree
- ベストアンサー率55% (405/735)
再帰を用いて、こんな感じにしてみてはいかがでしょうか? all: if test 'x$(GCCOPT)' = x ; then echo 'make VERSION_XXX or make VERSION_XXX2' ; exit 1 ; fi ...... VERSION_XXX: make GCCOPT=(XXX 時の gcc オプション) VERSION_XXX2: make GCCOPT=(XXX2 時の gcc オプション) もう一つ、ディレクトリを分けるのであれば GNU make の場合 VPATH を使う方法があります。 ソースディレクトリ VERSION_XXX ビルド・ディレクトリ VERSION_XXX2 ビルド・ディレクトリ ソースディレクトリの Makefile GCCOPT を含まない通常の Makefile を記述 VERSION_XXX ビルド・ディレクトリの Makefile -- VPATH= (ソースディレクトリ) GCCOPT= (XXX 時の gcc オプション) include ../Makefile <== 括弧が必要だったかも -- VERSION_XXX2 ビルド・ディレクトリの Makefile -- VPATH= (ソースディレクトリ) GCCOPT= (XXX2 時の gcc オプション) include ../Makefile <== 括弧が必要だったかも --
- mtaka2
- ベストアンサー率73% (867/1179)
回答1とは別案。 コンパイルするディレクトリを分けるというのはどうでしょうか。 プロジェクトのディレクトリに、XXX と XXX2 という2つのディレクトリを作っておき、ソースは(XXX.o: ../XXX.c って感じで)親ディレクトリのファイルを参照するようにして、 ・ディレクトリXXXでは、XXX用のコンパイルオプションを付けてビルド ・ディレクトリXXX2では、XXX2用のコンパイルオプションを付けてビルド ように、それぞれのMakefileを書いておきます。 この方法だと、両方を同時にビルドできますし、 ビルドする場所が分離できているので、 「XXX用にコンパイルしたオブジェクトを消し忘れてXXX2をビルドし、おかしなものが出来てしまった」みたいなことになる心配がありません。 さらに、回答1の方法で共通のMakefileを作成しておき、 個別Makefileではオプション設定だけをして、 共通Makefileをincludeするようにすれば、 Makefileの管理も楽になります。
- chemo666
- ベストアンサー率80% (4/5)
GNU make だと思いますが、変数を使用して場合わけをするのは どうでしょうか。 Makefile 内では ifdef 文などを使います。 例えば、gcc に渡すオプションを切り替えるのであれば ifdef VERSION_XXX GCCOPT=(XXX 時の gcc オプション) else ifdef VERSION_XXX2 GCCOPT=(XXX2 時の gcc オプション) endif endif のように書いたりします。 (ifdef 文は変数が何かしらで定義されていれば真になります。 また、ifdef 文の代わりに、変数の内容を比較する ifeq 文なども 使えるかもしれません) 上記のように Makefile に記述しておけば、コマンドラインからは (XXX用) make all VERSION_XXX=yes make clean VERSION_XXX=yes (XXX2用) make all VERSION_XXX2=yes make clean VERSION_XXX2=yes のように変数を定義した状態で Makefile を呼び出すことで 処理の場合分けができます。 この方法だと、all / clean などの記述に依存しませんし、 今後バージョンが増えたとしても対応がしやすいかと思いますが どうでしょうか。
お礼
早速のご返答ありがとうございます。 やはり、chemo666様の方法が妥当な気がします。 心配事としては、同じソースからXXXとXXX2を生成するのでcleanミスからオブジェクトを消し忘れ、バグの元となることでした。 あと、makefileの中に VERSION=XXX と定義するのもありかなと感じました。 そうすればトップからのコマンドは make all make clean のみで済みます。とても良いご意見ありがとうございます。