## @id $Id: ax_init_standard_project.m4 31 2015-05-05 15:06:08Z marc $ ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 # m4_esyscmd_s does not exist on centos 5 and 6 m4_define([mrw_esyscmd_s], [m4_normalize(m4_esyscmd([$1]))]) # define least version number from subversion's revision number: # it is taken modulo 256 due to a bug on Apple's MacOSX m4_define(x_least, m4_ifdef([x_least_diff], mrw_esyscmd_s([ SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') break; fi done echo $ECHO_N $(($SVN_REVISION)) ]), mrw_esyscmd_s([ SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') break; fi done # Mac does not support LEAST > 255 echo $ECHO_N $(($SVN_REVISION%256)) ]))) # define version number from subversion's revision number: # it is taken modulo 256 due to a bug on Apple's MacOSX # add to x_minor if revision number is > 256 m4_define(x_minor_diff, mrw_esyscmd_s([ SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') break; fi; done # Mac does not support LEAST > 255 echo $ECHO_N $(($SVN_REVISION/256)) ])) # setup version number m4_define(x_version, [x_major.m4_ifdef([x_least_diff], x_minor, m4_eval(x_minor+x_minor_diff)).m4_eval(m4_ifdef([x_least_diff], [x_least-x_least_diff], [x_least]))]) ## bugreport mail address is taken from in first line of AUTHORS m4_define(x_bugreport, mrw_esyscmd_s([ head -1 AUTHORS | \ sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp' ])) m4_include(ax_check_qt.m4) AC_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR]) AC_DEFUN([AX_DEFINE_DIR], [ prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn dnl refers to ${prefix}. Thus we have to use `eval' twice. eval ax_define_dir="\"[$]$2\"" eval ax_define_dir="\"$ax_define_dir\"" AC_SUBST($1, "$ax_define_dir") AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3]) test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE ]) # add target dependencies to an existing makefile.in # - parameters: # $1 = existing target # $2 = new dependency for that target # $3 = filename of makefile.in AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ sh_add_makefile_target_dep() { sed -i -e ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then echo "${1}: ${2}" >> "${srcdir}/${3}" fi } sh_add_makefile_target_dep "$1" "$2" "$3" if test "$1" != ".PHONY"; then sh_add_makefile_target_dep ".PHONY" "$2" "$3" fi ]) # Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS # - parameters: # $1 = variable name AC_DEFUN([AX_SUBST], [ AC_SUBST([$1]) tmp_var=$(echo "${$1}" | awk 1 ORS='\\n' | sed 's,\\n$,,') tmp_var=${tmp_var//\"/\\\"} tmp_var=${tmp_var//\'/\'\"\'\"\'} tmp_var=${tmp_var//#/\\#} AM_CPPFLAGS+=" '-D$1=\"${tmp_var}\"'" AC_SUBST(AM_CPPFLAGS) ]) # must be called on the right position in configure.ac # # configure.ac must start with: # # m4_define(x_package_name, YOUR_PACKAGE_NAME) # project's name # m4_define(x_major, MAJOR_NUMBER) # project's major version # m4_define(x_minor, MINOR_NUMBER) # project's minor version # m4_include(ax_init_standard_project.m4) # AC_INIT(x_package_name, x_version, x_bugreport, x_package_name) # AM_INIT_AUTOMAKE([1.9 tar-pax]) # AX_INIT_STANDARD_PROJECT # # you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER # # configures the basic environment AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ AC_MSG_CHECKING([target platfrom]) UNIX=1 MINGW= MACOSX= for h in ${target} ${target_os} ${host} ${host_os} \ ${build} ${build_os} $(uname -s 2> /dev/null); do p="$h is generic Unix" case "$h" in (*mingw*) UNIX=; MINGW=1; p="MinGW"; break;; (*Darwin*|*darwin*|*rhapsody*|*macosx*) UNIX=; MACOSX=1; p="MacOSX"; break;; esac done AC_MSG_RESULT($p) AM_CONDITIONAL(UNIX, test "$UNIX" = "1") AM_CONDITIONAL(MINGW, test "$MINGW" = "1") AM_CONDITIONAL(MACOSX, test "$MACOSX" = "1") AX_SUBST(UNIX) AX_SUBST(MINGW) AX_SUBST(MACOSX) AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_TARNAME//[^a-zA-Z0-9]/_}'" AX_SUBST(NUMBERS) AX_SUBST(HOME) README=$(tail -n +3 README) AX_SUBST(README) _AM_SUBST_NOTMAKE([README]) DESCRIPTION=$(head -1 README) AX_SUBST(DESCRIPTION) _AM_SUBST_NOTMAKE([DESCRIPTION]) AUTHOR=$(head -1 AUTHORS) AX_SUBST(AUTHOR) _AM_SUBST_NOTMAKE([AUTHOR]) DISTRO=$(lsb_release -sc 2>/dev/null || uname -s 2>/dev/null) AX_SUBST(DISTRO) DISTRIBUTOR=$(lsb_release -si 2>/dev/null || uname -s 2>/dev/null) case "${DISTRIBUTOR// /-}" in (Ubuntu) UBUNTU=1; AX_SUBST(UBUNTU);; (Debian) DEBIAN=1; AX_SUBST(DEBIAN);; (SUSE-LINUX) SUSE=1; AX_SUBST(SUSE);; (Fedora) FEDORA=1; AX_SUBST(FEDORA);; (Centos) CENTOS=1; AX_SUBST(CENTOS);; esac AX_SUBST(DISTRIBUTOR) BUILD_NUMBER=${BUILD_NUMBER:-1} AX_SUBST(BUILD_NUMBER) BUILD_DATE=$(LANG= date +"%a, %d %b %Y %H:%M:%S %z") AX_SUBST(BUILD_DATE) if test -f "${PROJECT_NAME}-logo.png"; then PROJECT_LOGO="${PROJECT_NAME}-logo.png" fi AX_SUBST(PROJECT_LOGO) if test -f "${PROJECT_NAME}-icon.png"; then PROJECT_ICON="${PROJECT_NAME}-icon.png" fi AX_SUBST(PROJECT_ICON) AC_ARG_ENABLE(pedantic, [AS_HELP_STRING([--enable-pedantic], [enable all warnings and checks, abort on warnings])], [have_pedantic="$enableval"; test "$enableval" = "yes" && \ AM_CXXFLAGS="${AM_CXXFLAGS:-} -pedantic-errors -Wall -W -Wfloat-equal -Wundef -Wendif-labels -Wpointer-arith -Wcast-align -Wwrite-strings -Wconversion -Wsign-compare -Wmissing-format-attribute -Wno-multichar -Wpacked -Wredundant-decls -Werror -Wshadow -Wcast-qual -Wno-ctor-dtor-privacy"]) dnl problem in libs: -Wshadow -Wcast-qual dnl auto.hpp: -Wno-ctor-dtor-privacy (removed) AM_CONDITIONAL(PEDANTIC, test "$enableval" = "yes") if test "$have_pedantic" == "yes"; then AC_MSG_NOTICE([Pedantic compile mode enabled! - all warnings for GNU g++ are enabled - all warnings result in an error - doxygen warnings are treated as error too]); fi AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug], [compile for debugger])], [have_debug="$enableval"; test "$enableval" = "yes" && \ AM_CPPFLAGS="${AM_CPPFLAGS} -DDEBUG" && \ AM_CXXFLAGS="${AM_CXXFLAGS:-} -ggdb3 -O0" && \ AM_LDFLAGS="${AM_LDFLAGS} -ggdb3 -O0"]) AM_CONDITIONAL(DEBUG, test "$enableval" = "yes") if test "$have_debug" == "yes"; then AC_MSG_NOTICE([Debug compile mode enabled]); fi AC_CONFIG_FILES([makefile]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-standard-project-targets], [makefile.in]) test -f makefile.in && cat >> makefile.in <> src/makefile.in <> test/makefile.in <> examples/makefile.in <> html/makefile.in <> src/makefile.in <> makefile.in <> makefile.in <> doc/makefile.in < /dev/null); do if test -f "$f"; then $1_found=${tmp_package} $1_CFLAGS+=" -I${f%/*}" AC_MSG_NOTICE([added path ${f%/*}]) break; fi done if test "${$1_found}" != "no"; then break; fi done if test "${$1_found}" = "no"; then tmp_includedir=$(${PKG_CONFIG} --variable=includedir $tmp_package) for x in ${tmp_includedir}; do AC_MSG_NOTICE([search for $3 in $x]) for f in $(find ${x} -name "$3" 2> /dev/null); do if test -f "$f"; then $1_found=${tmp_package} $1_CFLAGS+=" -I${f%/*}" AC_MSG_NOTICE([added path ${f%/*}]) break; fi done if test "${$1_found}" != "no"; then break; fi done fi ]) CPPFLAGS=${old_CPPFLAGS} fi if test "${$1_found}" = "no"; then if test -n "$3"; then if test -n "$4"; then AC_MSG_ERROR([Feature $1 not found, need header $3 in modules $secondpar or $4]) else AC_MSG_ERROR([Feature $1 not found, need header $3 in module $secondpar]) fi else AC_MSG_ERROR([Feature $1 not found please install module $secondpar]) fi fi [$1]_CPPFLAGS="${$1_CFLAGS}" [$1]_CXXFLAGS="${$1_CFLAGS}" AC_SUBST([$1]_CPPFLAGS) AC_SUBST([$1]_CXXFLAGS) if test "${optional_flags/manualflags/}" = "${optional_flags}"; then CPPFLAGS+=" ${$1_CPPFLAGS}" CXXFLAGS+=" ${$1_CXXFLAGS}" LIBS+=" ${$1_LIBS}" AC_MSG_NOTICE([Adding flags for $1]) else AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) fi ]) # check if a specific package exists # - parameter: # $1 = unique id (no special characters) # $2 = module name (optional, if different from id) # $3 = optional flags: # manualflags if CXXFLAGS, CPPFLAGS, LIBS should remain unchanged # # uses PKG_CHECK_MODULES to test for a module # sets automake conditional HAVE_$1 to 0 (not found) or 1 (found) # sets all flags, so that the module can be used everywhere AC_DEFUN([AX_PKG_CHECK], [ optional_flags="$3" PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [ HAVE_$1=1 [$1]_CPPFLAGS="${$1_CFLAGS}" [$1]_CXXFLAGS="${$1_CFLAGS}" AC_SUBST([$1]_CPPFLAGS) AC_SUBST([$1]_CXXFLAGS) if test "${optional_flags/manualflags/}" = "${optional_flags}"; then CPPFLAGS+=" ${$1_CPPFLAGS}" CXXFLAGS+=" ${$1_CXXFLAGS}" LIBS+=" ${$1_LIBS}" AC_MSG_NOTICE([Adding flags for $1]) else AC_MSG_NOTICE([To enable $1, add $1_CPPFLAGS, $1_CXXFLAGS and $1_LIBS]) fi if test -z "$PKG_REQUIREMENTS"; then PKG_REQUIREMENTS="m4_default([$2], [$1])" else PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, m4_default([$2], [$1])" fi ], [ HAVE_$1=0 ]) AM_CONDITIONAL(HAVE_$1, test $HAVE_[$1] -eq 1) AC_SUBST(HAVE_$1) AC_SUBST(CPPFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(PKG_REQUIREMENTS) ]) # make sure, a specific header exists # - parameter: # $1 = header name AC_DEFUN([AX_REQUIRE_HEADER], [ AC_CHECK_HEADER($1, [], [ if test -n "$2"; then found=0 for d in $2; do if test -f "${d}/$1"; then AC_MSG_NOTICE([found file ${d}/$1]) CPPFLAGS+=" -I${d}" found=1 break; else AC_MSG_NOTICE([not found file ${d}/$1]) fi done fi if test $found -eq 0; then AC_MSG_ERROR([Header $1 not found]) fi ], []) ], []) ]) # Check within a list of CPP-Flags for the first that is usable and # configure it # - parameter: # $1 = white-space separated list of alternative flags # $2 = module name (optional, if different from id) AC_DEFUN([AX_CHECK_VALID_CPP_FLAG], [ AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])]) save_cppflags="$CPPFLAGS" newflag="no" for test_flag in $1; do CPPFLAGS+=" ${test_flag}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ newflag="$test_flag" CPPFLAGS="$save_cppflags" CPPFLAGS+=" ${test_flag}" break; ]) CPPFLAGS="$save_cppflags" done AC_SUBST(CPPFLAGS) AC_MSG_RESULT([$newflag in $CPPFLAGS]) ]) # Check within a list of CXX-Flags for the first that is usable and # configure it # - parameter: # $1 = white-space separated list of alternative flags # $2 = module name (optional, if different from id) AC_DEFUN([AX_CHECK_VALID_CXX_FLAG], [ AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])]) save_cxxflags="$CXXFLAGS" newflag="no" for test_flag in $1; do CXXFLAGS+=" ${test_flag}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ newflag="$test_flag" CXXFLAGS="$save_cxxflags" CXXFLAGS+=" ${test_flag}" break; ]) CXXFLAGS="$save_cxxflags" done AC_SUBST(CXXFLAGS) AC_MSG_RESULT([$newflag in $CXXFLAGS]) ]) # Check within a list of C-Flags for the first that is usable and # configure it # - parameter: # $1 = white-space separated list of alternative flags # $2 = module name (optional, if different from id) AC_DEFUN([AX_CHECK_VALID_C_FLAG], [ AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])]) save_cflags="$CFLAGS" newflag="no" for test_flag in $1; do CFLAGS+=" ${test_flag}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ newflag="$test_flag" CFLAGS="$save_cflags" CFLAGS+=" ${test_flag}" break; ]) CFLAGS="$save_cflags" done AC_SUBST(CFLAGS) AC_MSG_RESULT([$newflag in $CFLAGS]) ]) # Check within a list of LD-Flags for the first that is usable and # configure it # - parameter: # $1 = white-space separated list of alternative flags # $2 = module name (optional, if different from id) AC_DEFUN([AX_CHECK_VALID_LD_FLAG], [ AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])]) save_ldflags="$LDFLAGS" newflag="no" for test_flag in $1; do LDFLAGS+=" ${test_flag}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ newflag="$test_flag" LDFLAGS="$save_ldflags" LDFLAGS+=" ${test_flag}" break; ]) LDFLAGS="$save_ldflags" done AC_SUBST(LDFLAGS) AC_MSG_RESULT([$newflag in $LDFLAGS]) ])