Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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