2013年2月2日土曜日

[Makefile]Automake でサブディレクトリ内もコンパイルする

次のようなディレクトリ構成のソースをコンパイルする場合
hello
└─src
    │  hello.c
    │  hello.h
    │  main.c
    │  Makefile.am
    │
    └─extfunc
            extfunc.c
            extfunc.h
            Makefile.am
main.c から extfunc.c 内の関数をコールするようにしている。
#include "hello.h"
#include "extfunc/extfunc.h"

int main(void)
{
 say_hello();
 test();
 extfunc();

 return 0;
}
Example 1. extfunc.c
#include "extfunc.h"

int extfunc(void)
{
 printf("extfunc is called!!\n");

 return 0;
}
Example 2. extfunc.h
#ifndef __EXTFUNC_H__
#define __EXTFUNC_H__

extern int extfunc(void);

#endif /* __EXTFUNC_H__ */
automake では直接サブディレクトリのソースを取り込んでコンパイルすることができないようなので、extfunc ディレクトリ内のオブジェクトはライブラリにして最後にリンクさせるようにする。

Example 3. src/extfunc/Makefile.am
noinst_LIBRARIES = libextfunc.a
libextfunc_a_SOURCES = extfunc.c
Example 4. src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c hello.h main.c
hello_LDADD = extfunc/libextfunc.a
SUBDIRS = extfunc
LDADD を使用するために configure.ac に AC_PROG_RANLIB を追加する必要がある。そのため automake を行うスクリプトも修正する。
#!/bin/bash -v
autoscan
sed -e "s/FULL-PACKAGE-NAME/hello/g" -e "s/VERSION/1.0/g" -e "s/BUG-REPORT-ADDRESS/hoge@hogehoge/g" -e "6 i AM_INIT_AUTOMAKE([foreign])" -e "$ i AC_PROG_RANLIB" configure.scan > configure.ac
autoheader
aclocal
automake --add-missing --copy
autoconf
./configure
sed -e "$ i AC_PROG_RANLIB" configure.scan > configure.ac
で configure.scan の最後の行に AC_PROG_RANLIB を追加している。

0 件のコメント:

コメントを投稿