• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:移植性の高いmakefileの作成)

移植性の高いmakefileの作成

このQ&Aのポイント
  • C言語ソースファイルをmakeツールでビルドする際の移植性向上のための問題について。BorlandのmakeツールとGCC系列のMinGWを使用する場合の問題点と対策方法を検討している。
  • BorlandのmakeツールとGCC系列のMinGWを同一のmakefileで対応する方法について検討している。ifdefやincludeディレクティブの互換性の問題があり、条件分岐やファイルの切り替えのテクニックを探している。
  • FireFox3.0のソースコードを参考に移植性の高いmakefileの記述方法を模索している。ifdefやincludeディレクティブの違いによる文法エラーの解決策を求めている。条件付マクロのテクニックも試したが失敗している。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

GNU make 用には GNUmakefile という名前にするのはどうだろうか. もちろん共通なものは両方から include するようにして.

kolona
質問者

お礼

回答ありがとうございます。 依存関係ファイルを共有にし、それを読み込むファイルを切り替えるということですね? 調べてみたところ、 GNUMakeは、「GNUmakefile」、「makefile」、「Makefile」の順でファイルを探す。 それ以外のmakeは「makefile」か「Makefile」というファイルを探す。 ということですので、この方法で良さそうです。考えてみたら、includeされるファイルを切り替えるより、最初に読み込まれるファイルを切り替えて共有の依存関係を読み込むほうが自然ですね・・・。 ご助言を参考に以下の3ファイルを作り、現在正常に動いております。 GNUmakefile ・・・・・GNUMakeに読み込まれて、GNUMake用のマクロを設定し、依存関係ファイルComonMakefile.inを読み込む。 makefile ・・・・・・BorlandMakeに読み込まれて、BMake用のマクロを設定し、ComonMakefile.inを読み込む。 ComonMakefile.in・・・依存関係と、マクロを使った明示的な構築ルール、サフィックスルールを設定する。 これでうまくいきそうです。ありがとうございました。

kolona
質問者

補足

今後、同じ内容で質問される方のために補足で情報をまとめときます。参考までに。 同じ環境内でGNUMakeとBorlandMake(MSVC++のmakeであるnmakeとほぼ互換)を使用できるようにする。 依存関係ファイルは書式が共通なので、ひとつのファイルにまとめる。ファイル名「ComonMakefile.in」。 このファイルを読み込むmakeファイルを2系統作る。ファイル名指定無しで、デフォルトで読み込むファイル名の違いを使って、二つのmakeを使い分ける。 GNUMakeは最初に「GNUmakefile」というファイルを読み込むので、このファイルにGNUmake特有の設定やincludeを行う。 Borland Makeは最初に「makefile」を読み込む(Win環境ではMakefileと同じ)ので、このファイルにBmake特有の設定や !include などを行う。 以下に3つのファイルの例を挙げときます。 「GNUmakefile」 # コンパイルとリンク CC = gcc -o #コンパイルのみ(compile only) CCO = gcc -c -o # リソースの付加 RC = # # ファイルの消去 RM = rm -f # 通常使うプログラムの依存関係makefile include ComonMakefile.in # 一個ずつコンパイルするときに、フルネームでなく短いターゲット名を使うためのメイクファイル include sname.mk # 正式ではない、テスト段階のプログラムのメイクファイル include testmake.mk 「makefile」 # コンパイルとリンク CC = bcc32 -e # コンパイルのみ(compile only) CCO = bcc32 -c -o # リソースの付加 RC = brc32 -v # ファイルの消去 RM = del # 通常使うプログラムの依存関係makefile !include ComonMakefile.in # 一個ずつコンパイルするときに、フルネームでなく短いターゲット名を使うためのメイクファイル !include sname.mk # 正式ではない、テスト段階のプログラムのメイクファイル !include testmake.mk 「ComonMakefile.in」 # サフィックスルール .c.exe: ____CC $(*<).c ALLEXE = hello.exe helloC.exe all: $(ALLEXE) clean: ____$(RM) *.obj ____$(RM) *.tds ____$(RM) icon\*.res ____$(RM) *.bak hello.exe: hello.obj Lib-helloprint.obj ____$(CC)hello.obj Lib-helloprint.obj helloC.exe: helloC.obj Lib-helloprint.obj ____$(CC)helloC.obj Lib-helloprint.obj # 本体の依存関係 hello.obj: hello.c ____$(CCO)hello.obj hello.c helloC.obj: helloC.c ____$(CCO)helloC.obj helloC.c # ライブラリの依存関係 Lib-helloprint.obj: Lib-helloprint.c ____$(CCO)Lib-helloprint.obj Lib-helloprint.c Lib-testprint.h

その他の回答 (1)

  • noyuo
  • ベストアンサー率39% (33/84)
回答No.2

たいへんよく調べられているようなので、より良い方法がありそうですが、そこまでMakefileを複雑にさせる方法もありですが、 ご自身のソフトを広く配布するのでなければ、 makefile.B から makefile.GCC を自動生成するくらい、あなたなら簡単そうに思えます。

kolona
質問者

お礼

ご助言ありがとうございます。 >makefile.GCC >を自動生成する ということですが、autoconfとautomakeを使うという解釈でよろしいでしょうか? まったく使用したことがないので試してみたのですが、どちらもGNU系のツールで、Windows環境に単独では対応してないようです。 msys用のパッケージがあったのでインストールして、今やり方を調べているところですが、一筋縄ではいきそうもありません。 現在、Tacosan氏の助言を参考に、3種類のmakefileを作るという方法で対応してみました。 時間はかかりますが、せっかくですので、autoconfもできるようになっておこうと思います。 ありがとうございました。

関連するQ&A