[yocto] RFC: autotooler: generation of "configure.ac" and "Makefile.am" using Kconfig

Ulf Samuelsson yocto at emagii.com
Sat Sep 30 07:49:09 PDT 2017


Have a need to convert a large number of libraries to use autotools.

I came up with the following idea:

I create an Kconfig based configuration system, where you define a 
number of configuration items needed by configure.ac and Makefile.am

You choose if you want to build an application, a shared library or a 
static library.

The build normally depends on other libraries, and you checkmarks
which library you are interested in from a (small) number of supported 
libraries.
You can likewise select to support options like "--enable-openssl",
again from a (small) number of supported options.

If you have stuff not supported, the autotooler will include Config.in
files allowing you to add your own items.

Once the configuration is complete, you will compile an application
which will generate "configure.ac" from the configuration file.

Again, if you have stuff not supported in the code, you can add it
in a user include file.

The generator will read a user-headers.inc file and
generate an AC_CHECK_HEADERS entry.


The autotooler is available on
	https://www.github.com/emagii/autotooler.git

===================================================================
Currently, it does not generate any Makefile.am files, but
the idea is to separate the source files into
* C source
* Public Headers
* Local Headers

A tool would then scan the directories and classify them accordingly,
so Makefile.am files should be possible to generate fairly easy.

===================================================================
A final step would clone a empty git tree, and populate it
with all the files needed for a complete package.
===================================================================

Comments appreciated.

Best Regards
Ulf Samuelsson
===================================================================
Here is a typical "autoconh.h" generated by Kconfig.

/*
  * Automatically generated C config: don't edit
  * Sat Sep 30 16:27:24 2017
  */
#define CONFIG_SHARED_LIB 1
#define CONFIG_PTHREAD 1
#define CONFIG_LIBRARY 1
#define CONFIG_PROJECT "myproject"
#define CONFIG_WORKDIR "${HOME}/projects/autotooler"
#define CONFIG_OPENSSL 1
#define CONFIG_CURL 1
#define CONFIG_COPYRIGHT_DATE "2017"
#define CONFIG_HOMEPAGE "http://www.emagii.com/"
#define CONFIG_EXAMPLES 1
#define CONFIG_DEBUG 1
#define HAVE_DOT_CONFIG 1
#define CONFIG_AC_PRERQ "2.59"
#define CONFIG_BOOST 1
#define CONFIG_OS_LINUX 1
#define CONFIG_LIBRARY_NAME "libyocto"
#define CONFIG_AUTHOR_EMAIL "ulf at emagii.com"
#define CONFIG_LIBRARY_VERSION "1.0"
#define CONFIG_AC_CONFIG_HEADER "src/include/config.h"
#define CONFIG_OS "Linux"
#define CONFIG_EXAMPLES_VAR "examples"
#define CONFIG_AC_CONFIG_MACRO_DIR "m4"
#define CONFIG_DEBUG_VAR "debug"
#define CONFIG_PROJECT_TYPE "library"
#define CONFIG_SRCDIR "src"
#define CONFIG_SRC_URI_REPO ""
#define CONFIG_AUTHOR "Ulf Samuelsson"
#define CONFIG_SRC_URI_HOST "https://www.github.com/emagii"
#define CONFIG_CURLPP 1
#define CONFIG_AM_INIT_AUTOMAKE "1.10 -Wall no-define"

The application will from this information generate:

