This commit is contained in:
Václav Valíček 2020-06-15 00:11:36 +02:00
parent 732abb2e64
commit 4576db4396
16 changed files with 109 additions and 218 deletions

23
.gitignore vendored
View File

@ -1,3 +1,4 @@
# original
.deps
.dirstamp
Makefile
@ -16,10 +17,8 @@ missing
src/Makefile
src/Makefile.in
src/*.o
src/myexecutable
stamp-h1
*~
myexecutable
test-driver
test-suite.log
tests/*.o
@ -34,3 +33,23 @@ full-package-name-VERSION/
*-coverage/
*.gcda
*.gcno
# Added
libtool
.libs
*.lo
*.la
main_executable
# M4???
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
# build-aux
build-aux/config.guess
build-aux/config.sub
build-aux/ltmain.sh

View File

@ -1,6 +0,0 @@
Example: http://git.savannah.gnu.org/cgit/make.git/tree/AUTHORS
GNU Coding Standards 6.3: Recording Contributors
http://www.gnu.org/prep/maintain/html_node/Recording-Contributors.html
First version of all files by Ruben Laguna <ruben.laguna at gmail.com>

View File

@ -1,28 +1,26 @@
AM_CFLAGS = # CFLAGS applicable to all executables (products)
AM_CPPFLAGS = -I$(top_srcdir)/src # so that tests also find header files
ACLOCAL_AMFLAGS = -I m4
# Convenience library so that it can be resued
# between my_executable and the tests
noinst_LIBRARIES = libcommon.a
libcommon_a_SOURCES = src/common.h src/common.c
# src/common.h appear in SOURCES to that it gets copied to
# distribution tgz.
# libtool library definition
lib_LTLIBRARIES = libtest.la
libtest_la_SOURCES = src/test.h src/test.c
# The main product
bin_PROGRAMS = myexecutable # make all will generate ./my_executable
bin_PROGRAMS = main_executable
#include .c and .h in SOURCES so that both appear in dist
myexecutable_SOURCES = \
src/add.c \
src/add.h \
src/main.c
myexecutable_CFLAGS = $(AM_CFLAGS) $(CODE_COVERAGE_CFLAGS) #--std=c11 # CFLAGS applicable to myexecutable_SOURCES
myexecutable_LDADD = libcommon.a
myexecutable_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
main_executable_SOURCES = src/main.c
main_executable_CFLAGS = $(AM_CFLAGS) $(CODE_COVERAGE_CFLAGS) #--std=c11 # CFLAGS applicable to myexecutable_SOURCES
main_executable_LDADD = libtest.la
main_executable_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
# myexecutable_CFLAGS = $(CODE_COVERAGE_CFLAGS)
pkgconfig_DATA = libtest.pc
# Tests
# 'check' comes from 'make check'
@ -33,13 +31,13 @@ myexecutable_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
CODE_COVERAGE_IGNORE_PATTERN = tests/*
CODE_COVERAGE_IGNORE_PATTERN += stdio2.h
TESTS = add.ctaptest
check_PROGRAMS = add.ctaptest
#TESTS = add.ctaptest
#check_PROGRAMS = add.ctaptest
add_ctaptest_SOURCES = tests/add.c src/add.c src/add.h
add_ctaptest_CPPFLAGS = $(AM_CPPFLAGS) # so that tests find the header files
add_ctaptest_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
add_ctaptest_CFLAGS = $(CODE_COVERAGE_CFLAGS)
#add_ctaptest_SOURCES = tests/add.c src/add.c src/add.h
#add_ctaptest_CPPFLAGS = $(AM_CPPFLAGS) # so that tests find the header files
#add_ctaptest_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
#add_ctaptest_CFLAGS = $(CODE_COVERAGE_CFLAGS)
# See http://www.gnu.org/software/automake/manual/html_node/Use-TAP-with-the-Automake-test-harness.html

19
NEWS
View File

@ -1,19 +0,0 @@
Read GNU Coding Standards 6.7
http://www.gnu.org/prep/standards/html_node/NEWS-File.html#NEWS-File
Example: http://git.savannah.gnu.org/cgit/make.git/tree/NEWS
YourProject NEWS
History of user-visible changes
25 Jan 2015
See the end of this file for copyrights and conditions.
Version 1.0.0
* New features: XXXX
Description of the feature

76
README
View File

@ -1,76 +0,0 @@
# autotools-template
Template for an autotools (autoconf, automake) project
Introduction
============
Setting up an `Autotools` build system can be daunting. So I decided to
create a template with the basics to use as the basis for my projects.
It may be surprising to the novice that there is no `./configure` but
`./configure` is a generated file that it's shipped with the
distribution of your software (the tarball that you get `make dist`).
As such the `./configure` doesn't belong in the source control
repository. Running `autoreconf -f` will generate `./configure` and a
bunch of other files.
To build from scrath you need to perform:
autoreconf -i # Only needed if configure.ac or Makefile.am changes
./configure # generates Makefiles and config.h
make # build
make check # run the tests
I'm not an autotools expert by any means. So take my advice with a grain
of salt.
There are two input files:
* `configure.ac`: The `./configure` script will be generated from
from it. Here is were you check for libraries,
headers, etc.
* `Makefile.am`: This file will be transformed into `Makefile.in` that
`./configure` will use to generate the `Makefile`.
Regarding tests, the basic aproach is to have multiple is to run some
programs with the test and just check the exit code for those. This is
simple and functional but you only get a PASS / FAIL per executable. To
be able to get the individual tests results (asusming that there are
several , potentially hundreds, of test on a single executable) you need
to use the TAP.
The TAP aproach is that the executables that you use for test will
output the test result on standard out so that `make check` will parse
it, collect the results, and present them in a nice way.
I opted to go for the TAP approach although it requires a more complex
setup.
What to do after cloning the repository
=======================================
configure.ac
------------
Edit configure.ac to change the FULL-PACKAGE-NAME, VERSION and
BUG-REPORT-ADDRESS fields to match your project.
Makefile.am
-----------
Edit src/Makefile.am to say which "products" (executables, binaries)
will be generated and what are the source files for each one.
bin_PROGRAMS = executable1 executable2
executable1_SOURCES = sourcefile1.c sourcefile2.c
executable1_CFLAGS =
executable2_SOURCES = sourcefile3.c sourcefile4.c
executable2_CFLAGS =
Reference material
==================
Autotools: A Practitioner's Guide to GNU Autoconf, Automake, and Libtool by John Calcote
Autotools Mythbuster https://autotools.io/index.html

View File

@ -6,5 +6,5 @@
# autoreconf runs all the autotool configuration tools in the right order
# and will avoid regenerating files.
#
autoreconf --install --make # install missing files
autoreconf --install
# automake --add-missing --copy >/dev/null 2>&1 # add install-sh

View File

@ -1,84 +1,44 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT([test_automake_static], [0.9.1], [https://github.com/valicek1])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign subdir-objects]) # Does not require NEWS, COPYING, AUTHORS, ChangeLog or README
# silent make https://autotools.io/automake/silent.html
# silent rules enabled by default with 'yes'
# disable silent runles with ./configure --disable-silent-rules
AM_SILENT_RULES([yes]) # less verbose make output
# AM_SILENT_RULES() # use make -s to get silent output
AM_SILENT_RULES([yes]) # silent rules, for make -s use just [] as arg
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_SRCDIR([src/main.c]) # main src dir
AC_CONFIG_HEADERS([config.h]) # use config.h instead of passing -D in the command line
AC_CONFIG_MACRO_DIR([m4])
AC_LANG([C]) # Use C not C++
AC_LANG([C]) # use C
# Checks for programs.
AC_PROG_CC
# In case that you want to check for specific versions of gcc
# For example in case that you need C11 support you want to
# check for gcc-4.9
#AC_PROG_CC([gcc-4.9 gcc cc])
AC_PROG_CC_C99 # or AC_PROG_CC_89 to force C89 mode or AC_PROG_CC_STDC to go to latest supported standard (currently C99)
AC_PROG_CC # Checks for programs
AC_PROG_CC_C99 # C99 standard
AC_PROG_INSTALL
AC_PROG_CC_C_O # Need to have per product flags myexecutable_CFLAG
AC_PROG_RANLIB # Need for to create libraries: .a
# Checks for libraries.
# Found libraries are automatically addded to LIBS
# AC_SEARCH_LIBS([pthread_cond_wait], [pthread],[],[
# AC_MSG_ERROR([You need to install pthreads library.])
# ])
# AC_SEARCH_LIBS([g_test_init], [glib-2.0],[],[
# AC_MSG_ERROR([You need to install glib-2.0 library.])
# ])
AC_PROG_CC_C_O # Need to have per product flags myexecutable_CFLAG
LT_INIT([disable-shared])
AC_SUBST(LIBTOOL_DEPS)
AC_LTDL_DLLIB
PKG_INSTALLDIR
# Checks for header files.
AC_HEADER_ASSERT # ./configure --disable-assert to define NDEBUG
AC_CHECK_HEADER([stdlib.h])
# Check for C11's optional Atomic operations library
# AC_CHECK_HEADER([stdatomic.h], [], [
# AC_MSG_ERROR([C11 with atomic support needed.])
# ])
AC_ARG_ENABLE([myerror],
AS_HELP_STRING([--enable-myerror],[enable error]),
[enable_myerror=yes],[enable_myerror=${enableval}])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
# The following statement will use pkg-config --cflags --libs
# to find out CFLAGS and -l options required to build a target that
# it's going to link against glib2.0.
# The required CFLAGS and -l options are available as DEPS_CFLAGS
# and DEPS_LIBS in Makefile.am
# PKG_CHECK_MODULES([DEPS], [glib-2.0 >= 2.24.1])
AC_ARG_ENABLE([myfeature],
AS_HELP_STRING([--disable-myfeature],[disable myfeature to get remove support for this and that]),
[enable_myfeature=${enableval}],[enable_myfeature=yes])
if test "x${enable_myfeature}" == "xyes"; then
AC_DEFINE([MYFEATURE], 1, [myfeature is enabled])
else
if test "x${enable_myerror}" == "xyes"; then
AC_DEFINE([MYERROR], 1, [myerroris enabled])
AC_MSG_WARN([
-----------------------------------------------------------------------------------
Are you sure that you want to have myfeature disabled? You will lose this and that.
Results won't be real!
-----------------------------------------------------------------------------------
])
fi
AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([Makefile libtest.pc])
AC_REQUIRE_AUX_FILE([tap-driver.sh])
AX_VALGRIND_CHECK # http://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html - make check-valgrind
AX_CODE_COVERAGE # http://www.gnu.org/software/autoconf-archive/ax_code_coverage.html#ax_code_coverage - make check-code-coverage generates coverage report

13
libtest.pc Normal file
View File

@ -0,0 +1,13 @@
prefix=/home/vasek/ll
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: test_automake_static
Description: test_automake_static 0.9.1
Version: 0.9.1
Requires:
Cflags: -I${includedir}
Libs: -L${libdir} -llibtest

13
libtest.pc.in Normal file
View File

@ -0,0 +1,13 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: @PACKAGE_NAME@
Description: @PACKAGE_STRING@
Version: @PACKAGE_VERSION@
Requires:
Cflags: -I${includedir}
Libs: -L${libdir} -llibtest

View File

@ -1,5 +0,0 @@
#include "add.h"
int add(int a, int b) {
return a + b;
}

View File

@ -1,6 +0,0 @@
#ifndef ADD_H
#define ADD_H
int add(int a,int b);
#endif /* ADD_H */

