| TOP |

 Solaris 10で構築

  このサーバには、sendmailがインストールされています。sendmailは以下のパラメータでコンパイル
  しています
  (*gcc等のコンパイル環境は予め構築しておく)

 ■ 2022年3月21日 sendmail-8.17.1 をコンパイル後にインストールする
   コンパイルの手順は、sendmail-8.16.1と変わりません


 ■ ソースファイルからのコンパイル(Cシェル)
 

  sendmailのインストール準備

  ● BerkeleyDBをインストールし使用します

   sourceプログラムは、googleで検索して適当にダウンロード
   今回は、「db-4.2.52.NC.tar.gz」を使用。

   tarで展開し、

    # cd db-4.2.52.NC/build_unix

   B-Shellに変更

    # sh
    $ CC=gcc ../dist/configure CFLAGS=-m64 LDFLAGS="-m64 -L/usr/sfw/lib/64"

   configureが成功後、

    $ make
    $ make install

   でインストールする。 makeの時に「-m64」でコンパイルされていれば64bitになっている
   インストール先は、デフォルトは「/usr/local/BerkeleyDB.4.2」になる
   変更したい場合は、--prefix=/usr/local/64 configure 時につける

  ● sendmail-8.14.8 には「Errata」:「バグ、不具合」があるようで、いままでと同じようにコンパ
    イルするとエラーになります

   ↓以下のファイルに記述を追加する

   sendmail-8.14.8/devtools/M4/header.m4

    define(`confSITECONFIG', `site.config')
    define(`confBUILDBIN', `${SRCDIR}/devtools/bin')
    define(`confRANLIB', `echo')
 →  define(`confSHAREDLIB_EXT', `.so')
    define(`PUSHDIVERT', `pushdef(`__D__', divnum)divert($1)')
    define(`POPDIVERT', `divert(__D__)popdef(`__D__')')
    define(`APPENDDEF', `define(`$1', ifdef(`$1', `$1 $2', `$2'))')

  sendmail-8.16.1の場合

  ● # sh ./Build の時に以下のエラーが出る場合、↓
  
   gcc -O -I. -I../../include -DNDBM -DNIS -DNISPLUS -DMAP_REGEX -DSOLARIS=21000 \
   -DNETINET6 -c notify.c
   In file included from notify.c:23:
   /usr/include/stdbool.h:42:2: #error "Use of <stdbool.h> \
   is valid only in a c99 compilation environment."

   *** Error code 1
   make: Fatal error: Command failed for target `notify.o'

  ● gccのバージョンを見る

   # gcc -v

   Reading specs from /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/specs
   Configured with: /sfw10/builds/build/sfw10-patch/usr/src/cmd/gcc/gcc-3.4.3/configure \
   --prefix=/usr/sfw --with-as=/usr/ccs/bin/as --without-gnu-as \
   --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
   Thread model: posix
   gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

  ● 以下の「stdbool.h」を /usr/include にコピーする(強引なやり方です!)
    オリジナルの「stdbool.h」は stdbool.h.org 等の名前を変えて保存しておく

    /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/install-tools/include/stdbool.h

   # cp /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/install-tools/include/stdbool.h /usr/include/.
  
  ● 再度、sendmailのソースディレクトリのTOPにて、sh ./Build を行う

  sendmail-8.15.2, sendmail-8.16.1のコンパイルとインストール

  ● sendmailを、64bitでコンパイルするために、以下のファイルを編集し変更する
   (*自己流です、あしからず)

  > sendmail-8.15.2/devtools/M4/UNIX/defines.m4
  > sendmail-8.16.1/devtools/M4/UNIX/defines.m4

   # use O=-O (usual) or O=-g (debugging)
   O=-O2
  
   COPTS= -m64 -I. ${INCDIRS} ${ENVDEF} ${CCOPTS}

  > sendmail-8.15.2/devtools/M4/UNIX/executable.m4
  > sendmail-8.16.1/devtools/M4/UNIX/executable.m4


   ${CCLINK} -m64 -o bldCURRENT_PRODUCT ${LDOPTS} ${LIBDIRS}
     ${bldCURRENT_PRODUCT`OBJS'} ${LIBS}

  > sendmail-8.15.2/devtools/M4/UNIX/sm-test.m4
  > sendmail-8.16.1/devtools/M4/UNIX/sm-test.m4

   ${CC} -m64 -o $1 ${LDOPTS} ${LIBDIRS} $1.o
    ifdef(`confREQUIRE_LIBSM', `libsm.a') ${LIBS}

  > sendmail-8.15.2/devtools/OS/SunOS.5.10
  > sendmail-8.16.1/devtools/OS/SunOS.5.10

   *不要なNIS、NIS+を削除したもの↓

   define(`confCC', `gcc')
   define(`confLDOPTS_SO', `-G')
   define(`confBEFORE', `sysexits.h')
   define(`confMAPDEF', `-DUSE_VENDOR_CF_PATH -DMAP_REGEX')
   define(`confENVDEF', `-DSOLARIS=21000 -DNETINET6')
   define(`confSM_OS_HEADER', `sm_os_sunos')
    ↓*BerkeleyDBのパスを追加*
   define(`confLIBDIRS', `-L/usr/local/BerkeleyDB.4.2/lib -L/usr/local/lib -L/usr/lib \
      -R/usr/local/BerkeleyDB.4.2/lib -R/usr/local/lib -R/usr/lib')

   define(`confINCDIRS', `-I/usr/local/BerkeleyDB.4.2/include -I/usr/local/include \
      -I/usr/include')

   define(`confLIBS', `-lsocket -lnsl -ldb')
   define(`confMTCCOPTS', `-D_REENTRANT')
   define(`confMTLDOPTS', `-lpthread')
   define(`confMBINDIR', `/usr/lib')
   define(`confEBINDIR', `/usr/lib')
   define(`confSBINGRP', `sys')
   define(`confINSTALL', `${BUILDBIN}/install.sh')
   define(`confDEPEND_TYPE', `CC-M')
   PUSHDIVERT(3)
   sysexits.h:
      if [ -r /usr/include/sysexits.h ]; \
      then \
        ln -s /usr/include/sysexits.h; \
      fi
   POPDIVERT

  コンパイルの前にマニアル用のディレクトリを作成する

   # mkdir /usr/share/man/cat1 /usr/share/man/cat5 /usr/share/man/cat8

  sendmailのTOPディレクトリで、

   # sh Build ; sh Build install

   でコンパイル後、インストールを実行

  sendmailのバイナリは、/usr/lib にインストールされ、sendmail.cf は/etc/mail 内にインスト
   ールされている

  aliases ファイルは、/etc/mail/aliases がデフォルトのファイルである

  m4を使ってsendmail.cf を作成するためにsendmail-8.15.2/cf/cf 内のgeneric-solaris.mc
   等のサンプルを適宜修正し sendmail.cf を作成する

   EX.
   # cp generic-solaris.mc ○○○.mc
   # vi ○○○.mc
   # make ○○○.cf
   # cp ○○○.cf /etc/mail/sendmail.cf

  念のため、sendmail 用のユーザ、グループが登録されているか確認する

   # more /etc/passwd

    smmsp:x:25:25:SendMail Message Submission Program:/:

   # more /etc/group

    smmsp::25:smmsp

  Solaris 10標準のsendmail を停止する

   # svcadm disable svc:/network/smtp:sendmail
   # svcadm disable svc:/network/sendmail-client:default

  /etc/rc2.d/ にsendmail 起動スクリプトを作成

    → Solaris 9のものをコピーするのが早い

   # vi S88sendmail

    → S88sendmailはこちら...

   # /etc/rc2.d/S88sendmail stop
   # /etc/rc2.d/S88sendmail start

  踏台対策」として最低限、/etc/mail/relay-domains ファイルに中継を許可する自ドメイン
   のサブネットアドレスを記述する

   XXX.XXX.1.0
   XXX.XXX.2.0



 ・sendmail.mcの主な設定は、こちらへ...



  sendmail実行時のエラー対処

  → よく出るエラー: newaliases , mailq コマンドの実行時

    # mailq
    ld.so.1: sendmail: 重大なエラー: libgcc_s.so.1: open に失敗しました:
               ファイルもディレクトもありません。
    強制終了
    #

  → sendmail が使うライブラリがリンクされているかを確認する

    # ldd /usr/lib/sendmail
        libdb-4.2.so => /usr/local/64/lib/libdb-4.2.so
        libresolv.so.2 =>   /lib/64/libresolv.so.2
        < 省略 >
        libgcc_s.so.1 =>   (ファイルが見つかりません)
        libmp.so.2 =>     /lib/64/libmp.so.2
        libmd.so.1 =>     /lib/64/libmd.so.1
        < 省略 >
    #

  → gccでコンパイルしたプログラムの実行時に、プログラムが参照する
     ディレクトリ内に、上記のライブラリがないためエラーになっている
     *BerkeleyDB/usr/sfw/lib/64を参照する

  → /lib/64(又は /lib/sparcv9)を参照しているので、そこに必要なライブラリのリンクを張る
    64bitの「libgcc_s.so.1」は「/usr/sfw/lib/64」にあるので、

    # cd /lib/64
    # ln -s /usr/sfw/lib/64/* .
    #

  → 再度、sendmail が使うライブラリがリンクされているかを確認する

    # ldd /usr/lib/sendmail
        libdb-4.2.so => /usr/local/64/lib/libdb-4.2.so
        libresolv.so.2 =>   /lib/64/libresolv.so.2
        < 省略 >
        libgcc_s.so.1 =>   /usr/sfw/lib/64/libgcc_s.so.1
        libmp.so.2 =>     /lib/64/libmp.so.2
        libmd.so.1 =>     /lib/64/libmd.so.1
        < 省略 >
    #

  → sendmail が使用するライブラリが表示される事を確認する