• ベストアンサー

makefileの特殊な使用方法

chemo666の回答

  • chemo666
  • ベストアンサー率80% (4/5)
回答No.1

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 などの記述に依存しませんし、 今後バージョンが増えたとしても対応がしやすいかと思いますが どうでしょうか。

amagramer
質問者

お礼

早速のご返答ありがとうございます。 やはり、chemo666様の方法が妥当な気がします。 心配事としては、同じソースからXXXとXXX2を生成するのでcleanミスからオブジェクトを消し忘れ、バグの元となることでした。 あと、makefileの中に VERSION=XXX と定義するのもありかなと感じました。 そうすればトップからのコマンドは make all make clean のみで済みます。とても良いご意見ありがとうございます。

関連するQ&A

  • 移植性の高いmakefileの作成

    移植性の高いmakefileの作成 C言語で書かれたソースファイルをmakeツールでビルドしています。 もともとコンパイラとして「Borland C++ Compiler 5.5.1」を使用し、Borland C++ 同ツール付属のmakeツール「MAKE Version 5.2」を使用していました。 makeの基本文法は理解しており、Borlandのコンパイラを使用している間は特に問題ありませんでした。 しかし最近、新たにGCC系列のMinGWという開発環境一式と、補助ツールMSYSを導入し、既存のmakefileをGCCおよびGNUmakeに対応させることにしました。 具体的には、 GMAKEを起動した場合はgccでコンパイルする。 Borland make を起動した場合にはbcc32でコンパイルする。 という切り替えを同一のmakefileで行おうと考えました。 しかし、ここで問題が発生しました。 makeの依存関係部分はborland付属make(以下Bmakeとします)とGNUmakeであまり違いはないのですが、単一のmakefileで対応しようとすると、どうしてもコンパイラオプションやコンパイルコマンドを切り替える部分が必要です。しかし、ifdefやincludeディレクティブに関してはお互いにまったく互換性がなく、片方のmakeで有効なフラグをつかってifdefで分岐しようとしても、もう片方では完全に文法エラーです。 例えば、ifdefやincludeディレクティブは、Bmakeでは先頭に!が必要ですが、GNUmakeには必要ありません。 以下の書籍でポータブルなmakefileの記述に関していろいろ調べたのですが、Bmakeの特殊な文法についての言及がなく、対応策が見つかりません。 様々な環境でビルドされるFireFox3.0のソースコードも参考にしようとmakefileと思われるファイルを全て検索したところ、1769個ほど見つかりました。 その中で!ifdefディレクティブを使用しているのは極わずかで、Makefile.winという名称のものがいくつかあっただけでした。 しかもそれらは最後の方にincludeディレクティブも使っていました。 例えば、MozillaFirefox3.0のソースコードにあるmakefaileの内、firefox-3.0-source.tar\mozilla\dbm\src\Makefile.winは「include <$(DEPTH)/config/rules.mak>等」、という一文がある一方、その他のifなどのディレクティブは頭に!をつけられており、全体としてはBmake(多分ターゲットはMSVC++だと思いますが。)です。 これはBmakeではエラーになるはずなのですが、動作機構は不明です。 また、条件付マクロというテクニックで、ある値が定義されていれば左値を、定義されてなければ右値を使ってマクロ置換するテクニックがあったので、これでディレクティブをマクロ置換してやろうと考えました。しかし、ディレクティブをマクロ定義することはできないようでこれも失敗しています。 #INCLUDE というマクロを定義して、 INCLUDE = $(_GNUMAKE_?include:!include) #マクロをディレクティブ命令として使う $(INCLUDE) testmake.mk それぞれのmake専用makefileを作るのは簡単ですが、新しいプログラムを追加するたびに複数のmakefileを書き直すのは避けたいのです。 長々と書きましたが、解決策として次の2つのいずれかのようなものがあれば教えていただきたいです。 1. ifやincludeディレクティブに代わる、GNUmakeとBmake両方に使えるテクニック。 2. 起動したmakeによって条件分岐、もしくは読み込むファイルを切り替えるテクニック。 よろしくお願いいたします。 開発環境 OS: winXP コンパイラ: 「Borland C++ Builder 6.0」「Borland C++ Compiler 5.5.1」「gcc version 3.4.5 (mingw special)」 make: 「MAKE Version 5.2 (C++ BuilderとC++ Compiler 5.5.1はおなじmakeを使用している模様)」「GNU Make version 3.79.1」 参考文献 1. 「GNU Make 第3版」オライリージャパン、2005年 2. 「C言語逆引き大辞典」秀和システム、2003年 3. 「GNUソフトウェアプログラミング」、?年

  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • Makefileと共有ライブラリ

    main.c sub1.c sub2.cに対して 共有ライブラリlibsub1.soとlibsub2.soを生成して それをもちいてmainをコンパイルするMakefileを以下のように記述しました。 CC=gcc LIB= CFLAGS=-Wall TARGET = main SHAD = -shared .SUFFIXES:.so .o SRCS = main.c libsub1.so libsub2.so $(TARGET):$(SRCS) $(CC) -o $@ $(SRCS) @echo "make finished!!" #.o.so: # $(CC) $(SHAD) -o $@ $< libsub1.so:sub1.o gcc -shared -o libsub1.so sub1.o libsub2.so:sub2.o gcc -shared -o libsub2.so sub2.o .c.o: $(CC) -c $< #sub1.o:sub1.c # gcc -c -fPIC sub1.c #sub2.o:sub2.c # gcc -c -fPIC sub2.c clean: @rm -f libsub?.so sub?.o ここで.oから.cを生成するのはサフィックスでできたのですが、同じように.oから.soを生成するのは できませんでした。 #.o.so: # $(CC) $(SHAD) -o $@ $< ここはどのように記述したらいいのでしょうか? 回答お願いします。

  • ktermのインストール方法

    Solaris5.7にktermをインストールしようとしています。 しかしながら、ROOTではインストールできないので、自分のローカルの環境にインストールしようとしています。 インストール先とコンパイラを gccにする という変更が必要です。 この場合、/usr/openwin/lib/X11/config/Imake.cf によると、ProjectRootの変更がまず必要であり、更にはsite.cfとsun.cfも書き換えなくては成らないので 上記ファイルのコメントに従いローカルにコピーをしてきてインストールをしようと試みています。 しかし、以下のことが分かりません。 1) ローカルにコピーしてきたlibを参照させるため、.cshrcのlibパスを変更した。 -->相変わらずセンタのものを見ているようだ???どうやればいいの?? 2) gccでコンパイルする旨、site.cfとsun.cfに書いているのにこれが反映されない。 このような感じで全く成功していないのですが、正統的な方法でroot以外がインストールをする方法と 一方でMakefileを書き換えちゃえばインストールできると思うので、その方法について教えて下さい。 若しくは参考になるHomeページを教えて下さい。

  • 玄箱PRO用gdbのクロスコンパイル

    現在、玄箱PROを使って勉強をしています。 なお、勉強するにあたって Debian化によるコンパイル環境は玄箱に入れない(組み込み開発の勉強をしているので) としています。 gdbを玄箱にインストールしようと思っているのですが、途中でエラーが出てしまいます。 エラーを解消するために調べてみたのですが、解消のための方法をまねしてもうまくいきませんでした。 クロスコンパイルの知識のある方、経験のある方どなたか御教示願えませんでしょうか? やった手順と環境です。 【環境】 コンパイル環境:CentOS 5.5 動作環境:玄箱PRO(Linux2.6) 【手順】 (1)http://www.codesourcery.com/sgpp/portal/datasheet?target_arch=ARM&target_os=EABI からARM用EABIコンパイラをダウンロードし、コンパイル環境に展開 (2)玄箱PROの付属CDからgdb-2005q3-2.tar.gzを展開 (3)2で展開されたgdb-2005q3-2.tar.bz2をさらに展開 (4)3で展開されたgdb-2005q3ディレクトリ内に移動 (5)環境変数を設定 export PATH="<1で展開したコンパイラのパス>/libexec/gcc/arm-none-linux-gnueabi/3.4.4" export PATH="<1で展開したコンパイラのパス>/bin" export CROSS_PREFIX="<任意のパス>" (6)CCの環境変数を設定 export CC="<1で展開したコンパイラのパス>/bin/arm-none-linux-gnueabi-gcc" (6)configure実行 ./configure --host="arm-none-linux-gnueabi" --target="arm-none-linux-gnueabi" --build="i686-pc-linux-gnueabi" --prefix=${CROSS_PREFIX} (7)make実行 エラーの内容は以下でした。 =================================================== ・ ・ ・ make[2]: *** [install-recursive] エラー 1 ・ ・ ・ make[1]: *** [install-bfd] エラー 2 =================================================== 【補足】 make installするとinclude、share、libのディレクトリはできている。 gdbとは別にgcc-2005q3-2のコンパイルは成功している。 以上

  • Debian(amd64)でdriverをコンパイルに失敗する

    Debian(amd64)でdriverをコンパイルに失敗する DebianでPT1のドライバをコンパイルしようとしたところ、 make[1]: ディレクトリ `/lib/modules/2.6.26-2-amd64/build' に入ります make[1]: *** ターゲット `modules' を make するルールがありません。中止 make[1]: ディレクトリから `/lib/modules/2.6.26-2-amd64/build' 出ます make" ***[pt1_drv.ko] エラー 2 となりドライバが作成できません。 調べたところmakeに失敗するのは下記がバージョンがずれているときと出ていましたがこれ以上は疎くわかりません。 dpkg -l | grep linux-source ii linux-source-2.6.26 2.6.26-24lenny1 dpkg -l | grep linux-headers ii linux-headers-2.6.26-2-amd64 2.6.26-24lenny1 ii linux-headers-2.6.26-2-common 2.6.26-24lenny1

  • AIX gcc コンパイルエラーにつきまして

    お世話になります。 Severもcもまったくわからない初心者なのですが質問させていただきます。 Make.plを実行してsoファイルを書き換えたいのですが、実行すると下記のようなエラーが出て最後までMakeが実行できません。 <ccを指定してコンパイル> 1506-507 (W) 使用できるライセンスはありません。プログラム提供者に連絡して、追加ユーザーを追加してください。 すぐにコンパイルが行われます。 <gccを指定してコンパイル> installation problem, cannot exec `cc1plus' Makeを実行したいのですがどうしたらよいでしょうか。 gccでコンパイル、他のコンパイラでの対応方法などありましたらご教授頂けると幸いです。 (ccの場合ライセンス自体が切れているっぽいのでできれば避けたいと考えています) 漠然とした質問で申し訳ないのですがよろしくお願いいたします。 OS -> AIX v4.3 cc -> CforAIX v.6 gcc -> powerpc-ibm-aix4.3.2.0 v 2.95.3

  • プログラム作成(コンパイル、リンク)でのコマンド

    プログラム素人です。 コンパイルオプション、あるいはコマンドなどいろいろとあり判らずにいます。 例えば、 $ gcc -fPIC -c xxx.c $ gcc -shared -Wl,-soname,libxxx.so.1 -o libxxx.so.1.0 xxx.o # cp libxxx.so.1.0 /usr/lib # /sbin/ldconfig /usr/lib # ln -s /usr/lib/libxxx.so.1 /usr/lib/libxxx.so とか $ ar rv libxxx.a xxx.o $ ranlib libxxx.a $ strip libxxx.a など(ほんの一部だと思いますが)これらのコマンドの意味役割など知りたいのですが、書籍などありますでしょうか。 ネット上で検索してみましたがキーワードが悪いのかよいサイトに出会えません。 皆様、よいアドレス、書籍あればご紹介下さい。

  • gccの「-l」オプションとライブラリの関係

    gcc の -l オプションってどのような動作なのでしょうか?? sendmail関係の少々実験的な開発をするために、 OSに標準で入っているsendmail関係のライブラリである、   /usr/lib/libmilter.a   /usr/lib/libmilter.so   /usr/lib/libmilter.so.3 を削除して、 sendmailをソースからコンパイルして、 sendmailのソースの中のlibmilterもコンパイルしました。 この時点で、libmilter.a は、コンパイルしたディレクトリ(/usr/local/src/sendmail-8.14.2/)の下の   /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/ の中にしか存在しないのですが・・・ gcc -pthread -lc_r \   -L/usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/ \   -lmilter \   test.c としてコンパイルしようとすると、libmilter の中にある関数が、 ことごとく「undefined reference」になってしまいます。 これを、-L や -lオプションでライブラリを探させるのをやめて、明示的に gcc -pthread -lc_r \   test.c \   /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/libmilter.a と書くと、問題なくコンパイル&リンクできるのですが・・・ なぜなのでしょうか??

  • コンパイラオプション? VC2005設定?

    Visual Studio 2005で MFCを使って、πの計算や、大きな桁の計算を高速で行う為に、64bitのコードを生成したいのですが、普通にコンパイルするとRelease Win32でコンパイルされると思います。 設定方法について詳しく書かれているサイトや書籍をご存じの方教えて下さい。 make出力は可能なのでしょうか? VC6にあったような・・・ コンパイラオプション? 環境 マシン Xeon 64bit Windows Vista Ultimate VS2005 C++ MFCアプリ