View File

@ -1,6 +0,0 @@
#include <stdio.h>
#include "common.h"
void myfunc()
{
printf("myfunc() called\n");
}

View File

@ -1,9 +0,0 @@
#ifndef COMMON_H
#define COMMON_H
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
void myfunc();
#endif /* COMMON_H */

View File

@ -1,19 +1,13 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#include <config.h>
#endif
#include <stdio.h>
#include "common.h"
#include <assert.h>
#include "test.h"
int main(int argc, char *argv[])
{
printf ("Hello world\n");
printf ("PACKAGE " PACKAGE "\n");
printf ("PACKAGE_BUGREPORT " PACKAGE_BUGREPORT "\n");
printf ("PACKAGE_NAME "PACKAGE_NAME "\n");
printf ("PACKAGE_STRING " PACKAGE_STRING "\n");
printf ("PACKAGE_TARNAME " PACKAGE_TARNAME "\n");
assert( 1 > 0);
printf("14 + 5 = %d\n", mysum(14, 5));
return 0;
}

12
src/test.c Normal file
View File

@ -0,0 +1,12 @@
#include <stdio.h>
#include "test.h"
int mysum(int a, int b){
#ifdef MYERROR
return 42;
#endif
return a + b;
}

9
src/test.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef TEST_H
#define TEST_H
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
int mysum(int a, int b);
#endif /* TEST_H */