diff --git a/ChangeLog b/ChangeLog index 3ccec60..d69a4eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2015-03-15 15:57 marc + + * ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, + ax_init_standard_project.m4, bootstrap.sh, src/makefile.am, + src/proxyface.pc.in: fixed pc file + +2015-03-15 15:13 marc + + * ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, + ax_init_standard_project.m4, bootstrap.sh: fixed MOC_FLAGS for + QT4 + +2015-03-15 15:10 marc + + * ChangeLog, ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, + ax_init_standard_project.m4, bootstrap.sh, + debian/proxyface-dev.install: added html documentation to debian + package + +2015-03-15 14:40 marc + + * README, ax_check_qt.m4, ax_cxx_compile_stdcxx_11.m4, + ax_init_standard_project.m4, bootstrap.sh, doc/doxyfile.in: + doc/doxyfile.in should be part of the package + 2015-03-15 14:22 marc * AUTHORS, COPYING, ChangeLog, INSTALL, README, ax_check_qt.m4, diff --git a/ax_check_qt.m4 b/ax_check_qt.m4 index 5422129..61724b6 100644 --- a/ax_check_qt.m4 +++ b/ax_check_qt.m4 @@ -1,6 +1,10 @@ # SYNOPSIS # -# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules]) +# Check if a module exists: +# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) +# +# Abort if a module does not exist: +# AX_CXX_REQUIRE_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) # # DESCRIPTIONS # @@ -25,6 +29,13 @@ # feature. Each entry in the list can have a version comparison # specifier, with the same syntax as the Requires keyword in the # data files themselves. +# +# optional-modules +# +# Optional list of more, optional modules, e.g. modules that +# exist only in Qt5, but not in Qt4, such as QtWidgets or +# QtWebKitWidgets + AC_DEFUN([AX_CXX_QT_TOOL], [ if test -z "$HAVE_$1"; then @@ -93,12 +104,24 @@ AC_DEFUN([AX_CHECK_QT], [ MOC_FLAGS+=" -DHAVE_$1=1 ${[$1]5_CFLAGS}" AM_CXXFLAGS+=" ${[$1]5_CFLAGS}" LIBS+=" ${[$1]5_LIBS}" + modules=${qt_modules//Qt/Qt5} + if test -z "$PKG_REQUIREMENTS"; then + PKG_REQUIREMENTS="${modules// /, }" + else + PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + fi if test -n "${qt_modules_optional}"; then PKG_CHECK_MODULES([$1]5_OPTIONAL, [${qt_modules_optional//Qt/Qt5}], [ AM_CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" AM_CXXFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}" LIBS+=" ${[$1]5_OPTIONAL_LIBS}" + modules=${qt_modules_optional//Qt/Qt5} + if test -z "$PKG_REQUIREMENTS"; then + PKG_REQUIREMENTS="${modules// /, }" + else + PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + fi ], [ AC_MSG_NOTICE([Not found: ${qt_modules_optional//Qt/Qt5}]) ]) @@ -111,12 +134,24 @@ AC_DEFUN([AX_CHECK_QT], [ MOC_FLAGS+=" -DHAVE_$1=1 ${$1_CFLAGS}" AM_CXXFLAGS+=" ${$1_CFLAGS}" LIBS+=" ${$1_LIBS}" + modules=${qt_modules} + if test -z "$PKG_REQUIREMENTS"; then + PKG_REQUIREMENTS="${modules// /, }" + else + PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + fi if test -n "$3"; then PKG_CHECK_MODULES($1_OPTIONAL, [${qt_modules_optional}], [ AM_CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}" MOC_FLAGS+=" ${$1_OPTIONAL_CFLAGS}" AM_CXXFLAGS+=" ${$1_OPTIONAL_CFLAGS}" LIBS+=" ${$1_OPTIONAL_LIBS}" + modules=${qt_modules_optional} + if test -z "$PKG_REQUIREMENTS"; then + PKG_REQUIREMENTS="${modules// /, }" + else + PKG_REQUIREMENTS="${PKG_REQUIREMENTS}, ${modules// /, }" + fi ], [ AC_MSG_NOTICE([Not found: ${qt_modules_optional}]) ]) @@ -128,6 +163,7 @@ AC_DEFUN([AX_CHECK_QT], [ AC_SUBST(AM_CPPFLAGS) AC_SUBST(MOC_FLAGS) AC_SUBST(AM_CXXFLAGS) + AC_SUBST(PKG_REQUIREMENTS) AX_ADDITIONAL_QT_RULES_HACK=' ui_%.hxx: %.ui $(UIC) -o [$][@] $< @@ -140,9 +176,51 @@ qrc_%.cxx: %.qrc AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK) ]) +# SYNOPSIS +# +# AX_CXX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules]) +# +# DESCRIPTIONS +# +# qt_prefix +# +# Each call to AX_CXX_CHECK_QT should have a different prefix +# value (with a few exceptions discussed later on). This value, +# usually provided in uppercase, is used as prefix to the +# variables holding the compiler flags and libraries reported by +# pkg-config. +# +# For instance, if your prefix was to be FOO you'll be provided +# two variables FOO_CFLAGS and FOO_LIBS. +# +# This will also be used as message during the configure checks: +# checking for FOO.... +# +# list-of-modules +# +# A single call to the macro can check for the presence of one or +# more qt modules; you'll see later how to make good use of this +# feature. Each entry in the list can have a version comparison +# specifier, with the same syntax as the Requires keyword in the +# data files themselves. +# +# optional-modules +# +# Optional list of more, optional modules, e.g. modules that +# exist only in Qt5, but not in Qt4, such as QtWidgets or +# QtWebKitWidgets + AC_DEFUN([AX_REQUIRE_QT], [ AX_CHECK_QT([$1], [$2], [$3]) if ! test "$HAVE_$1" -eq 1; then AC_MSG_ERROR([Required Qt modules not found: $2]) fi ]) + + +# Omit Qt Keywords +# AX_QT_NO_KEYWORDS + +AC_DEFUN([AX_QT_NO_KEYWORDS], [ + AM_CPPFLAGS+=" -DQT_NO_KEYWORDS" +]) diff --git a/ax_init_standard_project.m4 b/ax_init_standard_project.m4 index b718099..a882473 100644 --- a/ax_init_standard_project.m4 +++ b/ax_init_standard_project.m4 @@ -3,17 +3,41 @@ ## 1 2 3 4 5 6 7 8 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890 +# define least version number from subversion's revision number: +# it is taken modulo 256 due to a bug on Apple's MacOSX m4_define(x_least, m4_esyscmd_s( - LEAST="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" + SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" for path in . .. ../..; do if svn info $path 2>&1 > /dev/null; then - LEAST=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') (cd $path && svn2cl) break; fi done - echo -n $LEAST + # Mac does not support LEAST > 255 + echo $ECHO_N $(($SVN_REVISION%256)) )) +# define version number from subversion's revision number: +# it is taken modulo 256 due to a bug on Apple's MacOSX +# add to x_minor if revision number is > 256 +m4_define(x_minor_fixed, m4_esyscmd_s( + SVN_REVISION="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout" + for path in . .. ../..; do + if svn info $path 2>&1 > /dev/null; then + SVN_REVISION=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p') + (cd $path && svn2cl) + break; + fi + done + # Mac does not support LEAST > 255 + echo $ECHO_N $((x_minor+$SVN_REVISION/256)) +)) +# setup version number +m4_define(x_version, m4_esyscmd_s( + echo $ECHO_N x_major.x_minor_fixed.x_least +)) + +## bugreport mail address is taken from in first line of AUTHORS m4_define(x_bugreport, m4_esyscmd_s( head -1 AUTHORS | \ sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp' @@ -37,6 +61,11 @@ dnl refers to ${prefix}. Thus we have to use `eval' twice. test "$exec_prefix_NONE" && exec_prefix=NONE ]) +# add target dependencies to an existing makefile.in +# - parameters: +# $1 = existing target +# $2 = new dependency for that target +# $3 = filename of makefile.in AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ sh_add_makefile_target_dep() { sed -i ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}" @@ -50,31 +79,61 @@ AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [ fi ]) +# Same as AC_SUBST, but adds -Dname="value" option to CPPFLAGS +# - parameters: +# $1 = variable name +AC_DEFUN([AX_SUBST], [ + AC_SUBST([$1]) + tmp_var=$(echo "${$1}" | awk 1 ORS='\\n') + tmp_var=${tmp_var//\"/\\\"} + tmp_var=${tmp_var//\'/\'\"\'\"\'} + tmp_var=${tmp_var//#/\\#} + AM_CPPFLAGS+=" '-D$1=\"${tmp_var}\"'" + AC_SUBST(AM_CPPFLAGS) +]) + +# must be called on the right position in configure.ac +# +# configure.ac must start with: +# +# m4_define(x_package_name, YOUR_PACKAGE_NAME) # project's name +# m4_define(x_major, MAJOR_NUMBER) # project's major version +# m4_define(x_minor, MINOR_NUMBER) # project's minor version +# m4_include(ax_init_standard_project.m4) +# AC_INIT(x_package_name, x_version, x_bugreport, x_package_name) +# AM_INIT_AUTOMAKE([1.9 tar-pax]) +# AX_INIT_STANDARD_PROJECT +# +# you change nothing but: YOUR_PACKAGE_NAME, MAJOR_NUMBER, MINOR_NUMBER +# +# configures the basic environment AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ - AC_SUBST(HOME) + AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X' '-DNAMESPACE=${PACKAGE_NAME}'" + AX_SUBST(NUMBERS) + AX_SUBST(HOME) README=$(tail -n +3 README) + AX_SUBST(README) + _AM_SUBST_NOTMAKE([README]) DESCRIPTION=$(head -1 README) + AX_SUBST(DESCRIPTION) + _AM_SUBST_NOTMAKE([DESCRIPTION]) AUTHOR=$(head -1 AUTHORS) - AC_SUBST(AUTHOR) + AX_SUBST(AUTHOR) _AM_SUBST_NOTMAKE([AUTHOR]) - AC_SUBST(DESCRIPTION) - _AM_SUBST_NOTMAKE([DESCRIPTION]) - AC_SUBST(README) - _AM_SUBST_NOTMAKE([README]) DISTRO=$(lsb_release -sc) - AC_SUBST(DISTRO) + AX_SUBST(DISTRO) BUILD_NUMBER=${BUILD_NUMBER:-1} - AC_SUBST(BUILD_NUMBER) - BUILD_DATE=$(date -R) - AC_SUBST(BUILD_DATE) + AX_SUBST(BUILD_NUMBER) + BUILD_DATE=$(LANG= date +"%a, %d %B %Y %H:%M:%S %z") + AX_SUBST(BUILD_DATE) if test -f "${PROJECT_NAME}-logo.png"; then PROJECT_LOGO="${PROJECT_NAME}-logo.png" fi - AC_SUBST(PROJECT_LOGO) + AX_SUBST(PROJECT_LOGO) if test -f "${PROJECT_NAME}-icon.png"; then PROJECT_ICON="${PROJECT_NAME}-icon.png" fi - AC_SUBST(PROJECT_ICON) + AX_SUBST(PROJECT_ICON) AC_CONFIG_FILES([makefile]) AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-standard-project-targets], [makefile.in]) @@ -82,7 +141,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [ test -f makefile.in && cat >> makefile.in <> test/makefile.in < rebild specific file (can be added multiple times) + --help, -h show this help + --version, -v show version and date of this file + +DESCRIPTION + + Initializes your build environment, as far as neccessary. Reads your + used features from configure.ac, if that file exists, or creates a + configure.ac. Automatically copies or creates all required template + files. + + From your new and empty project's subversion path, call $0 to + initialize your build environment. + + Before you call ${MY_NAME} the very first time, edit ${0#/*}/AUTHORS + and replace it with your name (or the authors of your project, one + name each line, main developper and copyright holder on the first + line). + + The first call to ${MY_NAME} should be something like + ../bootstrap-build-environment/${MY_NAME} and not + ./${MY_NAME}. Actually, you called $0. + + In the way you called ${MY_NAME}, it has detected + ${DEFAULT_PROJECT_NAME} as the project name for your project in + ${PROJECT_PATH}. In the first run, you should call ${MY_NAME} from a + checked out the bootstrap-build-environment from + https://dev.marc.waeckerlin.org/, and the path from where you call + ${MY_NAME} (which is actually ${PROJECT_PATH}) should be the path to + your newly created project. Please note that your project must be a + checked out subversion repository, since this build environment + relies on subversion. + + Example for an initial run, where your new projet is stored in + subversion on svn:/path/to/your/new-project: + + cd ~/svn + svn co https://dev.marc.waeckerlin.org/svn/bootstrap-build-environment/trunk \\ + bootstrap-build-environment + svn co svn:/path/to/your/new-project/trunk new-project + cd new-project + ../bootstrap-build-environment/bootstrap.sh + +RUNNING + + If you run ${MY_NAME}, it first generates the necessary files (see + below), then first runs make distclean if a makefile exists. After + this it calles aclocal, libtoolize, automake, autoconf and + optionally ./configure. + +GENERATED FILES + + This script copies the following files into your project environment: + * ${MY_NAME} + * ax_init_standard_project.m4 - auxiliary macro definition file + * ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file + * ax_check_qt.m4 - auxiliary macro definition file + * AUTHORS - replace your name in AUTHORS before first run + * configure.ac - global configuration file template + * makefile.am - global makefile template + * src/makefile.am - if you enabled AX_USE_CXX + * src/version.hxx - if you enabled AX_USE_CXX + * src/version.cxx - if you enabled AX_USE_CXX + * scripts/makefile.in - if you enabled AX_USE_SCRIPTS + * doc/makefile.am - if you enabled AX_USE_DOXYGEN + * doc/doxyfile.in - if you enabled AX_USE_DOXYGEN + * test/makefile.am - if you enabled AX_USE_CPPUNIT + * examples/makefile.am - if you enabled AX_BUILD_EXAMPLES + * debian/changelog.in - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/control.in - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/docs - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/${DEFAULT_PROJECT_NAME}.install - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/${DEFAULT_PROJECT_NAME}.dirs - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/${DEFAULT_PROJECT_NAME}-dev.install - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/${DEFAULT_PROJECT_NAME}-dev.dirs - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/rules - if you enabled AX_USE_DEBIAN_PACKAGING + * debian/compat - if you enabled AX_USE_DEBIAN_PACKAGING + * src/${DEFAULT_PROJECT_NAME}.pc.in - if you enabled AX_USE_LIBTOOL + +REBUILDING FILES + + To rebuild all these files, just run "${MY_NAME} -r". + + To copy only the files provided by this package, that means those + files you must never change, that means to update the build system + to the latest release, run "${MY_NAME} -o" + + You can also rebuild a list of singleany list of specific file files + by adding option "${MY_NAME} -f " to rebuild file + "". You can add option "-f" more than once. + +FILES TO EDIT + + After creation of the files, you can edit them according to your + needs. Please don't forget to redo your edits after rebuilding a + file. Most files don't even need to be edited, they work out of the + box. + + The following files normally require editing: + * AUTHORS + * README + * configure.ac + * src/makefile.am + * test/makefile.am + * examples/makefile.am + +FILE DEPENDENCIES + + You should rebuild (see above) the files, whenever you change the + configuration a dependent, i.e.: + + * test/makefile.am depends on AX_USE_LIBTOOL + * doc/doxyfile.in depends on AX_BUILD_EXAMPLES + * debian/control.in depends on AX_USE_DOXYGEN, AX_USE_CPPUNIT, + AX_CXX_QT, AX_CXX_CHECK_QT, AX_USE_LIBTOOL + * debian/${DEFAULT_PROJECT_NAME}.install depends on AX_USE_LIBTOOL + * debian/${DEFAULT_PROJECT_NAME}.dirs depends on AX_USE_LIBTOOL + * debian/${DEFAULT_PROJECT_NAME}-dev.install depends on AX_USE_LIBTOOL + * debian/${DEFAULT_PROJECT_NAME}-dev.dirs depends on AX_USE_LIBTOOL + +FILES + + * AUTHORS: First line is the main author and used in Debian and RPM + packaging, so there must be a GPG key that matches + to this line. + * README: First line is a short description of your project, then an + empty line must follow. All remaining lines are a + long description of your project. this information + is copied, e.g. in Debian or RPM packages. In C++ + generating:\e[0m $1 ..." @@ -105,13 +319,22 @@ to() { else echo -e " \e[32msuccess\e[0m" fi - run svn add "$1" - run svn propset svn:keywords "Id" "$1" + chmod $mode $1 + if test $exists -eq 0; then + run svn add "$1" + run svn propset svn:keywords "Id" "$1" + fi + return 0 } copy() { - if ! test -f "$1"; then - run cp "${0%/*}/$1" "$1" + if checkfile "$1" && test $overwrite -eq 0 \ + && ! contains "$1" "${rebuildfiles[@]}"; then + # file already exists and must not be rebuilt + return + fi + run cp "${0%/*}/$1" "$1" + if test $exists -eq 0; then run svn add "$1" run svn propset svn:keywords "Id" "$1" fi @@ -119,11 +342,22 @@ copy() { doxyreplace() { echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." - if sed -i 's|\(^'"$1"' *=\) *|\1'" $2"'|g' doc/doxyfile.in; then + if sed -i 's|\(^'"$1"' *=\) *.*|\1'" $2"'|g' doc/doxyfile.in; then + echo -e " \e[32msuccess\e[0m" + else + echo -e " \e[31merror\e[0m" + echo -e "\e[1m**** command: $0 $*\e[0m" + exit 1 + fi +} + +doxyadd() { + echo -en "\e[1m-> doxyfile:\e[0m configure $1 ..." + if sed -i '/^'"$1"' *=/a'"$1"' += '"$2" doc/doxyfile.in; then echo -e " \e[32msuccess\e[0m" else echo -e " \e[31merror\e[0m" - echo -e "\e[1m**** command: sed -i 's|\(^'"$1"' *=\) *|\1'" $2"'|g' doc/doxyfile.in;\e[0m" + echo -e "\e[1m**** command: $0 $*\e[0m" exit 1 fi } @@ -134,48 +368,136 @@ copy ax_init_standard_project.m4 copy ax_cxx_compile_stdcxx_11.m4 copy ax_check_qt.m4 copy AUTHORS -if ! test -f configure.ac; then - to configure.ac < + +namespace NAMESPACE { + /// get package string which consists of package name and package version + std::string package_string(); + /// get package name + std::string package_name(); + /// get package version + std::string version(); + /// get code build date + std::string build_date(); + /// get author, i.e. copyright holder + std::string author(); + /// get short package description (1st line of README) + std::string description(); + /// get long package description (starting at 3rd line in README) + std::string readme(); + /// get package logo file name + std::string logo(); + /// get package icon file name + std::string icon(); + /// used for what filename + extern const std::string WHAT; + /// used for ident filename + extern const std::string IDENT; +} +EOF +to --condition AX_USE_CXX src/version.cxx < + +namespace NAMESPACE { + std::string package_string() { + return PACKAGE_STRING; + } + std::string package_name() { + return PACKAGE_NAME; + } + std::string version() { + return PACKAGE_VERSION; + } + std::string build_date() { + return BUILD_DATE; + } + std::string author() { + return AUTHOR; + } + std::string description() { + return DESCRIPTION; + } + std::string readme() { + return README; + } + std::string logo() { + return PROJECT_LOGO; + } + std::string icon() { + return PROJECT_ICON; + } + const std::string WHAT("#(@) " PACKAGE_STRING); + const std::string IDENT("\$Id: " PACKAGE_STRING); +} +EOF +echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_SCRIPTS scripts/makefile.am +echo "${HEADER}MAINTAINERCLEANFILES = makefile.in" | to --condition AX_USE_DOXYGEN doc/makefile.am to --condition AX_USE_CPPUNIT test/makefile.am < + +namespace NAMESPACE { + /// get package string which consists of package name and package version + std::string package_string(); + /// get package name + std::string package_name(); + /// get package version + std::string version(); + /// get code build date + std::string build_date(); + /// get author, i.e. copyright holder + std::string author(); + /// get short package description (1st line of README) + std::string description(); + /// get long package description (starting at 3rd line in README) + std::string readme(); + /// get package logo file name + std::string logo(); + /// get package icon file name + std::string icon(); + /// used for what filename + extern const std::string WHAT; + /// used for ident filename + extern const std::string IDENT; +}