better support for new C++ standards, for README.md and more options in build-in-docker.sh

This commit is contained in:
Marc Wäckerlin
2019-11-12 09:42:51 +01:00
parent 34251b583e
commit 702d962426
15 changed files with 2461 additions and 509 deletions

View File

@@ -1 +0,0 @@
/usr/share/automake-1.15/INSTALL

136
INSTALL Normal file
View File

@@ -0,0 +1,136 @@
Install Software
================
There are prebuilt software packages in the repositories, look in
https://repository.mrw.sh for your operating system.
Note: PublicKey has changed on Novmber 1st 2015, please import the new
key.
Linux
-----
There are package repositories for most distributions at https://repository.mrw.sh.
### Ubuntu and Debian
To accept my signature, install my key:
wget -O- https://repository.mrw.sh/PublicKey \
| sudo apt-key add -
You can install all software using your package manager (`apt`), first install the repository:
sudo apt-get install -y wget software-properties-common apt-transport-https
sudo apt-add-repository https://repository.mrw.sh
sudo apt-get update -y
Then you can install any project you wish, e.g. [`webtester`](https://mrw.sh/development/webtester):
sudo apt-get install webtester -y
### OpenSUSE
To accept my signature, install my key:
wget https://repository.mrw.sh/PublicKey
rpm --import PublicKey
You can use your packagemanager (`zypper` or _YaST_). First install the repostitory:
zypper ar https://repository.mrw.sh/opensuse/marc-waeckerlin.repo
Then install packages from the repository, e.g. [`webtester`](https://mrw.sh/development/webtester):
zypper install webtester
In case of trouble: Check if your version of OpenSUSE is supported,
use `lsb_release -rs` to get the version of your OpenSUSE:
https://drepository.mrw.sh/opensuse
### Fedora
To accept my signature, install my key:
wget https://repository.mrw.sh/PublicKey
rpm --import PublicKey
You can use your packagemanager (`dnf`). First install the repository:
dnf install 'dnf-command(config-manager)'
dnf config-manager --add-repo https://repository.mrw.sh/fedora/marc-waeckerlin.repo
Then install packages from the repository, e.g. [`webtester`](https://mrw.sh/development/webtester):
dnf install webtester
In case of trouble: Check if your version of Fedora is supported, use `lsb_release -rs` to get the version of your Fedora: https://repository.mrw.sh/fedora
### CentOS
To accept my signature, install my key:
wget https://repository.mrw.sh/PublicKey
rpm --import PublicKey
You can use your packagemanager (`yum`). First install the repository:
yum install wget
wget -O/etc/yum.repos.d/marc-waeckerlin.repo https://repository.mrw.sh/centos/marc-waeckerlin.repo
Then install packages from the repository, e.g. [`webtester`](https://mrw.sh/development/webtester):
yum install webtester
In case of trouble: Check if your version of CentOS is supported, use lsb_release -rs to get the version of your CentOS: https://repository.mrw.sh/centos
### Mageia
To accept my signature, install my key:
wget https://repository.mrw.sh/PublicKey
rpm --import PublicKey
You can use your packagemanager (`dnf`). First install the repository:
dnf install 'dnf-command(config-manager)'
dnf config-manager --add-repo https://repository.mrw.sh/mageia/marc-waeckerlin.repo
Then install packages from the repository, e.g. [`webtester`](https://mrw.sh/development/webtester):
dnf install webtester
### Other Linux Distributions
Either use the nearest possible distribution, or use alien to convert from another distribution to your preferred package format, or compile the project yourself (see below).
Windows
-------
Download from https://repository.mrw.sh/windows
MacOSX
------
You need e.g. Mac Ports to compile. Install the following dependencies:
sudo port install subversion svn2cl doxygen graphviz cppunit libtool boost log4cxx qt5-mac
Fix libtool-bug:
sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize
Compile from Source
-------------------
For all unsupported operating systems, including MacOSX.
To compile, please download the tar-sources from: https://repository.mrw.sh/sources
Then untar the package and use the common commands, e.g. for version `1.0.2` of a project named project, that means:
tar xzf project-1.0.2.tar.gz
cd project-1.0.2
./bootstrap.sh
./configure
make
sudo make install

948
ax_cxx_compile_stdcxx.m4 Normal file
View File

@@ -0,0 +1,948 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the specified
# version of the C++ standard. If necessary, add switches to CXX and
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
# or '14' (for the C++14 standard).
#
# The second argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The third argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline support for the specified C++ standard is
# required and that the macro should error out if no mode with that
# support is found. If specified 'optional', then configuration proceeds
# regardless, after defining HAVE_CXX${VERSION} if and only if a
# supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 10
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
[$1], [17], [ax_cxx_compile_alternatives="17 1z"],
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$2], [], [],
[$2], [ext], [],
[$2], [noext], [],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
for alternative in ${ax_cxx_compile_alternatives}; do
switch="-std=gnu++${alternative}"
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
m4_if([$2], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
dnl Cray's crayCC needs "-h std=c++11"
for alternative in ${ax_cxx_compile_alternatives}; do
for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
if test x$ac_success = xyes; then
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
fi
fi
if test x$ac_success = xno; then
HAVE_CXX$1=0
AC_MSG_NOTICE([No compiler with C++$1 support was found])
else
HAVE_CXX$1=1
AC_DEFINE(HAVE_CXX$1,1,
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
])
dnl Test body for checking C++11 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
)
dnl Test body for checking C++14 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
)
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
_AX_CXX_COMPILE_STDCXX_testbody_new_in_17
)
dnl Tests for new features in C++11
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
// If the compiler admits that it is not ready for C++11, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201103L
#error "This is not a C++11 compiler"
#else
namespace cxx11
{
namespace test_static_assert
{
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
}
namespace test_final_override
{
struct Base
{
virtual void f() {}
};
struct Derived : public Base
{
virtual void f() override {}
};
}
namespace test_double_right_angle_brackets
{
template < typename T >
struct check {};
typedef check<void> single_type;
typedef check<check<void>> double_type;
typedef check<check<check<void>>> triple_type;
typedef check<check<check<check<void>>>> quadruple_type;
}
namespace test_decltype
{
int
f()
{
int a = 1;
decltype(a) b = 2;
return a + b;
}
}
namespace test_type_deduction
{
template < typename T1, typename T2 >
struct is_same
{
static const bool value = false;
};
template < typename T >
struct is_same<T, T>
{
static const bool value = true;
};
template < typename T1, typename T2 >
auto
add(T1 a1, T2 a2) -> decltype(a1 + a2)
{
return a1 + a2;
}
int
test(const int c, volatile int v)
{
static_assert(is_same<int, decltype(0)>::value == true, "");
static_assert(is_same<int, decltype(c)>::value == false, "");
static_assert(is_same<int, decltype(v)>::value == false, "");
auto ac = c;
auto av = v;
auto sumi = ac + av + 'x';
auto sumf = ac + av + 1.0;
static_assert(is_same<int, decltype(ac)>::value == true, "");
static_assert(is_same<int, decltype(av)>::value == true, "");
static_assert(is_same<int, decltype(sumi)>::value == true, "");
static_assert(is_same<int, decltype(sumf)>::value == false, "");
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
return (sumf > 0.0) ? sumi : add(c, v);
}
}
namespace test_noexcept
{
int f() { return 0; }
int g() noexcept { return 0; }
static_assert(noexcept(f()) == false, "");
static_assert(noexcept(g()) == true, "");
}
namespace test_constexpr
{
template < typename CharT >
unsigned long constexpr
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
{
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
}
template < typename CharT >
unsigned long constexpr
strlen_c(const CharT *const s) noexcept
{
return strlen_c_r(s, 0UL);
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("1") == 1UL, "");
static_assert(strlen_c("example") == 7UL, "");
static_assert(strlen_c("another\0example") == 7UL, "");
}
namespace test_rvalue_references
{
template < int N >
struct answer
{
static constexpr int value = N;
};
answer<1> f(int&) { return answer<1>(); }
answer<2> f(const int&) { return answer<2>(); }
answer<3> f(int&&) { return answer<3>(); }
void
test()
{
int i = 0;
const int c = 0;
static_assert(decltype(f(i))::value == 1, "");
static_assert(decltype(f(c))::value == 2, "");
static_assert(decltype(f(0))::value == 3, "");
}
}
namespace test_uniform_initialization
{
struct test
{
static const int zero {};
static const int one {1};
};
static_assert(test::zero == 0, "");
static_assert(test::one == 1, "");
}
namespace test_lambdas
{
void
test1()
{
auto lambda1 = [](){};
auto lambda2 = lambda1;
lambda1();
lambda2();
}
int
test2()
{
auto a = [](int i, int j){ return i + j; }(1, 2);
auto b = []() -> int { return '0'; }();
auto c = [=](){ return a + b; }();
auto d = [&](){ return c; }();
auto e = [a, &b](int x) mutable {
const auto identity = [](int y){ return y; };
for (auto i = 0; i < a; ++i)
a += b--;
return x + identity(a + b);
}(0);
return a + b + c + d + e;
}
int
test3()
{
const auto nullary = [](){ return 0; };
const auto unary = [](int x){ return x; };
using nullary_t = decltype(nullary);
using unary_t = decltype(unary);
const auto higher1st = [](nullary_t f){ return f(); };
const auto higher2nd = [unary](nullary_t f1){
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
};
return higher1st(nullary) + higher2nd(nullary)(unary);
}
}
namespace test_variadic_templates
{
template <int...>
struct sum;
template <int N0, int... N1toN>
struct sum<N0, N1toN...>
{
static constexpr auto value = N0 + sum<N1toN...>::value;
};
template <>
struct sum<>
{
static constexpr auto value = 0;
};
static_assert(sum<>::value == 0, "");
static_assert(sum<1>::value == 1, "");
static_assert(sum<23>::value == 23, "");
static_assert(sum<1, 2>::value == 3, "");
static_assert(sum<5, 5, 11>::value == 21, "");
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
}
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this.
namespace test_template_alias_sfinae
{
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
} // namespace cxx11
#endif // __cplusplus >= 201103L
]])
dnl Tests for new features in C++14
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
// If the compiler admits that it is not ready for C++14, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201402L
#error "This is not a C++14 compiler"
#else
namespace cxx14
{
namespace test_polymorphic_lambdas
{
int
test()
{
const auto lambda = [](auto&&... args){
const auto istiny = [](auto x){
return (sizeof(x) == 1UL) ? 1 : 0;
};
const int aretiny[] = { istiny(args)... };
return aretiny[0];
};
return lambda(1, 1L, 1.0f, '1');
}
}
namespace test_binary_literals
{
constexpr auto ivii = 0b0000000000101010;
static_assert(ivii == 42, "wrong value");
}
namespace test_generalized_constexpr
{
template < typename CharT >
constexpr unsigned long
strlen_c(const CharT *const s) noexcept
{
auto length = 0UL;
for (auto p = s; *p; ++p)
++length;
return length;
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("x") == 1UL, "");
static_assert(strlen_c("test") == 4UL, "");
static_assert(strlen_c("another\0test") == 7UL, "");
}
namespace test_lambda_init_capture
{
int
test()
{
auto x = 0;
const auto lambda1 = [a = x](int b){ return a + b; };
const auto lambda2 = [a = lambda1(x)](){ return a; };
return lambda2();
}
}
namespace test_digit_separators
{
constexpr auto ten_million = 100'000'000;
static_assert(ten_million == 100000000, "");
}
namespace test_return_type_deduction
{
auto f(int& x) { return x; }
decltype(auto) g(int& x) { return x; }
template < typename T1, typename T2 >
struct is_same
{
static constexpr auto value = false;
};
template < typename T >
struct is_same<T, T>
{
static constexpr auto value = true;
};
int
test()
{
auto x = 0;
static_assert(is_same<int, decltype(f(x))>::value, "");
static_assert(is_same<int&, decltype(g(x))>::value, "");
return x;
}
}
} // namespace cxx14
#endif // __cplusplus >= 201402L
]])
dnl Tests for new features in C++17
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
// If the compiler admits that it is not ready for C++17, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201703L
#error "This is not a C++17 compiler"
#else
#include <initializer_list>
#include <utility>
#include <type_traits>
namespace cxx17
{
namespace test_constexpr_lambdas
{
constexpr int foo = [](){return 42;}();
}
namespace test::nested_namespace::definitions
{
}
namespace test_fold_expression
{
template<typename... Args>
int multiply(Args... args)
{
return (args * ... * 1);
}
template<typename... Args>
bool all(Args... args)
{
return (args && ...);
}
}
namespace test_extended_static_assert
{
static_assert (true);
}
namespace test_auto_brace_init_list
{
auto foo = {5};
auto bar {5};
static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
static_assert(std::is_same<int, decltype(bar)>::value);
}
namespace test_typename_in_template_template_parameter
{
template<template<typename> typename X> struct D;
}
namespace test_fallthrough_nodiscard_maybe_unused_attributes
{
int f1()
{
return 42;
}
[[nodiscard]] int f2()
{
[[maybe_unused]] auto unused = f1();
switch (f1())
{
case 17:
f1();
[[fallthrough]];
case 42:
f1();
}
return f1();
}
}
namespace test_extended_aggregate_initialization
{
struct base1
{
int b1, b2 = 42;
};
struct base2
{
base2() {
b3 = 42;
}
int b3;
};
struct derived : base1, base2
{
int d;
};
derived d1 {{1, 2}, {}, 4}; // full initialization
derived d2 {{}, {}, 4}; // value-initialized bases
}
namespace test_general_range_based_for_loop
{
struct iter
{
int i;
int& operator* ()
{
return i;
}
const int& operator* () const
{
return i;
}
iter& operator++()
{
++i;
return *this;
}
};
struct sentinel
{
int i;
};
bool operator== (const iter& i, const sentinel& s)
{
return i.i == s.i;
}
bool operator!= (const iter& i, const sentinel& s)
{
return !(i == s);
}
struct range
{
iter begin() const
{
return {0};
}
sentinel end() const
{
return {5};
}
};
void f()
{
range r {};
for (auto i : r)
{
[[maybe_unused]] auto v = i;
}
}
}
namespace test_lambda_capture_asterisk_this_by_value
{
struct t
{
int i;
int foo()
{
return [*this]()
{
return i;
}();
}
};
}
namespace test_enum_class_construction
{
enum class byte : unsigned char
{};
byte foo {42};
}
namespace test_constexpr_if
{
template <bool cond>
int f ()
{
if constexpr(cond)
{
return 13;
}
else
{
return 42;
}
}
}
namespace test_selection_statement_with_initializer
{
int f()
{
return 13;
}
int f2()
{
if (auto i = f(); i > 0)
{
return 3;
}
switch (auto i = f(); i + 4)
{
case 17:
return 2;
default:
return 1;
}
}
}
namespace test_template_argument_deduction_for_class_templates
{
template <typename T1, typename T2>
struct pair
{
pair (T1 p1, T2 p2)
: m1 {p1},
m2 {p2}
{}
T1 m1;
T2 m2;
};
void f()
{
[[maybe_unused]] auto p = pair{13, 42u};
}
}
namespace test_non_type_auto_template_parameters
{
template <auto n>
struct B
{};
B<5> b1;
B<'a'> b2;
}
namespace test_structured_bindings
{
int arr[2] = { 1, 2 };
std::pair<int, int> pr = { 1, 2 };
auto f1() -> int(&)[2]
{
return arr;
}
auto f2() -> std::pair<int, int>&
{
return pr;
}
struct S
{
int x1 : 2;
volatile double y1;
};
S f3()
{
return {};
}
auto [ x1, y1 ] = f1();
auto& [ xr1, yr1 ] = f1();
auto [ x2, y2 ] = f2();
auto& [ xr2, yr2 ] = f2();
const auto [ x3, y3 ] = f3();
}
namespace test_exception_spec_type_system
{
struct Good {};
struct Bad {};
void g1() noexcept;
void g2();
template<typename T>
Bad
f(T*, T*);
template<typename T1, typename T2>
Good
f(T1*, T2*);
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
}
namespace test_inline_variables
{
template<class T> void f(T)
{}
template<class T> inline T g(T)
{
return T{};
}
template<> inline void f<>(int)
{}
template<> int g<>(int)
{
return 5;
}
}
} // namespace cxx17
#endif // __cplusplus < 201703L
]])

