桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

続・Autotools

d:id:youandi:20121213:p3
昨日の続き。ケース別に。

ファイル&フォルダ構成

前提は昨日と同じ。変更があるもののみ掲載。

ライブラリの場合

root/configure.ac
AC_INIT([test1],[1.0])
AC_CONFIG_SRCDIR([src/main.cpp])

AM_INIT_AUTOMAKE([foreign])

AC_PROG_CXX

AM_PROG_LIBTOOL

AC_CONFIG_FILES([ \
Makefile \
src/Makefile \
])
AC_OUTPUT
root/src/Makefile.am
lib_LTLIBRARIES = libTest1.la

libTest1_la_SOURCES = \
    main.cpp \
    $(NULL)

DSOとArchiveの両方に対応する。

INCLUDEパスの指定

root/src/Makefile.am
bin_PROGRAMS = test1
test1_SOURCES = \
    main.cpp \
    $(NULL)

# Path Setting
AM_CPPFLAGS = \
	-I/usr/local/include \
	$(NULL)

「.」「..」「/usr/include」辺りはデフォルトで設定される。追加分は「AM_CPPFLAGS」に追加していく。

実行ファイルにリンクするライブラリの指定

root/configure.ac
AC_INIT([test1],[1.0])
AC_CONFIG_SRCDIR([src/main.cpp])

AM_INIT_AUTOMAKE([foreign])

AC_PROG_CXX

AC_CHECK_LIBM
AC_SUBST([LIBM])
AC_CHECK_LIB(pthread, pthread_create)

AC_CONFIG_FILES([ \
Makefile \
src/Makefile \
])
AC_OUTPUT
root/src/Makefile.am
bin_PROGRAMS = test1
test1_SOURCES = \
    main.cpp \
    $(NULL)

# Link Libraries
test1_LDADD = \
	$(LIBM) \
	-lrt \
	/usr/local/lib/libMyUtils.a \
	$(NULL)

test1_DEPENDENCIES = \
	/usr/local/lib/libMyUtils.a \
	$(NULL)

バージョンにもよるかも知れないが、Archive(*.a)を直接指定する場合は「xxx_DEPENDENCIES」に書いておかないと、「libMyUtils.a」が更新された時に「test1」が再リンクされない。
各ライブラリのパスの定義は「configure.ac」でマクロ定義するようにした方が良い希ガス。どのライブラリをリンクするのかを指定するのは「src/Makefile.am」で。

「config.h」を利用する

root/configure.ac
AC_INIT([test1],[1.0])
AC_CONFIG_SRCDIR([src/main.cpp])

AM_INIT_AUTOMAKE([foreign])

AC_CONFIG_AUX_DIR([config])
AC_CONFIG_HEADER([config.h])
AC_CHECK_HEADERS([string.h math.h])

AC_PROG_CXX

AC_CONFIG_FILES([ \
Makefile \
src/Makefile \
])
AC_OUTPUT
root/src/main.cpp
#include "config.h"
#include <iostream>
#if HAVE_MATH_H
#include <math.h>
#endif
#if HAVE_STRING_H
#include <string.h>
#endif
int main()
{
    std::cout << "Hellow World" << std::endl;
    return EXIT_SUCCESS;
}

ビルド実行OSを識別する

root/configure.ac
AC_INIT([test1],[1.0])
AC_CONFIG_SRCDIR([src/main.cpp])

AM_INIT_AUTOMAKE([foreign 1.9.0])

# for $host $host_cpu $host_vendor $host_os
AC_CANONICAL_HOST
# for debug output
AC_MSG_NOTICE($host_os)

case "$host_os" in
    linux*)
        CFLAGS_CMN="-Wall -fno-strict-aliasing"
        CFLAGS="$CFLAGS_CMN $CFLAGS"
        CXXFLAGS="$CFLAGS_CMN $CXXFLAGS"
        CPPFLAGS="$CPPFLAGS"
        LDFLAGS="-Wl,--warn-common $LDFLAGS"
        ;;
    *)
        ;;
esac

AC_PROG_CXX

AC_CONFIG_FILES([ \
Makefile \
src/Makefile \
])
AC_OUTPUT

あとコンパイラやリンカのオプション指定をしたい場合は、以下のマクロに設定する。