blob: f6db096f0e2a1d65c27e9c4110f586b82ecc2210 [file] [log] [blame]
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of libgpiod.
#
# Copyright (C) 2017-2019 Bartosz Golaszewski <bartekgola@gmail.com>
#
AC_PREREQ([2.69])
AC_INIT([libgpiod],[2.0])
AC_SUBST(EXTRA_VERSION, [-devel])
AC_DEFINE_UNQUOTED([GPIOD_VERSION_STR],
["$PACKAGE_VERSION$EXTRA_VERSION"],
[Full library version string.])
AC_SUBST(VERSION_STR, [$PACKAGE_VERSION$EXTRA_VERSION])
# From the libtool manual:
#
# (...)
# 3. If the library source code has changed at all since the last update, then
# increment revision ('c:r:a' becomes 'c:r+1:a').
# 4. If any interfaces have been added, removed, or changed since the last
# update, increment current, and set revision to 0.
# 5. If any interfaces have been added since the last public release, then
# increment age.
# 6. If any interfaces have been removed or changed since the last public
# release, then set age to 0.
#
# Define the libtool version as (C.R.A):
# NOTE: this version only applies to the core C library.
AC_SUBST(ABI_VERSION, [4.1.2])
# Have a separate ABI version for C++ bindings:
AC_SUBST(ABI_CXX_VERSION, [2.1.1])
# ABI version for libgpiomockup (we need this since it can be installed if we
# enable install-tests).
AC_SUBST(ABI_MOCKUP_VERSION, [0.1.0])
AC_CONFIG_AUX_DIR([autostuff])
AC_CONFIG_MACRO_DIRS([m4])
AM_INIT_AUTOMAKE([foreign subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
m4_pattern_forbid([^AX_],
[Unexpanded AX_ macro found. Please install GNU autoconf-archive.])
AC_ARG_VAR([PYTHON_CPPFLAGS],
[Compiler flags to find Python headers [default: auto-detect]])
AC_ARG_VAR([PYTHON_LIBS],
[Libraries to link into Python extensions [default: auto-detect]])
AC_CONFIG_SRCDIR([lib])
AC_CONFIG_HEADER([config.h])
AC_DEFINE([_GNU_SOURCE], [], [We want GNU extensions])
# Silence warning: ar: 'u' modifier ignored since 'D' is the default
AC_SUBST(AR_FLAGS, [cr])
AM_PROG_AR
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
LT_INIT
AC_DEFUN([ERR_NOT_FOUND],
[AC_MSG_ERROR([$1 not found (needed to build $2)], [1])])
AC_DEFUN([FUNC_NOT_FOUND_LIB],
[ERR_NOT_FOUND([$1()], [the library])])
AC_DEFUN([HEADER_NOT_FOUND_LIB],
[ERR_NOT_FOUND([$1 header], [the library])])
AC_DEFUN([HEADER_NOT_FOUND_TESTS],
[ERR_NOT_FOUND([$1 header], [the test suite])])
AC_DEFUN([HEADER_NOT_FOUND_CXX],
[ERR_NOT_FOUND([$1 header], [C++ bindings])])
# This is always checked (library needs this)
AC_HEADER_STDC
AC_FUNC_MALLOC
AC_CHECK_FUNC([ioctl], [], [FUNC_NOT_FOUND_LIB([ioctl])])
AC_CHECK_FUNC([asprintf], [], [FUNC_NOT_FOUND_LIB([asprintf])])
AC_CHECK_FUNC([scandir], [], [FUNC_NOT_FOUND_LIB([scandir])])
AC_CHECK_FUNC([alphasort], [], [FUNC_NOT_FOUND_LIB([alphasort])])
AC_CHECK_FUNC([ppoll], [], [FUNC_NOT_FOUND_LIB([ppoll])])
AC_CHECK_FUNC([realpath], [], [FUNC_NOT_FOUND_LIB([realpath])])
AC_CHECK_HEADERS([getopt.h], [], [HEADER_NOT_FOUND_LIB([getopt.h])])
AC_CHECK_HEADERS([dirent.h], [], [HEADER_NOT_FOUND_LIB([dirent.h])])
AC_CHECK_HEADERS([sys/poll.h], [], [HEADER_NOT_FOUND_LIB([sys/poll.h])])
AC_CHECK_HEADERS([sys/sysmacros.h], [], [HEADER_NOT_FOUND_LIB([sys/sysmacros.h])])
AC_CHECK_HEADERS([linux/version.h], [], [HEADER_NOT_FOUND_LIB([linux/version.h])])
AC_CHECK_HEADERS([linux/const.h], [], [HEADER_NOT_FOUND_LIB([linux/const.h])])
AC_CHECK_HEADERS([linux/ioctl.h], [], [HEADER_NOT_FOUND_LIB([linux/ioctl.h])])
AC_CHECK_HEADERS([linux/types.h], [], [HEADER_NOT_FOUND_LIB([linux/types.h])])
AC_ARG_ENABLE([tools],
[AS_HELP_STRING([--enable-tools],[enable libgpiod command-line tools [default=no]])],
[if test "x$enableval" = xyes; then with_tools=true; fi],
[with_tools=false])
AM_CONDITIONAL([WITH_TOOLS], [test "x$with_tools" = xtrue])
AC_DEFUN([FUNC_NOT_FOUND_TOOLS],
[ERR_NOT_FOUND([$1()], [tools])])
AC_DEFUN([HEADER_NOT_FOUND_TOOLS],
[ERR_NOT_FOUND([$1 header], [tools])])
if test "x$with_tools" = xtrue
then
# These are only needed to build tools
AC_CHECK_FUNC([basename], [], [FUNC_NOT_FOUND_TOOLS([basename])])
AC_CHECK_FUNC([daemon], [], [FUNC_NOT_FOUND_TOOLS([daemon])])
AC_CHECK_FUNC([signalfd], [], [FUNC_NOT_FOUND_TOOLS([signalfd])])
AC_CHECK_FUNC([setlinebuf], [], [FUNC_NOT_FOUND_TOOLS([setlinebuf])])
AC_CHECK_HEADERS([sys/signalfd.h], [], [HEADER_NOT_FOUND_TOOLS([sys/signalfd.h])])
fi
AC_ARG_ENABLE([tests],
[AS_HELP_STRING([--enable-tests],[enable libgpiod tests [default=no]])],
[if test "x$enableval" = xyes; then with_tests=true; fi],
[with_tests=false])
AM_CONDITIONAL([WITH_TESTS], [test "x$with_tests" = xtrue])
AC_DEFUN([FUNC_NOT_FOUND_TESTS],
[ERR_NOT_FOUND([$1()], [tests])])
if test "x$with_tests" = xtrue
then
# For libgpiomockup
AC_CHECK_FUNC([qsort], [], [FUNC_NOT_FOUND_TESTS([qsort])])
PKG_CHECK_MODULES([KMOD], [libkmod >= 18])
PKG_CHECK_MODULES([UDEV], [libudev >= 215])
# For core library tests
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.50])
if test "x$with_tools" = xtrue
then
AC_CHECK_PROG([has_bats], [bats], [true], [false])
if test "x$has_bats" = "xflase"
then
AC_MSG_NOTICE(["bats not found - gpio-tools tests cannot be run])
fi
fi
fi
AC_ARG_ENABLE([examples],
[AS_HELP_STRING([--enable-examples], [enable building code examples[default=no]])],
[if test "x$enableval" = xyes; then with_examples=true; fi],
[with_examples=false])
AM_CONDITIONAL([WITH_EXAMPLES], [test "x$with_examples" = xtrue])
AC_ARG_ENABLE([bindings-cxx],
[AS_HELP_STRING([--enable-bindings-cxx],[enable C++ bindings [default=no]])],
[if test "x$enableval" = xyes; then with_bindings_cxx=true; fi],
[with_bindings_cxx=false])
AM_CONDITIONAL([WITH_BINDINGS_CXX], [test "x$with_bindings_cxx" = xtrue])
if test "x$with_bindings_cxx" = xtrue
then
AC_LIBTOOL_CXX
# This needs autoconf-archive
AX_CXX_COMPILE_STDCXX_11([ext], [mandatory])
if test "x$with_tests" = xtrue
then
PKG_CHECK_MODULES([CATCH2], [catch2],, [
AC_LANG_PUSH([C++])
AC_CHECK_HEADERS([catch2/catch.hpp], [], [HEADER_NOT_FOUND_CXX([catch2/catch.hpp])])
AC_LANG_POP([C++])
])
fi
if test "x$with_examples" = xtrue
then
# Examples use C++17 features
AX_CXX_COMPILE_STDCXX([17], [ext], [mandatory])
fi
fi
AC_ARG_ENABLE([bindings-python],
[AS_HELP_STRING([--enable-bindings-python],[enable python3 bindings [default=no]])],
[if test "x$enableval" = xyes; then with_bindings_python=true; fi],
[with_bindings_python=false])
AM_CONDITIONAL([WITH_BINDINGS_PYTHON], [test "x$with_bindings_python" = xtrue])
if test "x$with_bindings_python" = xtrue
then
AM_PATH_PYTHON([3.0], [],
[AC_MSG_ERROR([python3 not found - needed for python bindings])])
AC_CHECK_PROG([has_python_config], [python3-config], [true], [false])
if test "x$has_python_config" = xfalse
then
AC_MSG_ERROR([python3-config not found - needed for python bindings])
fi
AS_IF([test -z "$PYTHON_CPPFLAGS"],
[AC_SUBST(PYTHON_CPPFLAGS, [`$PYTHON-config --includes`])])
AS_IF([test -z "$PYTHON_LIBS"],
[AC_SUBST(PYTHON_LIBS, [`$PYTHON-config --libs`])])
fi
AC_CHECK_PROG([has_doxygen], [doxygen], [true], [false])
AM_CONDITIONAL([HAS_DOXYGEN], [test "x$has_doxygen" = xtrue])
if test "x$has_doxygen" = xfalse
then
AC_MSG_NOTICE([doxygen not found - documentation cannot be generated])
fi
AM_COND_IF([HAS_DOXYGEN], [AC_CONFIG_FILES([Doxyfile])])
if test "x$cross_compiling" = xno
then
AC_CHECK_PROG([has_help2man], [help2man], [true], [false])
fi
AM_CONDITIONAL([WITH_MANPAGES], [test "x$has_help2man" = xtrue])
if test "x$has_help2man" = xfalse
then
AC_MSG_NOTICE([help2man not found - man pages cannot be generated automatically])
fi
AC_CONFIG_FILES([Makefile
include/Makefile
lib/Makefile
lib/libgpiod.pc
tools/Makefile
tests/Makefile
tests/mockup/Makefile
bindings/cxx/libgpiodcxx.pc
bindings/Makefile
bindings/cxx/Makefile
bindings/cxx/examples/Makefile
bindings/cxx/tests/Makefile
bindings/python/Makefile
bindings/python/examples/Makefile
bindings/python/tests/Makefile
man/Makefile])
AC_OUTPUT