View File

@@ -170,9 +170,11 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_SUBST(NUMBERS) AX_SUBST(NUMBERS)
AX_SUBST(HOME) AX_SUBST(HOME)
if test -f README.md; then if test -f README.md; then
README_FILE=README.md
README=$(tail -n +3 README.md) README=$(tail -n +3 README.md)
DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,')
else else
README_FILE=README
README=$(tail -n +3 README) README=$(tail -n +3 README)
DESCRIPTION=$(head -1 README) DESCRIPTION=$(head -1 README)
fi fi
@@ -182,6 +184,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
else else
README_HTML="${README}" README_HTML="${README}"
fi fi
AX_SUBST(README_FILE)
AX_SUBST(README) AX_SUBST(README)
_AM_SUBST_NOTMAKE([README]) _AM_SUBST_NOTMAKE([README])
AX_SUBST(README_ESCAPED) AX_SUBST(README_ESCAPED)
@@ -329,7 +332,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-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 <<EOF test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx_11.m4 \ EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx.m4 \
ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \ ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \
build-resource-file.sh mac-create-app-bundle.sh build-resource-file.sh mac-create-app-bundle.sh
@@ -347,9 +350,9 @@ EOF
# use this in configure.ac to support C++ # use this in configure.ac to support C++
AC_DEFUN([AX_USE_CXX], [ AC_DEFUN([AX_USE_CXX], [
m4_include(ax_cxx_compile_stdcxx_11.m4) m4_include(ax_cxx_compile_stdcxx.m4)
AC_LANG(C++) AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_14(noext, optional) AX_CXX_COMPILE_STDCXX([17], [noext], [optional])
AC_PROG_CXX AC_PROG_CXX
AC_PROG_CPP AC_PROG_CPP
@@ -362,7 +365,7 @@ AC_DEFUN([AX_USE_CXX], [
CXXFLAGS="${CXXFLAGS//-g -O2/}" CXXFLAGS="${CXXFLAGS//-g -O2/}"
CFLAGS="${CFLAGS//-g -O2/}" CFLAGS="${CFLAGS//-g -O2/}"
# pass compile flags to make distcheck # pass compile flags to make distcheck
AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'" AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS) AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
@@ -388,6 +391,20 @@ maintainer-clean-cxx-targets:
EOF EOF
]) ])
# require specific C++ version
AC_DEFUN([AX_USE_CXX_11], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory])
])
AC_DEFUN([AX_USE_CXX_14], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory])
])
AC_DEFUN([AX_USE_CXX_17], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory])
])
# use this in configure.ac to support old school C # use this in configure.ac to support old school C
AC_DEFUN([AX_USE_C], [ AC_DEFUN([AX_USE_C], [
AC_LANG(C) AC_LANG(C)
@@ -634,7 +651,6 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AC_CHECK_PROG(have_doxygen, doxygen, yes, no) AC_CHECK_PROG(have_doxygen, doxygen, yes, no)
AC_CHECK_PROG(have_dot, dot, yes, no) AC_CHECK_PROG(have_dot, dot, yes, no)
AC_CHECK_PROG(have_mscgen, mscgen, yes, no) AC_CHECK_PROG(have_mscgen, mscgen, yes, no)
AM_CONDITIONAL(NEED_PLANTUML, test "$have_doxygen" = "yes" -a "1.8.11" != $((echo "1.8.11"; doxygen -v 2>/dev/null) | sort -V | head -1))
PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf
AC_SUBST(PDF_DOC) AC_SUBST(PDF_DOC)
if test "$have_doxygen" = "no"; then if test "$have_doxygen" = "no"; then
@@ -659,28 +675,12 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in])
test -f doc/makefile.in && cat >> doc/makefile.in <<EOF test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
doc: doxyfile @NEED_PLANTUML_TRUE@ gen-uml-images doc: doxyfile
@NEED_PLANTUML_TRUE@ doxyadd() { grep -q "\$\$[1] += \$\$[2]" doxyfile || sed -i '/^'"\$\$[1]"' *=/a'"\$\$[1]"' += '"\$\$[2]" doxyfile; }; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"startuml{1}=@image html \\\\1\\\\n@image latex \\\\1\\\\n\\\\if DontIgnorePlantUMLCode"'; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"enduml=\\\\endif"'; \\
@NEED_PLANTUML_TRUE@ doxyadd IMAGE_PATH '"gen-uml-images"';
doxygen doxyfile doxygen doxyfile
@PEDANTIC_TRUE@ test \! -s doxygen.errors @PEDANTIC_TRUE@ test \! -s doxygen.errors
@NEED_PLANTUML_TRUE@EXTRA_DIST = ${EXTRA_DIST} plantuml.jar
@NEED_PLANTUML_TRUE@
@NEED_PLANTUML_TRUE@gen-uml-images:
@NEED_PLANTUML_TRUE@ test -d gen-uml-images || mkdir gen-uml-images
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *INPUT *\\(+\\?\\)= *\\(.*\\),INPUT\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *FILE_PATTERNS *\\(+\\?\\)= *\\(.*\\),FILE_PATTERNS\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ SOURCES="**.("\$\$(echo \$\${FILE_PATTERNS} | sed 's,*.,,g;s, ,|,g')")"; \\
@NEED_PLANTUML_TRUE@ for src in \$\$INPUT; do \\
@NEED_PLANTUML_TRUE@ java -Djava.awt.headless=true -jar \${top_srcdir}/doc/plantuml.jar -v -o \$\$(pwd)/gen-uml-images "\$\$src/\$\$SOURCES"; \\
@NEED_PLANTUML_TRUE@ done
clean-documentation: clean-documentation:
-rm doxygen.errors @PDF_DOC@ -rm doxygen.errors @PDF_DOC@
@NEED_PLANTUML_TRUE@ -rm -rf gen-uml-images
distclean-documentation: distclean-documentation:
-rm -r html -rm -r html
-rm @PACKAGE_NAME@.doxytag -rm @PACKAGE_NAME@.doxytag
@@ -962,8 +962,8 @@ AC_DEFUN([AX_PKG_CHECK], [
# $2 = pathes to search for # $2 = pathes to search for
AC_DEFUN([AX_REQUIRE_HEADER], [ AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [ AC_CHECK_HEADER($1, [], [
if test -n "$2"; then
found=0 found=0
if test -n "$2"; then
for d in $2; do for d in $2; do
if test -f "${d}/$1"; then if test -f "${d}/$1"; then
AC_MSG_NOTICE([found file ${d}/$1]) AC_MSG_NOTICE([found file ${d}/$1])

View File

@@ -129,9 +129,8 @@ GENERATED FILES
* ${MY_NAME} * ${MY_NAME}
* autogen.sh - just the basics to initialize auto tools and create configure * autogen.sh - just the basics to initialize auto tools and create configure
* ax_init_standard_project.m4 - auxiliary macro definition file * ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file
* makefile_test.inc.am - makefile to be included in tests
* resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-debbuilddeps.sh - script to install debian package dependencies
* resolve-rpmbuilddeps.sh - script to install RPM package dependencies * resolve-rpmbuilddeps.sh - script to install RPM package dependencies
* build-in-docker.sh - script to build the project encapsulated in a docker container * build-in-docker.sh - script to build the project encapsulated in a docker container
@@ -274,7 +273,7 @@ FILES
* Enable C++ testing using CppUnit: AX_USE_CPPUNIT * Enable C++ testing using CppUnit: AX_USE_CPPUNIT
* Enable other tests: AX_BUILD_TEST * Enable other tests: AX_BUILD_TEST
* Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES * Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES
* Check for C++11 support: AX_CXX_COMPILE_STDCXX_11 (see ax_cxx_compile_stdcxx_11.m4) * Require C++17 support: AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) (see ax_cxx_compile_stdcxx.m4)
* Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4) * Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4)
* Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4) * Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4)
* Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4) * Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4)
@@ -450,7 +449,7 @@ checkdir() {
if ! test -d "$1"; then # create path if ! test -d "$1"; then # create path
run mkdir -p "$1" run mkdir -p "$1"
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
fi fi
fi fi
} }
@@ -498,7 +497,7 @@ to() {
run chmod $mode $1 run chmod $mode $1
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
@@ -523,10 +522,14 @@ copy() {
if test "${1%/*}" != "$1"; then if test "${1%/*}" != "$1"; then
test -d "${1%/*}" || svn mkdir "${1%/*}" test -d "${1%/*}" || svn mkdir "${1%/*}"
fi fi
if ! test -e "${source}"; then
ignored "$1" not found
return
fi
run cp "${source}" "$1" run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
@@ -575,7 +578,7 @@ vcs2cl() {
fi fi
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then
run ${VCS} add ChangeLog run --no-check ${VCS} add ChangeLog
fi fi
fi fi
} }
@@ -591,9 +594,8 @@ fi
# Initialize the environment: # Initialize the environment:
copy ${MY_NAME} copy ${MY_NAME}
copy ax_init_standard_project.m4 copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4 copy ax_cxx_compile_stdcxx.m4
copy ax_check_qt.m4 copy ax_check_qt.m4
copy makefile_test.inc.am
copy resolve-debbuilddeps.sh copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh copy build-in-docker.sh
@@ -1505,9 +1507,10 @@ if testtag AX_USE_DOXYGEN; then
if ! checkfile doc/doxyfile.in || \ if ! checkfile doc/doxyfile.in || \
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
sed -i ':a;/\\$/{s///;N;s/ *\n */ /g;ba}' doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then
run ${VCS} add doc/doxyfile.in run --no-check ${VCS} add doc/doxyfile.in
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" doc/doxyfile.in run svn propset svn:keywords "Id" doc/doxyfile.in
fi fi
@@ -1548,6 +1551,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace WARN_IF_UNDOCUMENTED NO doxyreplace WARN_IF_UNDOCUMENTED NO
doxyreplace WARN_LOGFILE doxygen.errors doxyreplace WARN_LOGFILE doxygen.errors
doxyreplace INPUT "@top_srcdir@/src" doxyreplace INPUT "@top_srcdir@/src"
doxyadd INPUT "@top_srcdir@/@README_FILE@"
if testtag AX_USE_SCRIPTS; then if testtag AX_USE_SCRIPTS; then
doxyadd INPUT "@top_srcdir@/scripts" doxyadd INPUT "@top_srcdir@/scripts"
fi fi
@@ -1562,6 +1566,7 @@ if testtag AX_USE_DOXYGEN; then
doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules" doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules"
doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext" doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext"
fi fi
doxyreplace USE_MDFILE_AS_MAINPAGE "@top_srcdir@/@README_FILE@"
doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql' doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql'
doxyreplace RECURSIVE YES doxyreplace RECURSIVE YES
doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx" doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx"
@@ -1571,9 +1576,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace HTML_DYNAMIC_SECTIONS YES doxyreplace HTML_DYNAMIC_SECTIONS YES
doxyreplace DISABLE_INDEX NO doxyreplace DISABLE_INDEX NO
doxyreplace GENERATE_TREEVIEW YES doxyreplace GENERATE_TREEVIEW YES
if testtag AX_BUILD_EXAMPLES; then doxyreplace EXAMPLE_PATH @top_srcdir@
doxyreplace EXAMPLE_PATH @top_srcdir@/examples
fi
doxyreplace EXAMPLE_RECURSIVE YES doxyreplace EXAMPLE_RECURSIVE YES
doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed' doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed'
doxyreplace SOURCE_BROWSER YES doxyreplace SOURCE_BROWSER YES
@@ -1874,7 +1877,7 @@ desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ dist_pkgdata_DATA = @PACKAGE_ICON@
dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\ dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\
resolve-rpmbuilddeps.sh autogen.sh \\ resolve-rpmbuilddeps.sh autogen.sh \\
ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\ ax_cxx_compile_stdcxx.m4 build-in-docker.sh \\
build-resource-file.sh \\ build-resource-file.sh \\
ax_init_standard_project.m4 \\ ax_init_standard_project.m4 \\
mac-create-app-bundle.sh resolve-debbuilddeps.sh \\ mac-create-app-bundle.sh resolve-debbuilddeps.sh \\

View File

@@ -7,7 +7,7 @@ if test "${arch}" = "amd64"; then
myarch="amd64|i386" myarch="amd64|i386"
fi fi
mode= mode=
img="mwaeckerlin/ubuntu:latest" img=
repos=() repos=()
keys=() keys=()
dns=() dns=()
@@ -20,6 +20,10 @@ arch=$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || ech
host= host=
flags=() flags=()
wait=0 wait=0
commit=
nopull=0
prepare=0
clean=
if test -e ./build-in-docker.conf; then if test -e ./build-in-docker.conf; then
# you can preconfigure the variables in file build-in-docker.conf # you can preconfigure the variables in file build-in-docker.conf
# if you do so, add the file to EXTRA_DIST in makefile.am # if you do so, add the file to EXTRA_DIST in makefile.am
@@ -28,68 +32,111 @@ fi
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(-h|--help) (-h|--help) cat <<EOF
echo "$0 [OPTIONS]" SYNOPSIS
echo
echo "OPTIONS:" $0 [OPTIONS]
echo
echo " -h, --help show this help" OPTIONS
echo " -m, --mode <type> mode: deb, rpm, win, default: ${mode}"
echo " -i, --image <image> use given docker image instead of ${img}" -h, --help show this help
echo " -a, --arch <arch> build for given hardware architecture" -m, --mode <type> mode: deb, rpm, win, default: ${mode}
echo " -t, --targets targets specify build targets, default: ${targets}" -i, --image <image> use given docker image instead of ${img}
echo " --host <target-arch> host for cross compiling, e.g. i686-w64-mingw32" -a, --arch <arch> build for given hardware architecture
echo " -f, --flag <flag> add flag to ./bootstrap.sh or ./configure" -t, --targets targets specify build targets, default: ${targets}
echo " -r, --repo <url> add given apt repository" --host <target-arch> host for cross compiling, e.g. i686-w64-mingw32
echo " -k, --key <url> add public key from url" -f, --flag <flag> add flag to ./bootstrap.sh or ./configure
echo " -n, --dns <ip> add ip as dns server" -r, --repo <url> add given apt repository
echo " -e, --env <var>=<val> set environment variable in docker" -k, --key <url> add public key from url
echo " -d, --dir <dir> access given directory read only" -n, --dns <ip> add ip as dns server
echo " -p, --package <pkg> install extra debian packages" -e, --env <var>=<val> set environment variable in docker
echo " -c, --cmd <command> execute commands as root in docker" -d, --dir <dir> access given directory read only
echo " -w, --wait on error keep docker container and wait for enter" -p, --package <pkg> install extra debian packages
echo -c, --cmd <command> execute commands as root in docker
echo " The option -i must be after -m, because mode sets a new default image" -w, --wait on error keep docker container and wait for enter
echo " The option -m must be after -t, because mode may be auto detected from targets" --clean run maintainer-clean before build
echo " The option -m must be after -h, because mode may set a host" --commit <image> commit the container as image after setup, then exit
echo " If target is either deb or rpm, mode is set to the same value" --no-pull do not pull image before start (use local image)
echo " If target is win, host is set to i686-w64-mingw32" --prepare only prepare the image, then wait
echo
echo " The options -r -k -e -d -p -c can be repeated several times." The option -i must be after -m, because mode sets a new default image
echo The option -m must be after -t, because mode may be auto detected from targets
echo " The options -r -p -c allow an if-then-else contruct" The option -m must be after -h, because mode may set a host
echo " depending on the operating system:" If target is either deb or rpm, mode is set to the same value
echo " <os>:::<A>:::<B>" If target is win, host is set to i686-w64-mingw32
echo " <os>:::<A>"
echo " Read as: On linux type <os> use <A> else use <B>" The options -r -k -e -d -p -c can be repeated several times.
echo " That means: If the distributer ID or codename in lsb_release"
echo " matches regular expression <os>, then <A> is replaced, else <B> is replaced." The options -r -p -c allow an if-then-else contruct
echo " The three colons are for splitting <os> from <A> and <B> part." depending on the operating system:
echo " E.g.: Install package curl on wheezy and npm on olter systems:" <os>:::<A>:::<B>
echo " $0 -p Debian|precise:::curl:::npm" <os>:::<A>
echo Read as: On linux type <os> use <A> else use <B>
echo "EXAMPLE:" That means: If the distributer ID or codename in lsb_release
echo matches regular expression <os>, then <A> is replaced, else <B> is replaced.
echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\" The three colons are for splitting <os> from <A> and <B> part.
echo " -t deb \\" E.g.: Install package curl on wheezy and npm on olter systems:
echo " -e ANDROID_HOME=/opt/local/android \\" $0 -p Debian|precise:::curl:::npm
echo " -d /opt/local/android \\"
echo " -r universe \\" PERFORMANCE
echo " -r https://repository.mrw.sh \\"
echo " -k https://repository.mrw.sh/PublicKey \\" Each build starts with an empty image and first installs all
echo " -p mrw-c++" dependencies. You can speed up the build process by using an image,
echo where all dependencies are already installed. The disadvantage of
this approach is, that missing dependencies are not detected, so
installing all dependencies into an empty image is a test for the
dependency specification.
Create an image from ubuntu:trusty that contains all dependencies:
$0 -i ubuntu:trusty --tag my/trusty
Now you can use the image my/trusty, but since it is not stored in a
repository, you have to either push it to a repository (here my is
your name in docker hub), or simply use it local only and add the
flag --no-pull:
$0 -i my/trusty -t all
As long as you work with my/trusty, the dependencies don't need to
be donwloaded in each build.
TESTING
When you want to experiment with your builds, i.e. to trace a build
problem, then option --prepare comes handy. It just starts an image
with all dependencies, then waits and gives you information on how
you can enter the image for manual tests in a temporary
container. As soon as you hit the enter key, it cleans up the
temporary container.
$0 -i ubuntu:trusty --prepare
EXAMPLE
$0 -i mwaeckerlin/ubuntu:trusty-i386 \\
-t deb \\
-e ANDROID_HOME=/opt/local/android \\
-d /opt/local/android \\
-r universe \\
-r https://repository.mrw.sh \\
-k https://repository.mrw.sh/PublicKey \\
-p mrw-c++
EOF
exit 0 exit 0
;; ;;
(-m|--mode) shift; (-m|--mode)
shift;
mode="$1" mode="$1"
if test -z "$img"; then
case "$mode" in case "$mode" in
(deb|apt) img="mwaeckerlin/ubuntu:latest";; (deb|apt) img="mwaeckerlin/debbuildenv";;
(rpm|zypper) img="opensuse:latest";; (rpm|zypper) img="opensuse:latest";;
(yum) img="centos:latest";; (yum) img="centos:latest";;
(dnf) img="fedora:latest";; (dnf) img="fedora:latest";;
(win) (win)
img="mwaeckerlin/ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" img="mwaeckerlin/debbuildenv"; host="${host:---host=i686-w64-mingw32}"
targets="all install" targets="all install"
flags+=("--prefix=/workdir/usr") flags+=("--prefix=/workdir/usr")
packages+=("mingw-w64") packages+=("mingw-w64")
@@ -99,6 +146,7 @@ while test $# -gt 0; do
exit 1 exit 1
;; ;;
esac esac
fi
;; ;;
(-i|--image) shift; (-i|--image) shift;
img="$1" img="$1"
@@ -145,6 +193,18 @@ while test $# -gt 0; do
(-w|--wait) (-w|--wait)
wait=1 wait=1
;; ;;
(--clean)
clean="--clean -c"
;;
(--commit) shift;
commit="$1"
;;
(--no-pull)
nopull=1
;;
(--prepare)
prepare=1
;;
(*) (*)
echo "**** ERROR: unknown option '$1', try --help" 1>&2 echo "**** ERROR: unknown option '$1', try --help" 1>&2
exit 1 exit 1
@@ -157,6 +217,15 @@ while test $# -gt 0; do
shift shift
done done
function waitforinput() {
set +x
echo " ... now you can access the docker container as root or user:"
echo " docker exec -it ${DOCKER_ID} bash"
echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash"
echo -n " ... press enter to cleanup: "
read
}
function traperror() { function traperror() {
set +x set +x
local DOCKER_ID="$1" local DOCKER_ID="$1"
@@ -177,11 +246,7 @@ function traperror() {
echo echo
fi fi
if [ "$wait" -eq 1 ]; then if [ "$wait" -eq 1 ]; then
echo " ... now you can access the docker container as root or user:" waitforinput
echo " docker exec -it ${DOCKER_ID} bash"
echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash"
echo -n " ... press enter to cleanup: "
read
fi fi
echo -n " ... cleanup docker: " echo -n " ... cleanup docker: "
docker stop "${DOCKER_ID}" || true docker stop "${DOCKER_ID}" || true
@@ -243,7 +308,10 @@ function ifthenelse() {
set -x set -x
docker pull $img if test -z "$img"; then
img="mwaeckerlin/debbuildenv"
fi
test $nopull -eq 1 || docker pull $img
DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity)
trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT
if ! [[ $arch =~ $myarch ]]; then if ! [[ $arch =~ $myarch ]]; then
@@ -262,8 +330,8 @@ if test -z "$mode"; then
(*deb*) mode=deb;; (*deb*) mode=deb;;
(*rpm*) mode=rpm;; (*rpm*) mode=rpm;;
(*) case "$img" in (*) case "$img" in
(*ubuntu*|*debian*|*mint*) mode=deb;; (*deb*|*ubuntu*|*debian*|*mint*) mode=deb;;
(*fedora*|*centos*|*mageia*) mode=rpm;; (*rpm*|*fedora*|*centos*|*mageia*) mode=rpm;;
(*mingw*|*win*) mode=win;; (*mingw*|*win*) mode=win;;
(*) mode=deb;; (*) mode=deb;;
esac;; esac;;
@@ -272,25 +340,18 @@ fi
case "$mode" in case "$mode" in
(deb|apt|win) (deb|apt|win)
OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends' OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends'
PREVENT='libpam-systemd policykit.* colord dconf-service'
docker exec ${DOCKER_ID} apt-get update ${OPTIONS} docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
docker exec ${DOCKER_ID} apt-mark hold ${PREVENT}
#docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS} #docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS}
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release wget || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- python-software-properties apt-transport-https dpkg-dev lsb-release wget; docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release wget;
if [[ "${img}" =~ "ubuntu" ]]; then if [[ "${img}" =~ "ubuntu" ]]; then
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- locales docker exec ${DOCKER_ID} apt-get install ${OPTIONS} locales
docker exec ${DOCKER_ID} locale-gen ${LANG} docker exec ${DOCKER_ID} locale-gen ${LANG}
docker exec ${DOCKER_ID} update-locale LANG=${LANG} docker exec ${DOCKER_ID} update-locale LANG=${LANG}
fi fi
for f in ${PREVENT}; do if test -n "${keys[*]}"; then # fix dependency bug in cosmic and stretch
docker exec ${DOCKER_ID} bash -c "echo 'Package: ${f}' >> /etc/apt/preferences" docker exec ${DOCKER_ID} apt-get install ${OPTIONS} gnupg
docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences"
docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences"
done
if test -n "${keys[@]}"; then # fix dependency bug in cosmic and stretch
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- gnupg
for key in "${keys[@]}"; do for key in "${keys[@]}"; do
wget -O- "$key" \ wget -O- "$key" \
| docker exec -i ${DOCKER_ID} apt-key add - | docker exec -i ${DOCKER_ID} apt-key add -
@@ -302,7 +363,7 @@ case "$mode" in
docker exec ${DOCKER_ID} apt-get update ${OPTIONS} docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
for package in "${packages[@]}"; do for package in "${packages[@]}"; do
ifthenelse "${package}" "apt-get install ${OPTIONS} ${PREVENT// /- }- ARG" ifthenelse "${package}" "apt-get install ${OPTIONS} ARG"
done done
for command in "${commands[@]}"; do for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG" ifthenelse "${command}" "ARG"
@@ -357,13 +418,24 @@ for f in "${flags[@]}"; do
FLAGS+=($(ifthenelse "$f" "echo 'ARG'")) FLAGS+=($(ifthenelse "$f" "echo 'ARG'"))
done done
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" ${host} "${FLAGS[@]}" if test -n "$commit"; then
docker commit ${DOCKER_ID} "$commit"
echo "commited new image: $commit"
exit 0
fi
if test $prepare -eq 1; then
waitforinput
exit 0
fi
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh ${clean} -t "${targets}" ${host} "${FLAGS[@]}"
# last check: try to install built deb or rpm files (if not already cleaned up) # last check: try to install built deb or rpm files (if not already cleaned up)
# not supported in trusty and jessie # not supported in trusty and jessie
if test "$mode" = deb -a "${img//trusty/}" = "${img}" -a "${img//jessie/}" = "${img}"; then if test "$mode" = deb -a "${img//trusty/}" = "${img}" -a "${img//jessie/}" = "${img}"; then
if test "${targets//deb/}" != "${targets}" && ls *.deb > /dev/null 2> /dev/null; then if test "${targets//deb/}" != "${targets}" && ls *.deb > /dev/null 2> /dev/null; then
docker exec ${DOCKER_ID} bash -c "apt-get install ${OPTIONS} ${PREVENT// /- }- /workdir/*.deb" docker exec ${DOCKER_ID} bash -c "apt-get install ${OPTIONS} /workdir/*.deb"
fi fi
fi fi
if test "$mode" = rpm -a "${targets//rpm/}" != "${targets}"; then if test "$mode" = rpm -a "${targets//rpm/}" != "${targets}"; then

Binary file not shown.

View File

@@ -0,0 +1,948 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the specified
# version of the C++ standard. If necessary, add switches to CXX and
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
# or '14' (for the C++14 standard).
#
# The second argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The third argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline support for the specified C++ standard is
# required and that the macro should error out if no mode with that
# support is found. If specified 'optional', then configuration proceeds
# regardless, after defining HAVE_CXX${VERSION} if and only if a
# supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 10
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
[$1], [17], [ax_cxx_compile_alternatives="17 1z"],
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$2], [], [],
[$2], [ext], [],
[$2], [noext], [],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
for alternative in ${ax_cxx_compile_alternatives}; do
switch="-std=gnu++${alternative}"
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
m4_if([$2], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
dnl Cray's crayCC needs "-h std=c++11"
for alternative in ${ax_cxx_compile_alternatives}; do
for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
if test x$ac_success = xyes; then
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
fi
fi
if test x$ac_success = xno; then
HAVE_CXX$1=0
AC_MSG_NOTICE([No compiler with C++$1 support was found])
else
HAVE_CXX$1=1
AC_DEFINE(HAVE_CXX$1,1,
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
])
dnl Test body for checking C++11 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
)
dnl Test body for checking C++14 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
)
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
_AX_CXX_COMPILE_STDCXX_testbody_new_in_17
)
dnl Tests for new features in C++11
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
// If the compiler admits that it is not ready for C++11, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201103L
#error "This is not a C++11 compiler"
#else
namespace cxx11
{
namespace test_static_assert
{
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
}
namespace test_final_override
{
struct Base
{
virtual void f() {}
};
struct Derived : public Base
{
virtual void f() override {}
};
}
namespace test_double_right_angle_brackets
{
template < typename T >
struct check {};
typedef check<void> single_type;
typedef check<check<void>> double_type;
typedef check<check<check<void>>> triple_type;
typedef check<check<check<check<void>>>> quadruple_type;
}
namespace test_decltype
{
int
f()
{
int a = 1;
decltype(a) b = 2;
return a + b;
}
}
namespace test_type_deduction
{
template < typename T1, typename T2 >
struct is_same
{
static const bool value = false;
};
template < typename T >
struct is_same<T, T>
{
static const bool value = true;
};
template < typename T1, typename T2 >
auto
add(T1 a1, T2 a2) -> decltype(a1 + a2)
{
return a1 + a2;
}
int
test(const int c, volatile int v)
{
static_assert(is_same<int, decltype(0)>::value == true, "");
static_assert(is_same<int, decltype(c)>::value == false, "");
static_assert(is_same<int, decltype(v)>::value == false, "");
auto ac = c;
auto av = v;
auto sumi = ac + av + 'x';
auto sumf = ac + av + 1.0;
static_assert(is_same<int, decltype(ac)>::value == true, "");
static_assert(is_same<int, decltype(av)>::value == true, "");
static_assert(is_same<int, decltype(sumi)>::value == true, "");
static_assert(is_same<int, decltype(sumf)>::value == false, "");
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
return (sumf > 0.0) ? sumi : add(c, v);
}
}
namespace test_noexcept
{
int f() { return 0; }
int g() noexcept { return 0; }
static_assert(noexcept(f()) == false, "");
static_assert(noexcept(g()) == true, "");
}
namespace test_constexpr
{
template < typename CharT >
unsigned long constexpr
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
{
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
}
template < typename CharT >
unsigned long constexpr
strlen_c(const CharT *const s) noexcept
{
return strlen_c_r(s, 0UL);
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("1") == 1UL, "");
static_assert(strlen_c("example") == 7UL, "");
static_assert(strlen_c("another\0example") == 7UL, "");
}
namespace test_rvalue_references
{
template < int N >
struct answer
{
static constexpr int value = N;
};
answer<1> f(int&) { return answer<1>(); }
answer<2> f(const int&) { return answer<2>(); }
answer<3> f(int&&) { return answer<3>(); }
void
test()
{
int i = 0;
const int c = 0;
static_assert(decltype(f(i))::value == 1, "");
static_assert(decltype(f(c))::value == 2, "");
static_assert(decltype(f(0))::value == 3, "");
}
}
namespace test_uniform_initialization
{
struct test
{
static const int zero {};
static const int one {1};
};
static_assert(test::zero == 0, "");
static_assert(test::one == 1, "");
}
namespace test_lambdas
{
void
test1()
{
auto lambda1 = [](){};
auto lambda2 = lambda1;
lambda1();
lambda2();
}
int
test2()
{
auto a = [](int i, int j){ return i + j; }(1, 2);
auto b = []() -> int { return '0'; }();
auto c = [=](){ return a + b; }();
auto d = [&](){ return c; }();
auto e = [a, &b](int x) mutable {
const auto identity = [](int y){ return y; };
for (auto i = 0; i < a; ++i)
a += b--;
return x + identity(a + b);
}(0);
return a + b + c + d + e;
}
int
test3()
{
const auto nullary = [](){ return 0; };
const auto unary = [](int x){ return x; };
using nullary_t = decltype(nullary);
using unary_t = decltype(unary);
const auto higher1st = [](nullary_t f){ return f(); };
const auto higher2nd = [unary](nullary_t f1){
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
};
return higher1st(nullary) + higher2nd(nullary)(unary);
}
}
namespace test_variadic_templates
{
template <int...>
struct sum;
template <int N0, int... N1toN>
struct sum<N0, N1toN...>
{
static constexpr auto value = N0 + sum<N1toN...>::value;
};
template <>
struct sum<>
{
static constexpr auto value = 0;
};
static_assert(sum<>::value == 0, "");
static_assert(sum<1>::value == 1, "");
static_assert(sum<23>::value == 23, "");
static_assert(sum<1, 2>::value == 3, "");
static_assert(sum<5, 5, 11>::value == 21, "");
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
}
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this.
namespace test_template_alias_sfinae
{
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
} // namespace cxx11
#endif // __cplusplus >= 201103L
]])
dnl Tests for new features in C++14
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
// If the compiler admits that it is not ready for C++14, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201402L
#error "This is not a C++14 compiler"
#else
namespace cxx14
{
namespace test_polymorphic_lambdas
{
int
test()
{
const auto lambda = [](auto&&... args){
const auto istiny = [](auto x){
return (sizeof(x) == 1UL) ? 1 : 0;
};
const int aretiny[] = { istiny(args)... };
return aretiny[0];
};
return lambda(1, 1L, 1.0f, '1');
}
}
namespace test_binary_literals
{
constexpr auto ivii = 0b0000000000101010;
static_assert(ivii == 42, "wrong value");
}
namespace test_generalized_constexpr
{
template < typename CharT >
constexpr unsigned long
strlen_c(const CharT *const s) noexcept
{
auto length = 0UL;
for (auto p = s; *p; ++p)
++length;
return length;
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("x") == 1UL, "");
static_assert(strlen_c("test") == 4UL, "");
static_assert(strlen_c("another\0test") == 7UL, "");
}
namespace test_lambda_init_capture
{
int
test()
{
auto x = 0;
const auto lambda1 = [a = x](int b){ return a + b; };
const auto lambda2 = [a = lambda1(x)](){ return a; };
return lambda2();
}
}
namespace test_digit_separators
{
constexpr auto ten_million = 100'000'000;
static_assert(ten_million == 100000000, "");
}
namespace test_return_type_deduction
{
auto f(int& x) { return x; }
decltype(auto) g(int& x) { return x; }
template < typename T1, typename T2 >
struct is_same
{
static constexpr auto value = false;
};
template < typename T >
struct is_same<T, T>
{
static constexpr auto value = true;
};
int
test()
{
auto x = 0;
static_assert(is_same<int, decltype(f(x))>::value, "");
static_assert(is_same<int&, decltype(g(x))>::value, "");
return x;
}
}
} // namespace cxx14
#endif // __cplusplus >= 201402L
]])
dnl Tests for new features in C++17
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
// If the compiler admits that it is not ready for C++17, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201703L
#error "This is not a C++17 compiler"
#else
#include <initializer_list>
#include <utility>
#include <type_traits>
namespace cxx17
{
namespace test_constexpr_lambdas
{
constexpr int foo = [](){return 42;}();
}
namespace test::nested_namespace::definitions
{
}
namespace test_fold_expression
{
template<typename... Args>
int multiply(Args... args)
{
return (args * ... * 1);
}
template<typename... Args>
bool all(Args... args)
{
return (args && ...);
}
}
namespace test_extended_static_assert
{
static_assert (true);
}
namespace test_auto_brace_init_list
{
auto foo = {5};
auto bar {5};
static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
static_assert(std::is_same<int, decltype(bar)>::value);
}
namespace test_typename_in_template_template_parameter
{
template<template<typename> typename X> struct D;
}
namespace test_fallthrough_nodiscard_maybe_unused_attributes
{
int f1()
{
return 42;
}
[[nodiscard]] int f2()
{
[[maybe_unused]] auto unused = f1();
switch (f1())
{
case 17:
f1();
[[fallthrough]];
case 42:
f1();
}
return f1();
}
}
namespace test_extended_aggregate_initialization
{
struct base1
{
int b1, b2 = 42;
};
struct base2
{
base2() {
b3 = 42;
}
int b3;
};
struct derived : base1, base2
{
int d;
};
derived d1 {{1, 2}, {}, 4}; // full initialization
derived d2 {{}, {}, 4}; // value-initialized bases
}
namespace test_general_range_based_for_loop
{
struct iter
{
int i;
int& operator* ()
{
return i;
}
const int& operator* () const
{
return i;
}
iter& operator++()
{
++i;
return *this;
}
};
struct sentinel
{
int i;
};
bool operator== (const iter& i, const sentinel& s)
{
return i.i == s.i;
}
bool operator!= (const iter& i, const sentinel& s)
{
return !(i == s);
}
struct range
{
iter begin() const
{
return {0};
}
sentinel end() const
{
return {5};
}
};
void f()
{
range r {};
for (auto i : r)
{
[[maybe_unused]] auto v = i;
}
}
}
namespace test_lambda_capture_asterisk_this_by_value
{
struct t
{
int i;
int foo()
{
return [*this]()
{
return i;
}();
}
};
}
namespace test_enum_class_construction
{
enum class byte : unsigned char
{};
byte foo {42};
}
namespace test_constexpr_if
{
template <bool cond>
int f ()
{
if constexpr(cond)
{
return 13;
}
else
{
return 42;
}
}
}
namespace test_selection_statement_with_initializer
{
int f()
{
return 13;
}
int f2()
{
if (auto i = f(); i > 0)
{
return 3;
}
switch (auto i = f(); i + 4)
{
case 17:
return 2;
default:
return 1;
}
}
}
namespace test_template_argument_deduction_for_class_templates
{
template <typename T1, typename T2>
struct pair
{
pair (T1 p1, T2 p2)
: m1 {p1},
m2 {p2}
{}
T1 m1;
T2 m2;
};
void f()
{
[[maybe_unused]] auto p = pair{13, 42u};
}
}
namespace test_non_type_auto_template_parameters
{
template <auto n>
struct B
{};
B<5> b1;
B<'a'> b2;
}
namespace test_structured_bindings
{
int arr[2] = { 1, 2 };
std::pair<int, int> pr = { 1, 2 };
auto f1() -> int(&)[2]
{
return arr;
}
auto f2() -> std::pair<int, int>&
{
return pr;
}
struct S
{
int x1 : 2;
volatile double y1;
};
S f3()
{
return {};
}
auto [ x1, y1 ] = f1();
auto& [ xr1, yr1 ] = f1();
auto [ x2, y2 ] = f2();
auto& [ xr2, yr2 ] = f2();
const auto [ x3, y3 ] = f3();
}
namespace test_exception_spec_type_system
{
struct Good {};
struct Bad {};
void g1() noexcept;
void g2();
template<typename T>
Bad
f(T*, T*);
template<typename T1, typename T2>
Good
f(T1*, T2*);
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
}
namespace test_inline_variables
{
template<class T> void f(T)
{}
template<class T> inline T g(T)
{
return T{};
}
template<> inline void f<>(int)
{}
template<> int g<>(int)
{
return 5;
}
}
} // namespace cxx17
#endif // __cplusplus < 201703L
]])

