2009-03-04 8 views
1

LinuxとMac、32ビットと64ビットで動作するプロジェクトのAutoconfスクリプトを開発しています。 Linuxでは、64ビットの検出は簡単です:build_cpuの代わりにi386の代わりにx86_64が得られます。私はMacのためにそれをする方法を理解することができません:両方の32および64ビットマシンはbuild_cpuのためにi386を与える。 Autoconf組み込み関数を使って違いを検出する方法はありますか?Autoconfを使ってMac上で32ビットと64ビットのIntel CPUを検出する

ボーナス質問:64ビットCPUでは、バイナリが32ビットか64ビットかを以下よりもプログラムで検出する方法がありますか?

file NAME_OF_BINARY | sed -e 's/.*[^0-9]\([0-9]*\)-bit.*/\1/g' 
+0

私はすべてのMac Intelプロセッサが64ビットであると考えていましたか?それとも、それは本当ですか、しかし、インテルOSXのすべてのバージョンがありますか? –

+0

@Joel:いいえ、Appleは2006年にいくつかのCore SoloとCore Duoシステムを出荷しました。 –

答えて

2

バイナリサポートをするアーキテクチャを見つけるには、ファイルを使用することができ、あなたがotool -f [name of bin]の出力を解析することができ、あなたはlipo -info [name of bin]の出力を解析することができ、またはあなたは、脂肪のファイルヘッダを自分で読むことができる(これはかなりですシンプルでよく文書化された構造)。シングルアーキテクチャーのバイナリーをお持ちの場合は、otoolから、どのアーキテクチャーがコンパイルされたかを示すMach-Oヘッダーが表示されます。

autoconfが内部的にホストアーキテクチャとして提供するものはありませんが、x86_64 Macはx86_64、i386、またはppc7400バイナリを実行できるため、区別がやや難しいです。ユニバーサルバイナリをコンパイルしてください。これは、アップルが推奨するものです。sysctl hw.optional.x86_64を見ると、あなたはどのボックスにいるのかを判断できます。

+0

インストールされたライブラリのアーチと一致させる必要があるため、違いはありません。 sysctlはうまく動作します。 –

2

build_cpui386が表示される理由は、おそらくgccが、Mac OS Xでは64ビットCPUであっても、デフォルトで32ビットモードでコンパイルするためです。これを処理するもっとも簡単な方法は、おそらくユーザーに押し付けることです:もし64ビットのバイナリが必要なら、--build=x86_64-darwinconfigureに渡すことができます。

+1

私は同意しません。 autoconfの全体的なポイントは**あなたが**物事をユーザーに押しつけることを避けることができるようにです。 – vy32

+3

バイナリをx86-64アーキテクチャ上で32ビットまたは64ビットにするかどうかを自動的に判断する方法はありません。これは基本的にユーザーが答えなければならない質問です。 –

0

Macでは、複数のアーキテクチャでコンパイルし、「汎用バイナリ」(以前は「ファットバイナリ」と呼ばれていたもの)を作成することができます。 -arch i386 -arch x86_64をコンパイルするだけで、実行時にどちらを実行するかを選択できるようになります(古いPPC Macをサポートしたい場合は-arch ppc -arch ppc64も含めることができます)。そうすれば、あるマシンから別のマシンにファイルシステムを移動させると、そのマシンには適切なバイナリが残ります。詳細については、64-bit Transition Guideを参照してください。

関連する問題