2013년 10월 12일 토요일

Example of autoconfig and automake in Ubuntu


今度はautomakeとautoconfの使い方を調べてみた。手順は長いけど自分で用意するのは「ソースコード」「Makefile.am」の二つで、
이번에는 automake와 autoconf의 사용법을 조사해 봤다. 순서는 길지만, 준비할 것은 "소스코드", Makefile.am" 으로, "configure.in"
「condigure.in」(autorecnfの時は「condigure.ac」)はテンプレを修正して作成すればおけらしい。
この3つさえ用意すればあとは環境にあわせてライブラリやヘッダファイルの存在などをチェケしつつコンパイルするというなんかカッコいいのが作れる!

cmakeはクロスプラットフォーム向け、autoconfはGNU系列なのでLinux向けってことか?どっちも設定ファイルは実質1つ(Makefile.amは2行だし)なので労力はそんなにかわらないと思われ。個人的にはcmakeの方が好みだな、ドキュメント少ないけど、、、

事前準備

ソースコード「strchr.c」

//config.hが存在するなら読み込む
#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#if HAVE_STDIO_H
#  include 
#else
int printf (const char *format, ...);
#endif

#if HAVE_STRING_H
#  include 
#else
#  ifndef HAVE_STRRCHR
#    define strrchr rindex
#  endif
char *strrchr ();
#endif

int main (int   argc, char *argv[]){
  char *p, *program_name;

  p = strrchr (argv[0], '/');
  if (p == NULL) program_name = argv[0];
  else program_name = p+1;

  printf ("program_name: %s \n", program_name);

  return 0;
}

configure.inの生成

autoscanコマンドで「configure.scan」を作成
>>autoscan
「configure.scan」を修正し、「configure.in」を作成。赤字が修正部分。
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)
#初期化
AC_INIT(StrChr, 0.1, yosilove@mail)
#automakeの初期化
AM_INIT_AUTOMAKE(strchr, 1.0.0, no-define)
AC_CONFIG_SRCDIR([strchr.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
#ヘッダファイルの存在確認
AC_CHECK_HEADERS([stdio.h],[AC_DEFINE(HAVE_STDIO_H)],[AC_MSG_ERROR([Sorry, can't do anything for you])])
AC_CHECK_HEADERS([string.h],[AC_DEFINE(HAVE_STRING_H)],[AC_MSG_ERROR([Sorry, can't do anything for you])])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

# Checks for library functions.
AC_CHECK_FUNCS([strrchr])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.amを作成

automakeの設定ファイルである「Makefile.am」を用意
#実行ファイル名
bin_PROGRAMS = strchr
#ソースコード
strchr_SOURCES = strchr.c
以下、「1.自分でやるよ」と「2.autoreconfに任せるよ」に分岐 

1-1) aclocal

automake用のマクロファイル(.m4)を生成するために「aclocal」コマンドを実行
>>aclocal
「autom4te.cache」と「aclocal.m4」ができる。 



1-2) config.h.inの生成

>>autoheader
「config.h.in」が生成される 



1-3) Makefile.inの生成

automakeコマンドに「-a」オプションを付けてMakefile.inの生成
>>touch NEWS README AUTHORS ChangeLog
>>automake -a
「NEWS」「README」「AUTHORS」「ChangeLog」がないといけないのでtouchコマンドで生成。automakeすると「INSTALL」「COPYING」「depcomp」「missing」「install-sh」と「Makefile.in」が生成される。 



1-4) configureの生成

>>autoconf
「configure」が生成される。 



2) autoreconfでconfigureを作る

1)シリーズのコマンドってテンプレだし、いちいち入力するのめんどいよね〜

というわけで、普通はまとめて実行出来るように「bootstrap」や「autogen.sh」なスクリプトを書いておくんだけど、、、

それらをまとめてやってくれるコマンド「autoreconf」を使うという方法もある。ちなみに、「configure.in」でもできたりするが、autoreconfを使うときはファイル名は「configure.ac」の方が正式。
>>touch NEWS README AUTHORS ChangeLog
>>autoreconf -i
「bootstrap」や「autogen.sh」と比べるとちょっと劣るらしいけど、大体のプログラムはこれで通るらしい。 



Makefileの生成

>>./configure
「config.status」「config.log」「config.h」「stamp-h1」と「Makefile」ができる。 



実行ファイルの生成

>>make
「strchr.o」と「strchr」ができる、strchrを実行すると
>>./strchr 
program_name: strchr 

댓글 없음:

댓글 쓰기