View File

@@ -1,231 +0,0 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
# ============================================================================
#
# SYNOPSIS
#
# AX_REQUIRE_STDCXX_11
# AX_REQUIRE_STDCXX_14
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
# AX_CXX_COMPILE_STDCXX_14([ext|noext],[mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++11
# or C++14 standard; if necessary, add switches to CXXFLAGS to
# enable support.
#
# The first argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The second argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline C++11 support is required and that the macro
# should error out if no mode with that support is found. If specified
# 'optional', then configuration proceeds regardless, after defining
# HAVE_CXX11 if and only if a supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 3
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
typedef check<check<bool>> right_angle_brackets;
int a;
decltype(a) b;
typedef check<int> check_type;
check_type c;
check_type&& cr = static_cast<check_type&&>(c);
auto d = a;
])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
m4_if([$1], [], [],
[$1], [ext], [],
[$1], [noext], [],
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
[$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
[$2], [optional], [ax_cxx_compile_cxx11_required=false],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
ax_cv_cxx_compile_cxx11,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[ax_cv_cxx_compile_cxx11=yes],
[ax_cv_cxx_compile_cxx11=no])])
if test x$ax_cv_cxx_compile_cxx11 = xyes; then
ac_success=yes
fi
m4_if([$1], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++11 -std=gnu++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
m4_if([$1], [ext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=c++11 -std=c++0x; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx11_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
fi
else
if test x$ac_success = xno; then
HAVE_CXX11=0
AC_MSG_NOTICE([No compiler with C++11 support was found])
else
HAVE_CXX11=1
AC_DEFINE(HAVE_CXX11,1,
[define if the compiler supports basic C++11 syntax])
fi
AC_SUBST(HAVE_CXX11)
fi
])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [dnl
m4_if([$1], [], [],
[$1], [ext], [],
[$1], [noext], [],
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_14])])dnl
m4_if([$2], [], [ax_cxx_compile_cxx14_required=true],
[$2], [mandatory], [ax_cxx_compile_cxx14_required=true],
[$2], [optional], [ax_cxx_compile_cxx14_required=false],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_14])])dnl
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++14 features by default,
ax_cv_cxx_compile_cxx14,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[ax_cv_cxx_compile_cxx14=yes],
[ax_cv_cxx_compile_cxx14=no])])
if test x$ax_cv_cxx_compile_cxx14 = xyes; then
ac_success=yes
fi
m4_if([$1], [noext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=gnu++14 -std=gnu++0y; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
m4_if([$1], [ext], [], [dnl
if test x$ac_success = xno; then
for switch in -std=c++14 -std=c++0y; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
$cachevar,
[ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXXFLAGS="$ac_save_CXXFLAGS"])
if eval test x\$$cachevar = xyes; then
CXXFLAGS="$CXXFLAGS $switch"
ac_success=yes
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx14_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
fi
else
if test x$ac_success = xno; then
HAVE_CXX14=0
AC_MSG_NOTICE([No compiler with C++14 support was found])
AX_CXX_COMPILE_STDCXX_11([$1], [optional])
else
HAVE_CXX11=1
HAVE_CXX14=1
AC_DEFINE(HAVE_CXX14,1,
[define if the compiler supports basic C++14 syntax])
AC_DEFINE(HAVE_CXX11,1,
[define if the compiler supports basic C++14 syntax])
fi
AC_SUBST(HAVE_CXX11)
AC_SUBST(HAVE_CXX14)
fi
])
AC_DEFUN([AX_REQUIRE_STDCXX_11], [
if test x${HAVE_CXX11} != x1; then
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
fi
])
AC_DEFUN([AX_REQUIRE_STDCXX_14], [
if test x${HAVE_CXX14} != x1; then
AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
fi
])

View File

@@ -170,9 +170,11 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_SUBST(NUMBERS) AX_SUBST(NUMBERS)
AX_SUBST(HOME) AX_SUBST(HOME)
if test -f README.md; then if test -f README.md; then
README_FILE=README.md
README=$(tail -n +3 README.md) README=$(tail -n +3 README.md)
DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,')
else else
README_FILE=README
README=$(tail -n +3 README) README=$(tail -n +3 README)
DESCRIPTION=$(head -1 README) DESCRIPTION=$(head -1 README)
fi fi
@@ -182,6 +184,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
else else
README_HTML="${README}" README_HTML="${README}"
fi fi
AX_SUBST(README_FILE)
AX_SUBST(README) AX_SUBST(README)
_AM_SUBST_NOTMAKE([README]) _AM_SUBST_NOTMAKE([README])
AX_SUBST(README_ESCAPED) AX_SUBST(README_ESCAPED)
@@ -329,7 +332,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-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 <<EOF test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx_11.m4 \ EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx.m4 \
ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \ ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \
build-resource-file.sh mac-create-app-bundle.sh build-resource-file.sh mac-create-app-bundle.sh
@@ -347,9 +350,9 @@ EOF
# use this in configure.ac to support C++ # use this in configure.ac to support C++
AC_DEFUN([AX_USE_CXX], [ AC_DEFUN([AX_USE_CXX], [
m4_include(ax_cxx_compile_stdcxx_11.m4) m4_include(ax_cxx_compile_stdcxx.m4)
AC_LANG(C++) AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_14(noext, optional) AX_CXX_COMPILE_STDCXX([17], [noext], [optional])
AC_PROG_CXX AC_PROG_CXX
AC_PROG_CPP AC_PROG_CPP
@@ -362,7 +365,7 @@ AC_DEFUN([AX_USE_CXX], [
CXXFLAGS="${CXXFLAGS//-g -O2/}" CXXFLAGS="${CXXFLAGS//-g -O2/}"
CFLAGS="${CFLAGS//-g -O2/}" CFLAGS="${CFLAGS//-g -O2/}"
# pass compile flags to make distcheck # pass compile flags to make distcheck
AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'" AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS) AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)
@@ -388,6 +391,20 @@ maintainer-clean-cxx-targets:
EOF EOF
]) ])
# require specific C++ version
AC_DEFUN([AX_USE_CXX_11], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory])
])
AC_DEFUN([AX_USE_CXX_14], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory])
])
AC_DEFUN([AX_USE_CXX_17], [
AX_USE_CXX
AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory])
])
# use this in configure.ac to support old school C # use this in configure.ac to support old school C
AC_DEFUN([AX_USE_C], [ AC_DEFUN([AX_USE_C], [
AC_LANG(C) AC_LANG(C)
@@ -634,7 +651,6 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AC_CHECK_PROG(have_doxygen, doxygen, yes, no) AC_CHECK_PROG(have_doxygen, doxygen, yes, no)
AC_CHECK_PROG(have_dot, dot, yes, no) AC_CHECK_PROG(have_dot, dot, yes, no)
AC_CHECK_PROG(have_mscgen, mscgen, yes, no) AC_CHECK_PROG(have_mscgen, mscgen, yes, no)
AM_CONDITIONAL(NEED_PLANTUML, test "$have_doxygen" = "yes" -a "1.8.11" != $((echo "1.8.11"; doxygen -v 2>/dev/null) | sort -V | head -1))
PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf
AC_SUBST(PDF_DOC) AC_SUBST(PDF_DOC)
if test "$have_doxygen" = "no"; then if test "$have_doxygen" = "no"; then
@@ -659,28 +675,12 @@ AC_DEFUN([AX_USE_DOXYGEN], [
AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf gen-uml-images], [doc/makefile.in])
test -f doc/makefile.in && cat >> doc/makefile.in <<EOF test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
doc: doxyfile @NEED_PLANTUML_TRUE@ gen-uml-images doc: doxyfile
@NEED_PLANTUML_TRUE@ doxyadd() { grep -q "\$\$[1] += \$\$[2]" doxyfile || sed -i '/^'"\$\$[1]"' *=/a'"\$\$[1]"' += '"\$\$[2]" doxyfile; }; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"startuml{1}=@image html \\\\1\\\\n@image latex \\\\1\\\\n\\\\if DontIgnorePlantUMLCode"'; \\
@NEED_PLANTUML_TRUE@ doxyadd ALIASES '"enduml=\\\\endif"'; \\
@NEED_PLANTUML_TRUE@ doxyadd IMAGE_PATH '"gen-uml-images"';
doxygen doxyfile doxygen doxyfile
@PEDANTIC_TRUE@ test \! -s doxygen.errors @PEDANTIC_TRUE@ test \! -s doxygen.errors
@NEED_PLANTUML_TRUE@EXTRA_DIST = ${EXTRA_DIST} plantuml.jar
@NEED_PLANTUML_TRUE@
@NEED_PLANTUML_TRUE@gen-uml-images:
@NEED_PLANTUML_TRUE@ test -d gen-uml-images || mkdir gen-uml-images
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *INPUT *\\(+\\?\\)= *\\(.*\\),INPUT\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ eval \$\$(sed -n 's, *FILE_PATTERNS *\\(+\\?\\)= *\\(.*\\),FILE_PATTERNS\\1=" \\2",gp' doxyfile); \\
@NEED_PLANTUML_TRUE@ SOURCES="**.("\$\$(echo \$\${FILE_PATTERNS} | sed 's,*.,,g;s, ,|,g')")"; \\
@NEED_PLANTUML_TRUE@ for src in \$\$INPUT; do \\
@NEED_PLANTUML_TRUE@ java -Djava.awt.headless=true -jar \${top_srcdir}/doc/plantuml.jar -v -o \$\$(pwd)/gen-uml-images "\$\$src/\$\$SOURCES"; \\
@NEED_PLANTUML_TRUE@ done
clean-documentation: clean-documentation:
-rm doxygen.errors @PDF_DOC@ -rm doxygen.errors @PDF_DOC@
@NEED_PLANTUML_TRUE@ -rm -rf gen-uml-images
distclean-documentation: distclean-documentation:
-rm -r html -rm -r html
-rm @PACKAGE_NAME@.doxytag -rm @PACKAGE_NAME@.doxytag
@@ -962,8 +962,8 @@ AC_DEFUN([AX_PKG_CHECK], [
# $2 = pathes to search for # $2 = pathes to search for
AC_DEFUN([AX_REQUIRE_HEADER], [ AC_DEFUN([AX_REQUIRE_HEADER], [
AC_CHECK_HEADER($1, [], [ AC_CHECK_HEADER($1, [], [
if test -n "$2"; then
found=0 found=0
if test -n "$2"; then
for d in $2; do for d in $2; do
if test -f "${d}/$1"; then if test -f "${d}/$1"; then
AC_MSG_NOTICE([found file ${d}/$1]) AC_MSG_NOTICE([found file ${d}/$1])

View File

@@ -129,9 +129,8 @@ GENERATED FILES
* ${MY_NAME} * ${MY_NAME}
* autogen.sh - just the basics to initialize auto tools and create configure * autogen.sh - just the basics to initialize auto tools and create configure
* ax_init_standard_project.m4 - auxiliary macro definition file * ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file
* makefile_test.inc.am - makefile to be included in tests
* resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-debbuilddeps.sh - script to install debian package dependencies
* resolve-rpmbuilddeps.sh - script to install RPM package dependencies * resolve-rpmbuilddeps.sh - script to install RPM package dependencies
* build-in-docker.sh - script to build the project encapsulated in a docker container * build-in-docker.sh - script to build the project encapsulated in a docker container
@@ -274,7 +273,7 @@ FILES
* Enable C++ testing using CppUnit: AX_USE_CPPUNIT * Enable C++ testing using CppUnit: AX_USE_CPPUNIT
* Enable other tests: AX_BUILD_TEST * Enable other tests: AX_BUILD_TEST
* Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES * Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES
* Check for C++11 support: AX_CXX_COMPILE_STDCXX_11 (see ax_cxx_compile_stdcxx_11.m4) * Require C++17 support: AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) (see ax_cxx_compile_stdcxx.m4)
* Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4) * Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4)
* Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4) * Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4)
* Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4) * Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4)
@@ -450,7 +449,7 @@ checkdir() {
if ! test -d "$1"; then # create path if ! test -d "$1"; then # create path
run mkdir -p "$1" run mkdir -p "$1"
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
fi fi
fi fi
} }
@@ -498,7 +497,7 @@ to() {
run chmod $mode $1 run chmod $mode $1
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
@@ -523,10 +522,14 @@ copy() {
if test "${1%/*}" != "$1"; then if test "${1%/*}" != "$1"; then
test -d "${1%/*}" || svn mkdir "${1%/*}" test -d "${1%/*}" || svn mkdir "${1%/*}"
fi fi
if ! test -e "${source}"; then
ignored "$1" not found
return
fi
run cp "${source}" "$1" run cp "${source}" "$1"
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "$1" "${excludevcs[@]}"; then
run ${VCS} add "$1" run --no-check ${VCS} add "$1"
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" "$1" run svn propset svn:keywords "Id" "$1"
fi fi
@@ -575,7 +578,7 @@ vcs2cl() {
fi fi
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "ChangeLog" "${excludevcs[@]}"; then
run ${VCS} add ChangeLog run --no-check ${VCS} add ChangeLog
fi fi
fi fi
} }
@@ -591,9 +594,8 @@ fi
# Initialize the environment: # Initialize the environment:
copy ${MY_NAME} copy ${MY_NAME}
copy ax_init_standard_project.m4 copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4 copy ax_cxx_compile_stdcxx.m4
copy ax_check_qt.m4 copy ax_check_qt.m4
copy makefile_test.inc.am
copy resolve-debbuilddeps.sh copy resolve-debbuilddeps.sh
copy resolve-rpmbuilddeps.sh copy resolve-rpmbuilddeps.sh
copy build-in-docker.sh copy build-in-docker.sh
@@ -1505,9 +1507,10 @@ if testtag AX_USE_DOXYGEN; then
if ! checkfile doc/doxyfile.in || \ if ! checkfile doc/doxyfile.in || \
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
sed -i ':a;/\\$/{s///;N;s/ *\n */ /g;ba}' doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then
run ${VCS} add doc/doxyfile.in run --no-check ${VCS} add doc/doxyfile.in
if test "${VCS}" = "svn"; then if test "${VCS}" = "svn"; then
run svn propset svn:keywords "Id" doc/doxyfile.in run svn propset svn:keywords "Id" doc/doxyfile.in
fi fi
@@ -1548,6 +1551,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace WARN_IF_UNDOCUMENTED NO doxyreplace WARN_IF_UNDOCUMENTED NO
doxyreplace WARN_LOGFILE doxygen.errors doxyreplace WARN_LOGFILE doxygen.errors
doxyreplace INPUT "@top_srcdir@/src" doxyreplace INPUT "@top_srcdir@/src"
doxyadd INPUT "@top_srcdir@/@README_FILE@"
if testtag AX_USE_SCRIPTS; then if testtag AX_USE_SCRIPTS; then
doxyadd INPUT "@top_srcdir@/scripts" doxyadd INPUT "@top_srcdir@/scripts"
fi fi
@@ -1562,6 +1566,7 @@ if testtag AX_USE_DOXYGEN; then
doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules" doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules"
doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext" doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext"
fi fi
doxyreplace USE_MDFILE_AS_MAINPAGE "@top_srcdir@/@README_FILE@"
doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql' doxyreplace FILE_PATTERNS '*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql'
doxyreplace RECURSIVE YES doxyreplace RECURSIVE YES
doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx" doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx"
@@ -1571,9 +1576,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace HTML_DYNAMIC_SECTIONS YES doxyreplace HTML_DYNAMIC_SECTIONS YES
doxyreplace DISABLE_INDEX NO doxyreplace DISABLE_INDEX NO
doxyreplace GENERATE_TREEVIEW YES doxyreplace GENERATE_TREEVIEW YES
if testtag AX_BUILD_EXAMPLES; then doxyreplace EXAMPLE_PATH @top_srcdir@
doxyreplace EXAMPLE_PATH @top_srcdir@/examples
fi
doxyreplace EXAMPLE_RECURSIVE YES doxyreplace EXAMPLE_RECURSIVE YES
doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed' doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed'
doxyreplace SOURCE_BROWSER YES doxyreplace SOURCE_BROWSER YES
@@ -1874,7 +1877,7 @@ desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ dist_pkgdata_DATA = @PACKAGE_ICON@
dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\ dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\
resolve-rpmbuilddeps.sh autogen.sh \\ resolve-rpmbuilddeps.sh autogen.sh \\
ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\ ax_cxx_compile_stdcxx.m4 build-in-docker.sh \\
build-resource-file.sh \\ build-resource-file.sh \\
ax_init_standard_project.m4 \\ ax_init_standard_project.m4 \\
mac-create-app-bundle.sh resolve-debbuilddeps.sh \\ mac-create-app-bundle.sh resolve-debbuilddeps.sh \\

View File

@@ -7,7 +7,7 @@ if test "${arch}" = "amd64"; then
myarch="amd64|i386" myarch="amd64|i386"
fi fi
mode= mode=
img="mwaeckerlin/ubuntu:latest" img=
repos=() repos=()
keys=() keys=()
dns=() dns=()
@@ -20,6 +20,10 @@ arch=$((which dpkg > /dev/null 2> /dev/null && dpkg --print-architecture) || ech
host= host=
flags=() flags=()
wait=0 wait=0
commit=
nopull=0
prepare=0
clean=
if test -e ./build-in-docker.conf; then if test -e ./build-in-docker.conf; then
# you can preconfigure the variables in file build-in-docker.conf # you can preconfigure the variables in file build-in-docker.conf
# if you do so, add the file to EXTRA_DIST in makefile.am # if you do so, add the file to EXTRA_DIST in makefile.am
@@ -28,68 +32,111 @@ fi
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(-h|--help) (-h|--help) cat <<EOF
echo "$0 [OPTIONS]" SYNOPSIS
echo
echo "OPTIONS:" $0 [OPTIONS]
echo
echo " -h, --help show this help" OPTIONS
echo " -m, --mode <type> mode: deb, rpm, win, default: ${mode}"
echo " -i, --image <image> use given docker image instead of ${img}" -h, --help show this help
echo " -a, --arch <arch> build for given hardware architecture" -m, --mode <type> mode: deb, rpm, win, default: ${mode}
echo " -t, --targets targets specify build targets, default: ${targets}" -i, --image <image> use given docker image instead of ${img}
echo " --host <target-arch> host for cross compiling, e.g. i686-w64-mingw32" -a, --arch <arch> build for given hardware architecture
echo " -f, --flag <flag> add flag to ./bootstrap.sh or ./configure" -t, --targets targets specify build targets, default: ${targets}
echo " -r, --repo <url> add given apt repository" --host <target-arch> host for cross compiling, e.g. i686-w64-mingw32
echo " -k, --key <url> add public key from url" -f, --flag <flag> add flag to ./bootstrap.sh or ./configure
echo " -n, --dns <ip> add ip as dns server" -r, --repo <url> add given apt repository
echo " -e, --env <var>=<val> set environment variable in docker" -k, --key <url> add public key from url
echo " -d, --dir <dir> access given directory read only" -n, --dns <ip> add ip as dns server
echo " -p, --package <pkg> install extra debian packages" -e, --env <var>=<val> set environment variable in docker
echo " -c, --cmd <command> execute commands as root in docker" -d, --dir <dir> access given directory read only
echo " -w, --wait on error keep docker container and wait for enter" -p, --package <pkg> install extra debian packages
echo -c, --cmd <command> execute commands as root in docker
echo " The option -i must be after -m, because mode sets a new default image" -w, --wait on error keep docker container and wait for enter
echo " The option -m must be after -t, because mode may be auto detected from targets" --clean run maintainer-clean before build
echo " The option -m must be after -h, because mode may set a host" --commit <image> commit the container as image after setup, then exit
echo " If target is either deb or rpm, mode is set to the same value" --no-pull do not pull image before start (use local image)
echo " If target is win, host is set to i686-w64-mingw32" --prepare only prepare the image, then wait
echo
echo " The options -r -k -e -d -p -c can be repeated several times." The option -i must be after -m, because mode sets a new default image
echo The option -m must be after -t, because mode may be auto detected from targets
echo " The options -r -p -c allow an if-then-else contruct" The option -m must be after -h, because mode may set a host
echo " depending on the operating system:" If target is either deb or rpm, mode is set to the same value
echo " <os>:::<A>:::<B>" If target is win, host is set to i686-w64-mingw32
echo " <os>:::<A>"
echo " Read as: On linux type <os> use <A> else use <B>" The options -r -k -e -d -p -c can be repeated several times.
echo " That means: If the distributer ID or codename in lsb_release"
echo " matches regular expression <os>, then <A> is replaced, else <B> is replaced." The options -r -p -c allow an if-then-else contruct
echo " The three colons are for splitting <os> from <A> and <B> part." depending on the operating system:
echo " E.g.: Install package curl on wheezy and npm on olter systems:" <os>:::<A>:::<B>
echo " $0 -p Debian|precise:::curl:::npm" <os>:::<A>
echo Read as: On linux type <os> use <A> else use <B>
echo "EXAMPLE:" That means: If the distributer ID or codename in lsb_release
echo matches regular expression <os>, then <A> is replaced, else <B> is replaced.
echo "$0 -i mwaeckerlin/ubuntu:trusty-i386 \\" The three colons are for splitting <os> from <A> and <B> part.
echo " -t deb \\" E.g.: Install package curl on wheezy and npm on olter systems:
echo " -e ANDROID_HOME=/opt/local/android \\" $0 -p Debian|precise:::curl:::npm
echo " -d /opt/local/android \\"
echo " -r universe \\" PERFORMANCE
echo " -r https://repository.mrw.sh \\"
echo " -k https://repository.mrw.sh/PublicKey \\" Each build starts with an empty image and first installs all
echo " -p mrw-c++" dependencies. You can speed up the build process by using an image,
echo where all dependencies are already installed. The disadvantage of
this approach is, that missing dependencies are not detected, so
installing all dependencies into an empty image is a test for the
dependency specification.
Create an image from ubuntu:trusty that contains all dependencies:
$0 -i ubuntu:trusty --tag my/trusty
Now you can use the image my/trusty, but since it is not stored in a
repository, you have to either push it to a repository (here my is
your name in docker hub), or simply use it local only and add the
flag --no-pull:
$0 -i my/trusty -t all
As long as you work with my/trusty, the dependencies don't need to
be donwloaded in each build.
TESTING
When you want to experiment with your builds, i.e. to trace a build
problem, then option --prepare comes handy. It just starts an image
with all dependencies, then waits and gives you information on how
you can enter the image for manual tests in a temporary
container. As soon as you hit the enter key, it cleans up the
temporary container.
$0 -i ubuntu:trusty --prepare
EXAMPLE
$0 -i mwaeckerlin/ubuntu:trusty-i386 \\
-t deb \\
-e ANDROID_HOME=/opt/local/android \\
-d /opt/local/android \\
-r universe \\
-r https://repository.mrw.sh \\
-k https://repository.mrw.sh/PublicKey \\
-p mrw-c++
EOF
exit 0 exit 0
;; ;;
(-m|--mode) shift; (-m|--mode)
shift;
mode="$1" mode="$1"
if test -z "$img"; then
case "$mode" in case "$mode" in
(deb|apt) img="mwaeckerlin/ubuntu:latest";; (deb|apt) img="mwaeckerlin/debbuildenv";;
(rpm|zypper) img="opensuse:latest";; (rpm|zypper) img="opensuse:latest";;
(yum) img="centos:latest";; (yum) img="centos:latest";;
(dnf) img="fedora:latest";; (dnf) img="fedora:latest";;
(win) (win)
img="mwaeckerlin/ubuntu:latest"; host="${host:---host=i686-w64-mingw32}" img="mwaeckerlin/debbuildenv"; host="${host:---host=i686-w64-mingw32}"
targets="all install" targets="all install"
flags+=("--prefix=/workdir/usr") flags+=("--prefix=/workdir/usr")
packages+=("mingw-w64") packages+=("mingw-w64")
@@ -99,6 +146,7 @@ while test $# -gt 0; do
exit 1 exit 1
;; ;;
esac esac
fi
;; ;;
(-i|--image) shift; (-i|--image) shift;
img="$1" img="$1"
@@ -145,6 +193,18 @@ while test $# -gt 0; do
(-w|--wait) (-w|--wait)
wait=1 wait=1
;; ;;
(--clean)
clean="--clean -c"
;;
(--commit) shift;
commit="$1"
;;
(--no-pull)
nopull=1
;;
(--prepare)
prepare=1
;;
(*) (*)
echo "**** ERROR: unknown option '$1', try --help" 1>&2 echo "**** ERROR: unknown option '$1', try --help" 1>&2
exit 1 exit 1
@@ -157,6 +217,15 @@ while test $# -gt 0; do
shift shift
done done
function waitforinput() {
set +x
echo " ... now you can access the docker container as root or user:"
echo " docker exec -it ${DOCKER_ID} bash"
echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash"
echo -n " ... press enter to cleanup: "
read
}
function traperror() { function traperror() {
set +x set +x
local DOCKER_ID="$1" local DOCKER_ID="$1"
@@ -177,11 +246,7 @@ function traperror() {
echo echo
fi fi
if [ "$wait" -eq 1 ]; then if [ "$wait" -eq 1 ]; then
echo " ... now you can access the docker container as root or user:" waitforinput
echo " docker exec -it ${DOCKER_ID} bash"
echo " docker exec -u $(id -u) -it ${DOCKER_ID} bash"
echo -n " ... press enter to cleanup: "
read
fi fi
echo -n " ... cleanup docker: " echo -n " ... cleanup docker: "
docker stop "${DOCKER_ID}" || true docker stop "${DOCKER_ID}" || true
@@ -243,7 +308,10 @@ function ifthenelse() {
set -x set -x
docker pull $img if test -z "$img"; then
img="mwaeckerlin/debbuildenv"
fi
test $nopull -eq 1 || docker pull $img
DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity) DOCKER_ID=$(docker create ${dns[@]} ${dirs[@]} ${envs[@]} -w /workdir $img sleep infinity)
trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT trap 'traperror '"${DOCKER_ID}"' "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' SIGINT INT TERM EXIT
if ! [[ $arch =~ $myarch ]]; then if ! [[ $arch =~ $myarch ]]; then
@@ -262,8 +330,8 @@ if test -z "$mode"; then
(*deb*) mode=deb;; (*deb*) mode=deb;;
(*rpm*) mode=rpm;; (*rpm*) mode=rpm;;
(*) case "$img" in (*) case "$img" in
(*ubuntu*|*debian*|*mint*) mode=deb;; (*deb*|*ubuntu*|*debian*|*mint*) mode=deb;;
(*fedora*|*centos*|*mageia*) mode=rpm;; (*rpm*|*fedora*|*centos*|*mageia*) mode=rpm;;
(*mingw*|*win*) mode=win;; (*mingw*|*win*) mode=win;;
(*) mode=deb;; (*) mode=deb;;
esac;; esac;;
@@ -272,25 +340,18 @@ fi
case "$mode" in case "$mode" in
(deb|apt|win) (deb|apt|win)
OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends' OPTIONS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew -y --force-yes --no-install-suggests --no-install-recommends'
PREVENT='libpam-systemd policykit.* colord dconf-service'
docker exec ${DOCKER_ID} apt-get update ${OPTIONS} docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
docker exec ${DOCKER_ID} apt-mark hold ${PREVENT}
#docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS} #docker exec ${DOCKER_ID} apt-get upgrade ${OPTIONS}
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties software-properties-common apt-transport-https dpkg-dev lsb-release wget || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- software-properties-common apt-transport-https dpkg-dev lsb-release wget || \ docker exec ${DOCKER_ID} apt-get install ${OPTIONS} software-properties-common apt-transport-https dpkg-dev lsb-release wget || \
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- python-software-properties apt-transport-https dpkg-dev lsb-release wget; docker exec ${DOCKER_ID} apt-get install ${OPTIONS} python-software-properties apt-transport-https dpkg-dev lsb-release wget;
if [[ "${img}" =~ "ubuntu" ]]; then if [[ "${img}" =~ "ubuntu" ]]; then
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- locales docker exec ${DOCKER_ID} apt-get install ${OPTIONS} locales
docker exec ${DOCKER_ID} locale-gen ${LANG} docker exec ${DOCKER_ID} locale-gen ${LANG}
docker exec ${DOCKER_ID} update-locale LANG=${LANG} docker exec ${DOCKER_ID} update-locale LANG=${LANG}
fi fi
for f in ${PREVENT}; do if test -n "${keys[*]}"; then # fix dependency bug in cosmic and stretch
docker exec ${DOCKER_ID} bash -c "echo 'Package: ${f}' >> /etc/apt/preferences" docker exec ${DOCKER_ID} apt-get install ${OPTIONS} gnupg
docker exec ${DOCKER_ID} bash -c "echo 'Pin-Priority: -100' >> /etc/apt/preferences"
docker exec ${DOCKER_ID} bash -c "echo >> /etc/apt/preferences"
done
if test -n "${keys[@]}"; then # fix dependency bug in cosmic and stretch
docker exec ${DOCKER_ID} apt-get install ${OPTIONS} ${PREVENT// /- }- gnupg
for key in "${keys[@]}"; do for key in "${keys[@]}"; do
wget -O- "$key" \ wget -O- "$key" \
| docker exec -i ${DOCKER_ID} apt-key add - | docker exec -i ${DOCKER_ID} apt-key add -
@@ -302,7 +363,7 @@ case "$mode" in
docker exec ${DOCKER_ID} apt-get update ${OPTIONS} docker exec ${DOCKER_ID} apt-get update ${OPTIONS}
for package in "${packages[@]}"; do for package in "${packages[@]}"; do
ifthenelse "${package}" "apt-get install ${OPTIONS} ${PREVENT// /- }- ARG" ifthenelse "${package}" "apt-get install ${OPTIONS} ARG"
done done
for command in "${commands[@]}"; do for command in "${commands[@]}"; do
ifthenelse "${command}" "ARG" ifthenelse "${command}" "ARG"
@@ -357,13 +418,24 @@ for f in "${flags[@]}"; do
FLAGS+=($(ifthenelse "$f" "echo 'ARG'")) FLAGS+=($(ifthenelse "$f" "echo 'ARG'"))
done done
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh -t "${targets}" ${host} "${FLAGS[@]}" if test -n "$commit"; then
docker commit ${DOCKER_ID} "$commit"
echo "commited new image: $commit"
exit 0
fi
if test $prepare -eq 1; then
waitforinput
exit 0
fi
docker exec -u $(id -u):$(id -g) ${DOCKER_ID} ./bootstrap.sh ${clean} -t "${targets}" ${host} "${FLAGS[@]}"
# last check: try to install built deb or rpm files (if not already cleaned up) # last check: try to install built deb or rpm files (if not already cleaned up)
# not supported in trusty and jessie # not supported in trusty and jessie
if test "$mode" = deb -a "${img//trusty/}" = "${img}" -a "${img//jessie/}" = "${img}"; then if test "$mode" = deb -a "${img//trusty/}" = "${img}" -a "${img//jessie/}" = "${img}"; then
if test "${targets//deb/}" != "${targets}" && ls *.deb > /dev/null 2> /dev/null; then if test "${targets//deb/}" != "${targets}" && ls *.deb > /dev/null 2> /dev/null; then
docker exec ${DOCKER_ID} bash -c "apt-get install ${OPTIONS} ${PREVENT// /- }- /workdir/*.deb" docker exec ${DOCKER_ID} bash -c "apt-get install ${OPTIONS} /workdir/*.deb"
fi fi
fi fi
if test "$mode" = rpm -a "${targets//rpm/}" != "${targets}"; then if test "$mode" = rpm -a "${targets//rpm/}" != "${targets}"; then

Binary file not shown.

View File

@@ -11,7 +11,7 @@
pkgdocdatadir = ${pkgdatadir}/doc pkgdocdatadir = ${pkgdatadir}/doc
pkgtestdatadir = ${pkgdatadir}/test pkgtestdatadir = ${pkgdatadir}/test
dist_pkgdata_DATA = ax_check_qt.m4 bootstrap.sh mac-create-app-bundle.sh makefile_test.inc.am ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh resolve-debbuilddeps.sh build-resource-file.sh resolve-rpmbuilddeps.sh ax_init_standard_project.m4 sql-to-dot.sed dist_pkgdata_DATA = ax_check_qt.m4 bootstrap.sh mac-create-app-bundle.sh ax_cxx_compile_stdcxx.m4 build-in-docker.sh resolve-debbuilddeps.sh build-resource-file.sh resolve-rpmbuilddeps.sh ax_init_standard_project.m4 sql-to-dot.sed
dist_pkgdocdata_DATA = doc/plantuml.jar dist_pkgdocdata_DATA = doc/plantuml.jar
dist_pkgtestdata_DATA = test/runtests.sh dist_pkgtestdata_DATA = test/runtests.sh

View File

@@ -1,5 +1,7 @@
#!/bin/bash -e #!/bin/bash -e
# documentation: run with option --help
########################################################################################## ##########################################################################################
#### template for bash scripts #### START BELOW ########################################## #### template for bash scripts #### START BELOW ##########################################
########################################################################################## ##########################################################################################
@@ -45,25 +47,25 @@ message() {
# write a success message # write a success message
success() { success() {
echo -n "${bold}${green}success" 1>&2 echo -n "${bold}${green}success" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write a notice # write a notice
notice() { notice() {
echo -n "${bold}${yellow}notice" 1>&2 echo -n "${bold}${yellow}notice" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write a warning message # write a warning message
warning() { warning() {
echo -en "${bold}${red}warning" 1>&2 echo -en "${bold}${red}warning" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write error message # write error message
error() { error() {
echo -en "${bold}${red}error" 1>&2 echo -en "${bold}${red}error" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# run a command, print the result and abort in case of error # run a command, print the result and abort in case of error
@@ -91,9 +93,10 @@ run() {
exit 1 exit 1
else else
warning "ignored return code: $res" warning "ignored return code: $res"
return 0
fi fi
else else
success return 1
fi fi
} }
@@ -119,7 +122,6 @@ function traperror() {
exit $e exit $e
fi fi
done done
success
exit 0 exit 0
} }
@@ -135,7 +137,7 @@ trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FU
######################################################### commandline parameter evaluation ######################################################### commandline parameter evaluation
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(--help|-h) less <<EOF (--help|-h) cat <<EOF
SYNOPSIS SYNOPSIS
$0 [OPTIONS] $0 [OPTIONS]
@@ -157,4 +159,3 @@ EOF
done done
##################################################################################### Main ##################################################################################### Main

View File

@@ -1,5 +1,7 @@
#!/bin/bash -e #!/bin/bash -e
# documentation: run with option --help
########################################################################################## ##########################################################################################
#### template for bash scripts #### START BELOW ########################################## #### template for bash scripts #### START BELOW ##########################################
########################################################################################## ##########################################################################################
@@ -45,25 +47,25 @@ message() {
# write a success message # write a success message
success() { success() {
echo -n "${bold}${green}success" 1>&2 echo -n "${bold}${green}success" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write a notice # write a notice
notice() { notice() {
echo -n "${bold}${yellow}notice" 1>&2 echo -n "${bold}${yellow}notice" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write a warning message # write a warning message
warning() { warning() {
echo -en "${bold}${red}warning" 1>&2 echo -en "${bold}${red}warning" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# write error message # write error message
error() { error() {
echo -en "${bold}${red}error" 1>&2 echo -en "${bold}${red}error" 1>&2
append_msg $* 1>&2 append_msg "$*" 1>&2
} }
# run a command, print the result and abort in case of error # run a command, print the result and abort in case of error
@@ -91,9 +93,10 @@ run() {
exit 1 exit 1
else else
warning "ignored return code: $res" warning "ignored return code: $res"
return 0
fi fi
else else
success return 1
fi fi
} }
@@ -119,7 +122,6 @@ function traperror() {
exit $e exit $e
fi fi
done done
success
exit 0 exit 0
} }
@@ -135,7 +137,7 @@ trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FU
######################################################### commandline parameter evaluation ######################################################### commandline parameter evaluation
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
(--help|-h) less <<EOF (--help|-h) cat <<EOF
SYNOPSIS SYNOPSIS
$0 [OPTIONS] $0 [OPTIONS]
@@ -157,4 +159,3 @@ EOF
done done
##################################################################################### Main ##################################################################################### Main