Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

mac port で gcc4.8を入れたった

Mac OS X で言語系を開発しようとするとまず出てくるのがXCode
これのお陰で色々楽ができる反面、マイコン開発のようにMacOSX以外を吐き出そうとすると若干厄介な事になります。
私の場合はsecureな_stdio.hが癇癪を起こして研究で使うライブラリは使えません。
そこで今回はGNU謹製のgcc最新版、Gcc 4.8系*1を導入してみる事にします。

前提

MacPortsの更新

 $ sudo port selfupdate
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.0 installed,
MacPorts base version 2.2.0 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated
 $ sudo port sync
--->  Updating the ports tree

gcc48を導入

念のため、Gccの現状を確認します。

 $ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

紛う事なきdarwin*2最適化gccですね。

特に変わった事がないので、いよいよgcc48、およびgcc切り替えに必要なツールを導入していきます

 $ sudo port install gcc48
--->  Computing dependencies for gcc48
--->  Dependencies to be installed: cctools cctools-headers llvm-3.3 libffi llvm_select cloog gmp isl gcc_select ld64 libgcc libiconv libmpc mpfr

...

--->  Installing gcc48 @4.8.1_3
--->  Activating gcc48 @4.8.1_3
--->  Cleaning gcc48
--->  Updating database of binaries: 100.0%
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.

 $ sudo port install gcc_select
--->  Cleaning gcc_select
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.


フォルダの構成要素を調べます。
今回用事があるのは実行ファイルなので、絞り込みをして……

$ port contents gcc48 | grep /bin/
  /opt/local/bin/aot-compile-mp-4.8
  /opt/local/bin/c++-mp-4.8
  /opt/local/bin/cpp-mp-4.8
  /opt/local/bin/g++-mp-4.8
  /opt/local/bin/gappletviewer-mp-4.8
  /opt/local/bin/gc-analyze-mp-4.8
  /opt/local/bin/gcc-ar-mp-4.8
  /opt/local/bin/gcc-mp-4.8
  /opt/local/bin/gcc-nm-mp-4.8
  /opt/local/bin/gcc-ranlib-mp-4.8
  /opt/local/bin/gcj-dbtool-mp-4.8
  /opt/local/bin/gcj-mp-4.8
  /opt/local/bin/gcjh-mp-4.8
  /opt/local/bin/gcov-mp-4.8
  /opt/local/bin/gfortran-mp-4.8
  /opt/local/bin/gij-mp-4.8
  /opt/local/bin/gjar-mp-4.8
  /opt/local/bin/gjarsigner-mp-4.8
  /opt/local/bin/gjavah-mp-4.8
  /opt/local/bin/gkeytool-mp-4.8
  /opt/local/bin/gnative2ascii-mp-4.8
  /opt/local/bin/gorbd-mp-4.8
  /opt/local/bin/grmic-mp-4.8
  /opt/local/bin/grmid-mp-4.8
  /opt/local/bin/grmiregistry-mp-4.8
  /opt/local/bin/gserialver-mp-4.8
  /opt/local/bin/gtnameserv-mp-4.8
  /opt/local/bin/jcf-dump-mp-4.8
  /opt/local/bin/jv-convert-mp-4.8
  /opt/local/bin/rebuild-gcj-db-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-c++-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-g++-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gcc-4.8.1
  /opt/local/bin/x86_64-apple-darwin12-gcc-ar-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gcc-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gcc-nm-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gcc-ranlib-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gcj-mp-4.8
  /opt/local/bin/x86_64-apple-darwin12-gfortran-mp-4.8

このウチのどこかですが……今回はgcc-mp系が正解です。

$ which gcc-mp-4.8
/opt/local/bin/gcc-mp-4.8

動作を確かめる

それでは、最後のまとめに、Hello,Worldを出力するだけの簡単な奴を書いて動作を確認します。
まずはそのまま

 $ nano test.c
 $ gcc test.c
 $ ./a.out 
hello, world 

ソースコードはそのままでも吐き出すバイナリは違うはずですが、
それだと一寸寂しいので、hello, youと出力するようにしてにてコンパイルしてみます。

 $ gcc-mp-4.8 test.c
 $ ./a.out 
hello, you 

確認できましたので、標準のgccとして設定します。

 $ port contents gcc_select
Port gcc_select contains:
  /opt/local/etc/select/gcc/base
  /opt/local/etc/select/gcc/llvm-gcc42
  /opt/local/etc/select/gcc/none
 $ sudo port install gcc_select
Password:
--->  Cleaning gcc_select
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.
 $ port contents gcc_select
Port gcc_select contains:
  /opt/local/etc/select/gcc/base
  /opt/local/etc/select/gcc/llvm-gcc42
  /opt/local/etc/select/gcc/none

今あるgccを出力させ、出力を切り替えます。

 $ port select --list gcc
Available versions for gcc:
	llvm-gcc42
	mp-gcc48
	none (active)
 $ sudo port select --set gcc mp-gcc48
Selecting 'mp-gcc48' for 'gcc' succeeded. 'mp-gcc48' is now active.
 $ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

……アレ?

これはよくある間違いというかミスですが、.bashrcを読み込まないと反映されません。

 $ source ~/.bashrc 
 $ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin12/4.8.1/lto-wrapper
Target: x86_64-apple-darwin12
Configured with: /opt/local/var/macports/build/_opt_mports_dports_lang_gcc48/gcc48/work/gcc-4.8.1/configure --prefix=/opt/local --build=x86_64-apple-darwin12 --enable-languages=c,c++,objc,obj-c++,lto,fortran,java --libdir=/opt/local/lib/gcc48 --includedir=/opt/local/include/gcc48 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-4.8 --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-4.8 --with-gxx-include-dir=/opt/local/include/gcc48/c++/ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-cloog=/opt/local --enable-cloog-backend=isl --disable-cloog-version-check --enable-stage1-checking --disable-multilib --enable-lto --enable-libstdcxx-time --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar=/opt/local/bin/ar --with-bugurl=https://trac.macports.org/newticket --with-pkgversion='MacPorts gcc48 4.8.1_3'
Thread model: posix
gcc version 4.8.1 (MacPorts gcc48 4.8.1_3) 

完了です。お疲れさまでした。

*1:記事執筆時点

*2:http://support.apple.com/kb/TA25634?viewlocale=ja_JP&locale=ja_JP