AC_INIT([libyocto],
	[1.0],
	[Ulf Samuelsson],
	[libyocto-1.0],
	[http://www.emagii.com/])

AC_PRERQ([2.59])

AC_CONFIG_HEADER([src/include/config.h])

AC_CONFIG_SRCDIR([src])

AC_PROG_CPP
AC_PROG_CC
AC_INIT_AUTOMAKE([1.10 -Wall no-define])

AC_PROG_MAKE_SET
AM_MAINTAINER_MODE
AC_HEADER_STDC
AC_ENABLE_SHARED
AC_DISABLE_STATIC
AC_PROG_LIBTOOL
AC_HEADER_STDC

AC_CHECK_HEADERS( \
	ctype.h \
	errno.h \
	fcntl.h \
	openssl/bio.h \
	openssl/err.h \
	openssl/opensslconf.h \
	openssl/rand.h \
	openssl/ssl.h \
	pthread.h \
	stdio.h \
	stdlib.h \
	stdarg.h \
	stdint.h \
	string.h \
	signal.h \
	sys/ioctl.h \
	sys/socket.h \
	sys/time.h \
	sys/types.h \
	time.h \
	unistd.h \
	 \
	,
dnl to do if not found
	[],
dnl to do if not found
	[],
dnl default includes
	[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
dnl We do this default-include simply to make sure that the nameser_compat.h
dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
dnl (and others?) is not designed to allow this.
#ifdef HAVE_ARPA_NAMESER_H
#include <arpa/nameser.h>
#endif

dnl *Sigh* these are needed in order for net/if.h to get properly detected.
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
]
)

# ==== Boost Libraries
AC_ARG_WITH([boost-include-path],
	[AS_HELP_STRING([--with-boost-include-path],[location of the Boost 
headers, defaults to /usr/include/boost])],
	[CXXFLAGS_BOOST="-I$withval"],
	[CXXFLAGS_BOOST="-I/usr/include/boost"])
AC_SUBST([BOOST_CFLAGS])

AC_ARG_WITH([boost-lib-path],
	[AS_HELP_STRING([--with-boost-lib-path],[location of the Boost 
libraries, defaults to /usr/lib])],
	[BOOST_LIBS="-L$withval" -lboost_system -lboost_filesystem 
-lboost_program_options -lboost_thread -lpthread],
	[BOOST_LIBS="-L/usr/lib -lboost_system -lboost_filesystem 
-lboost_program_options -lboost_thread -lpthread"])
AC_SUBST([BOOST_LIBS])

AC_ARG_ENABLE(boost,
	[--enable-boost	Include Boost Libraries],
	[case "${enableval}" in
		yes)	use_boost=true  ;;
		no)	use_boost=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-boost) ;;
	 esac
	],
	[use_boost=false])
AM_CONDITIONAL(CONFIG_BOOST, test x$boost = xtrue)

# ==== cURL Libraries
AC_ARG_WITH([curl-include-path],
	[AS_HELP_STRING([--with-curl-include-path],[location of the cURL 
headers, defaults to /usr/include])],
	[CXXFLAGS_CURL="-I$withval"],
	[CXXFLAGS_CURL="-I/usr/include"])
AC_SUBST([CURL_CFLAGS])

AC_ARG_WITH([curl-lib-path],
	[AS_HELP_STRING([--with-curl-lib-path],[location of the cURL libraries, 
defaults to /usr/lib])],
	[CURL_LIBS="-L$withval" -lcurl],
	[CURL_LIBS="-L/usr/lib -lcurl"])
AC_SUBST([CURL_LIBS])

AC_ARG_ENABLE(curl,
	[--enable-curl	Include cURL],
	[case "${enableval}" in
		yes)	use_curl=true  ;;
		no)	use_curl=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-curl) ;;
	 esac
	],
	[use_curl=false])
AM_CONDITIONAL(CONFIG_CURL, test x$curl = xtrue)

# ==== cURLPP Libraries
AC_ARG_WITH([curlpp-include-path],
	[AS_HELP_STRING([--with-curlpp-include-path],[location of the cURLPP 
headers, defaults to /usr/include])],
	[CXXFLAGS_CURLPP="-I$withval"],
	[CXXFLAGS_CURLPP="-I/usr/include"])
AC_SUBST([CURLPP_CFLAGS])

