web-dev-qa-db-ja.com

32ビットと64ビットの両方に単一のメイクファイルを作成するにはどうすればよいですか?

Linuxで透過的に機能するmakefileがあります(x86_64)およびOS X Intel(x86_64)。これは64ビット固有のGCCオプションを使用します。

32ビットおよび64ビットOSX用にビルドできるようにメイクファイルを調整する方法はありますかPPC(ppcppc64)個別のArch固有のメイクファイルを維持する必要はありません—おそらくビルド前にアーキテクチャを決定できるプリプロセッサディレクティブのようなものですか?

18
Alex Reynolds
Arch := $(Shell getconf LONG_BIT)

CPP_FLAGS_32 := -D32_BIT ...  Some 32 specific compiler flags ...
CPP_FLAGS_64 := -D64_BIT

CPP_FLAGS := $(CPP_FLAGS_$(Arch))  ... all the other flags ...
20
dancl

ファイルインクルードを試してください。これは、標準のMakefile構文(Single Unix v3仕様の構文)の一部ではありませんが、広くサポートされています。 GNU makeを使用すると、次のようになります。

_include otherfile
_

これにより、次のようなx86Makefileを作成できます。

_ARCHFLAGS = -m64 -mtune=core2
include common.mk
_

およびPowerPCMakefile:

_ARCHFLAGS = -mcpu=g3
include common.mk
_

コンパイルルールの大部分は、必要に応じて$(ARCHFLAGS)を使用して、1つのファイル(_common.mk_)にまとめられます。

2
Thomas Pornin

CmakeやGNU autotools)などのビルドシステムを採用することで、より少ない作業(および苦痛)で目標を達成できると思います。

1
ssegvic

これを行う1つの方法は、次のとおりです。

  • アーキテクチャごとにmakefileフラグメントがあります(おそらく累積的):posixwin32win32-gccなど。
  • 実行するスクリプトを用意し、フラグメントがホストに適している理由を判断します
  • それらのメイクファイルフラグメントをメインメイクファイルに含めます
  • 環境変数を使用して手動でオーバーライドできるようにします(クロスコンパイラーを考えるなど、物事が複雑になる場合があるため)

私はこれを中小規模のプロジェクト(数年間コードに取り組んでいる2〜3人)で使用しましたが、これは法案によく適合します。

1
Berendra Tusla

これを見てください:

http://mad-scientist.net/make/multi-Arch.html

それはやや時代遅れですが、私が思うにあなたに役立つかもしれない良い情報を持っています。

0
gilligan

CPPコンパイルに明示的に答えることはありませんが、アセンブリ言語用に作成したこのメソッドは、簡単に適合させることができます。

makefile

# -----------------------------------------
PROJECT = helloworld
# Expected source files: *-32.s and *-64.s
# -----------------------------------------
BITS := $(Shell getconf LONG_BIT)
OBJS = $(PROJECT).o
ifdef DEBUG
    DEBUGFLGS = -g
else
    DEBUGFLGS =
endif

%.o : %-$(BITS).s
    as $(DEBUGFLGS) -o $@   $<

$(PROJECT): $(OBJS)
    ld  -o bin/$(PROJECT)   $(OBJS)

次に、helloworld-32.shelloworld-64.sをプロジェクトフォルダーに追加します。フォルダー内でmakeを実行すると、すべてがうまくいきます。

0
OutsourcedGuru