mattintosh note

どこかのエンジニアモドキの備忘録

How to make libgsm.dylib on OS X

※こちらの記事には若干誤りがあるため新しい記事を参照してください。

OS X で libgsm の共有ライブラリを作成する。GSM もソースは http://www.quut.com/gsm/ から入手する。

まず Makefile の修正。

  1. CC や CFLAGS の固定を解除する。
  2. $(INSTALL_ROOT)/inc$(INSTALL_ROOT)/include に変更する。
  3. インストール先を埋め込む。
  4. RMFLAGS に "-f" を追加する。
  5. マニュアルをインストールしない。

などなど。重要なのは1番と2番であとは make 時のエラーを気にするかしないかの好みの問題。下のパッチでは INSTALL_ROOT/usr/local に設定済み。

m4  -D_CC="$CC" -D_CFLAGS="$CFLAGS" -D_PREFIX=/usr/local \
<<\@EOS | patch -Np0
--- Makefile.orig
+++ Makefile
@@ -43,8 +43,8 @@
 # CC     = /usr/lang/acc
 # CCFLAGS    = -c -O
 
-CC       = gcc -ansi -pedantic
-CCFLAGS  = -c -O2 -DNeedFunctionPrototypes=1
+CC       = _CC -ansi -pedantic
+CCFLAGS  = -c _CFLAGS -DNeedFunctionPrototypes=1
 
 LD       = $(CC)
 
@@ -71,7 +71,7 @@
 # Leave INSTALL_ROOT empty (or just don't execute "make install") to
 # not install gsm and toast outside of this directory.
 
-INSTALL_ROOT =
+INSTALL_ROOT = _PREFIX
 
 # Where do you want to install the gsm library, header file, and manpages?
 #
@@ -80,7 +80,7 @@
 
 GSM_INSTALL_ROOT = $(INSTALL_ROOT)
 GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib
-GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc
+GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/include
 GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3
 
 
@@ -100,7 +100,7 @@
 BASENAME     = basename
 AR       = ar
 ARFLAGS      = cr
-RMFLAGS      =
+RMFLAGS      = -f
 FIND     = find
 COMPRESS     = compress
 COMPRESSFLAGS    = 
@@ -258,18 +258,12 @@
 
 GSM_INSTALL_TARGETS =    \
      $(GSM_INSTALL_LIB)/libgsm.a     \
-     $(GSM_INSTALL_INC)/gsm.h        \
-     $(GSM_INSTALL_MAN)/gsm.3        \
-     $(GSM_INSTALL_MAN)/gsm_explode.3    \
-     $(GSM_INSTALL_MAN)/gsm_option.3     \
-     $(GSM_INSTALL_MAN)/gsm_print.3
+     $(GSM_INSTALL_INC)/gsm.h
 
 TOAST_INSTALL_TARGETS =  \
      $(TOAST_INSTALL_BIN)/toast      \
      $(TOAST_INSTALL_BIN)/tcat       \
-     $(TOAST_INSTALL_BIN)/untoast        \
-     $(TOAST_INSTALL_MAN)/toast.1
-
+     $(TOAST_INSTALL_BIN)/untoast
 
 # Default rules
 
@@ -351,25 +345,25 @@
      fi
 
 $(TOAST_INSTALL_BIN)/toast:  $(TOAST)
-     -rm $@
+     -rm $(RMFLAGS) $@
      cp $(TOAST) $@
      chmod 755 $@
 
 $(TOAST_INSTALL_BIN)/untoast:    $(TOAST_INSTALL_BIN)/toast
-     -rm $@
+     -rm $(RMFLAGS) $@
      ln $? $@
 
 $(TOAST_INSTALL_BIN)/tcat:   $(TOAST_INSTALL_BIN)/toast
-     -rm $@
+     -rm $(RMFLAGS) $@
      ln $? $@
 
 $(TOAST_INSTALL_MAN)/toast.1:    $(MAN)/toast.1
-     -rm $@
+     -rm $(RMFLAGS) $@
      cp $? $@
      chmod 444 $@
 
 $(GSM_INSTALL_MAN)/gsm.3:    $(MAN)/gsm.3
-     -rm $@
+     -rm $(RMFLAGS) $@
      cp $? $@
      chmod 444 $@
 
@@ -389,12 +383,12 @@
      chmod 444 $@
 
 $(GSM_INSTALL_INC)/gsm.h:    $(INC)/gsm.h
-     -rm $@
+     -rm $(RMFLAGS) $@
      cp $? $@
      chmod 444 $@
 
 $(GSM_INSTALL_LIB)/libgsm.a: $(LIBGSM)
-     -rm $@
+     -rm $(RMFLAGS) $@
      cp $? $@
      chmod 444 $@
  
@EOS

Makefile を修正したら make install まで済ませる。

libtool で共有ライブラリを作成する。

/usr/bin/libtool -dynamic -v -o /usr/local/lib/libgsm.1.dylib -install_name /usr/local/lib/libgsm.1.dylib -compatibility_version 1.0.13 -current_version 1.0.13 -lc lib/libgsm.a
cd /usr/local/lib
ln -fs libgsm1.dylib libgsm.dylib

/usr/bin/libtool/usr/bin/glibtool は別物で、前者は Apple、後者の方は GNU のものでオプションが異なる。

# Apple
$ /usr/bin/libtool -V
Apple Computer, Inc. version cctools-795

# GNU
$ /usr/bin/glibtool --version
ltmain.sh (GNU libtool) 2.2.4
Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996

Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.