AC_ARG_WITH([curlpp-lib-path],
	[AS_HELP_STRING([--with-curlpp-lib-path],[location of the cURLPP 
libraries, defaults to /usr/lib])],
	[CURLPP_LIBS="-L$withval" -lcurlpp -lutilspp],
	[CURLPP_LIBS="-L/usr/lib -lcurlpp -lutilspp"])
AC_SUBST([CURLPP_LIBS])

AC_ARG_ENABLE(curlpp,
	[--enable-curlpp	Include cURLPP],
	[case "${enableval}" in
		yes)	use_curlpp=true  ;;
		no)	use_curlpp=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-curlpp) ;;
	 esac
	],
	[use_curlpp=false])
AM_CONDITIONAL(CONFIG_CURLPP, test x$curlpp = xtrue)

# ==== OpenSSL Libraries
AC_ARG_WITH([openssl-include-path],
	[AS_HELP_STRING([--with-openssl-include-path],[location of the OpenSSL 
headers, defaults to /usr/include])],
	[CFLAGS_OPENSSL="-I$withval"],
	[CFLAGS_OPENSSL="-I/usr/include"])
AC_SUBST([OPENSSL_CFLAGS])

AC_ARG_WITH([openssl-lib-path],
	[AS_HELP_STRING([--with-openssl-lib-path],[location of the OpenSSL 
libraries, defaults to /usr/lib])],
	[OPENSSL_LIBS="-L$withval" -lssl],
	[OPENSSL_LIBS="-L/usr/lib -lssl"])
AC_SUBST([OPENSSL_LIBS])

AC_ARG_ENABLE(openssl,
	[--enable-openssl	Include OpenSSL],
	[case "${enableval}" in
		yes)	use_openssl=true  ;;
		no)	use_openssl=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-openssl) ;;
	 esac
	],
	[use_openssl=false])
AM_CONDITIONAL(CONFIG_OPENSSL, test x$openssl = xtrue)

# ==== Pthread Libraries
AC_ARG_WITH([pthread-include-path],
	[AS_HELP_STRING([--with-pthread-include-path],[location of the PThread 
headers, defaults to /usr/include])],
	[CFLAGS_PTHREAD="-I$withval"],
	[CFLAGS_PTHREAD="-I/usr/include"])
AC_SUBST([PTHREAD_CFLAGS])

AC_ARG_WITH([pthread-lib-path],
	[AS_HELP_STRING([--with-pthread-lib-path],[location of the PThread 
libraries, defaults to /usr/include])],
	[PTHREAD_LIBS="-L$withval" -lpthread],
	[PTHREAD_LIBS="-L/usr/include -lpthread"])
AC_SUBST([PTHREAD_LIBS])

AC_ARG_ENABLE(pthread,
	[--enable-pthread	Include PThreads],
	[case "${enableval}" in
		yes)	use_pthread=true  ;;
		no)	use_pthread=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-pthread) ;;
	 esac
	],
	[use_pthread=false])
AM_CONDITIONAL(CONFIG_PTHREAD, test x$pthread = xtrue)

# ==== Debug
AC_ARG_ENABLE(debug,
	[--enable-debug	Build with DEBUG enabled],
	[case "${enableval}" in
		yes)	debug=true  ;;
		no)	debug=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
	 esac
	],
	[debug=false])
AM_CONDITIONAL(CONFIG_DEBUG, test x$debug = xtrue)

AC_ARG_ENABLE(examples,
	[--enable-examples	Build examples],
	[case "${enableval}" in
		yes)	examples=true  ;;
		no)	examples=false ;;
		*) AC_MSG_ERROR(bad value ${enableval} for --enable-examples) ;;
	 esac
	],
	[examples=false])
AM_CONDITIONAL(CONFIG_EXAMPLES, test x$examples = xtrue)

AC_SUBST([CFLAGS])
AC_CONFIG_FILES([Makefile  libyocto.pc])
AC_OUTPUT



More information about the yocto mailing list