AC_PREREQ([2.63]) dnl To do a release, increment this number, commit, then submit it as a PR dnl to merge via homu. After that, do `git pull origin && git reset --hard origin/master`. dnl Then draft release notes highlighting changes and generate the shortlog using dnl . dnl Then use to create a signed tag with the dnl release notes as its content. dnl Then git push origin v201X.XX. dnl Then create the xz tarball from `make -f Makefile.dist-packaging dist-snapshot`. dnl Then create a GitHub release for the new release tag and attach the tarball. m4_define([year_version], [2019]) m4_define([release_version], [2]) m4_define([package_version], [year_version.release_version]) AC_INIT([rpm-ostree], [package_version], [atomic-devel@projectatomic.io]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([buildutil]) AC_CONFIG_AUX_DIR([build-aux]) dnl Versioning information AC_SUBST([YEAR_VERSION], [year_version]) AC_SUBST([RELEASE_VERSION], [release_version]) AC_SUBST([PACKAGE_VERSION], [package_version]) AM_INIT_AUTOMAKE([1.11 -Wno-portability foreign no-define tar-ustar no-dist-gzip dist-xz subdir-objects]) AM_MAINTAINER_MODE([enable]) AM_SILENT_RULES([yes]) AC_USE_SYSTEM_EXTENSIONS AC_SYS_LARGEFILE AC_PROG_CC dnl we don't today use C++ in rpm-ostree, only in libdnf, dnl but this has the side effect of setting CXXFLAGS with -g dnl if not set, which we definitely want; cmake doesn't do that. AC_PROG_CXX AM_PROG_CC_C_O # dbus system dir AC_MSG_CHECKING(for dbus system services directory) if test "$enable_prefix_only" = "yes"; then dbusservicedir='${datadir}/dbus-1/system-services' else dbusservicedir='${datadir}/dbus-1/system-services' if test "$dbusservicedir" = ""; then AC_MSG_ERROR(Couldn't find dbus services directory. Try installing dbus-devel) fi fi AC_SUBST([dbusservicedir], [$dbusservicedir]) AC_MSG_RESULT(dbusservicedir) dnl Keep this in sync with the version in ostree AS_IF([echo "$CFLAGS" | grep -q -E -e '-Werror($| )'], [], [ CC_CHECK_FLAGS_APPEND([WARN_CFLAGS], [CFLAGS], [\ -pipe \ -Wall \ -Werror=empty-body \ -Werror=strict-prototypes \ -Werror=missing-prototypes \ -Werror=implicit-function-declaration \ "-Werror=format=2 -Werror=format-security -Werror=format-nonliteral" \ -Werror=pointer-arith -Werror=init-self \ -Werror=missing-declarations \ -Werror=return-type \ -Werror=switch \ -Werror=overflow \ -Werror=int-conversion \ -Werror=parenthesis \ -Werror=undef \ -Werror=incompatible-pointer-types \ -Werror=misleading-indentation \ -Werror=missing-include-dirs -Werror=aggregate-return \ -Wstrict-aliasing=2 \ -Werror=unused-result \ ])]) AC_SUBST(WARN_CFLAGS) AC_MSG_CHECKING([for -fsanitize=address in CFLAGS]) if echo $CFLAGS | grep -q -e -fsanitize=address; then AC_MSG_RESULT([yes]) using_asan=yes else AC_MSG_RESULT([no]) fi AM_CONDITIONAL(BUILDOPT_ASAN, [test x$using_asan = xyes]) # Initialize libtool LT_PREREQ([2.2.4]) LT_INIT([disable-static]) RPM_OSTREE_FEATURES="" AC_SUBST([RPM_OSTREE_FEATURES]) PKG_PROG_PKG_CONFIG save_LIBS="$LIBS" LIBS= AC_SEARCH_LIBS([cap_init], [cap], [], [AC_MSG_ERROR([*** POSIX caps library not found])]) CAP_LIBS="$LIBS" AC_SUBST(CAP_LIBS) LIBS="$save_LIBS" # Remember to update AM_CPPFLAGS in Makefile.am when bumping GIO req. PKG_CHECK_MODULES(PKGDEP_GIO_UNIX, [gio-unix-2.0]) PKG_CHECK_MODULES(PKGDEP_RPMOSTREE, [gio-unix-2.0 >= 2.50.0 json-glib-1.0 ostree-1 >= 2018.9 libsystemd polkit-gobject-1 rpm librepo libsolv libarchive]) dnl -ldl: https://github.com/ostreedev/ostree/commit/1f832597fc83fda6cb8daf48c4495a9e1590774c dnl -ldl: https://github.com/rust-lang/rust/issues/47714 dnl -lm: needed for rand crate in debug mode dnl See also rpmostree_core_linkage_for_rust() PKGDEP_RPMOSTREE_LIBS="$PKGDEP_RPMOSTREE_LIBS -Wl,--push-state,--no-as-needed,-ldl,-lm,--pop-state" # We just keep rust-specific deps separate for better tracking # The `libcurl` one is redundant since we already require it for libostree. `openssl` # is required by libcurl anyway, but we need to link to it directly too because # curl-rust uses it. PKG_CHECK_MODULES(PKGDEP_RPMOSTREE_RS, [libcurl openssl]) dnl bundled libdnf PKGDEP_RPMOSTREE_CFLAGS="-I $(pwd)/libdnf -I $(pwd)/libdnf-build $PKGDEP_RPMOSTREE_CFLAGS" PKGDEP_RPMOSTREE_LIBS="-L$(pwd)/libdnf-build/libdnf -ldnf $PKGDEP_RPMOSTREE_LIBS" dnl This is the current version in Fedora 25. AS_IF([pkg-config --atleast-version=4.13.0.1 rpm], [ have_modern_rpm=true AC_DEFINE([BUILDOPT_HAVE_RPMSQ_SET_INTERRUPT_SAFETY], 1, [Set to 1 if we have interrupt safety API]) AC_DEFINE([BUILDOPT_HAVE_RPM_FILETRIGGERS], 1, [Set to 1 if we have file triggers]) AC_DEFINE([BUILDOPT_HAVE_RPMFILES], 1, [Set to 1 if we have rpmfiles API]) ], [have_modern_rpm=false]) dnl See usage AS_IF([pkg-config --atleast-version=4.14.2 rpm], [ AC_DEFINE([BUILDOPT_HAVE_NEW_RPM_VERIFY], 1, [Set to 1 if we have rpmtsSetVfyLevel]) ]) librpm_version="$(pkg-config rpm --modversion)" AC_ARG_ENABLE(dfd_over_dbus, AS_HELP_STRING([--enable-dfd-over-dbus], [Enable passing dfd over D-Bus (default: yes)]),, [enable_dfd_over_dbus=yes]) AS_IF([test x$enable_dfd_over_dbus = xyes], [ AC_DEFINE(HAVE_DFD_OVER_DBUS, 1, [Define if we can pass dfd over D-Bus]) ]) AC_PATH_PROG([XSLTPROC], [xsltproc]) GLIB_TESTS LIBGLNX_CONFIGURE AC_CHECK_TOOL(GPERF, gperf) AS_IF([test -z "$GPERF"], AC_MSG_ERROR([*** gperf not found]) ) dnl stolen from https://github.com/systemd/systemd/commit/c9f7b4d GPERF_TEST="$(echo foo,bar | ${GPERF} -L ANSI-C)" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([ #include const char * in_word_set(const char *, size_t); $GPERF_TEST] )], [GPERF_LEN_TYPE=size_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([ #include const char * in_word_set(const char *, unsigned); $GPERF_TEST] )], [GPERF_LEN_TYPE=unsigned], [AC_MSG_ERROR([** unable to determine gperf len type])] )] ) AC_DEFINE_UNQUOTED([GPERF_LEN_TYPE], [$GPERF_LEN_TYPE], [gperf len type]) m4_ifdef([GOBJECT_INTROSPECTION_CHECK], [ GOBJECT_INTROSPECTION_CHECK([1.34.0]) ]) AM_CONDITIONAL(BUILDOPT_INTROSPECTION, test "x$found_introspection" = xyes) m4_ifdef([GTK_DOC_CHECK], [ GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) ],[ AM_CONDITIONAL([ENABLE_GTK_DOC],[false]) ]) AC_ARG_ENABLE(installed_tests, AS_HELP_STRING([--enable-installed-tests], [Install test programs (default: no)]),, [enable_installed_tests=no]) AM_CONDITIONAL(BUILDOPT_INSTALL_TESTS, test x$enable_installed_tests = xyes) AC_ARG_ENABLE(new-name, AS_HELP_STRING([--enable-new-name], [Install additionally as nts (default: no)]),, [enable_new_name=no]) AM_CONDITIONAL(BUILDOPT_NEW_NAME, test x$enable_new_name = xyes) AC_ARG_WITH(bubblewrap, AS_HELP_STRING([--with-bubblewrap], [Path to bubblewrap binary (default: /usr/bin/bwrap)]),, [with_bubblewrap=/usr/bin/bwrap]) AC_DEFINE_UNQUOTED(WITH_BUBBLEWRAP_PATH, ["$with_bubblewrap"], [Define to bubblewrap path]) dnl Some distributions may want to support the client tooling, but not dnl the server side. AC_ARG_ENABLE(compose-tooling, AS_HELP_STRING([--enable-compose-tooling], [Build compose tooling]),, [enable_compose_tooling=yes]) AM_CONDITIONAL(BUILDOPT_COMPOSE_TOOLING, [test x$enable_compose_tooling = xyes]) AS_IF([test x$enable_compose_tooling = xyes], [ AC_DEFINE(HAVE_COMPOSE_TOOLING, 1, [Define if we are building compose tooling]) ]) if test x$enable_compose_tooling != xno; then RPM_OSTREE_FEATURES="$RPM_OSTREE_FEATURES compose"; fi dnl PKG_CHECK_VAR added to pkg-config 0.28 (though it's already in the new pkgconf; this dnl backport is more for el7) m4_define_default( [PKG_CHECK_VAR], [AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config]) AS_IF([test -z "$$1"], [$1=`$PKG_CONFIG --variable="$3" "$2"`]) AS_IF([test -n "$$1"], [$4], [$5])]) PKG_CHECK_VAR(BASH_COMPLETIONSDIR, [bash-completion], [completionsdir],, BASH_COMPLETIONSDIR="${datadir}/bash-completion/completions") AC_SUBST(BASH_COMPLETIONSDIR) AC_PATH_PROG([cargo], [cargo]) AS_IF([test -z "$cargo"], [AC_MSG_ERROR([cargo is required for --enable-rust])]) AC_PATH_PROG([rustc], [rustc]) AS_IF([test -z "$rustc"], [AC_MSG_ERROR([rustc is required for --enable-rust])]) dnl https://github.com/projectatomic/rpm-ostree/pull/1573 dnl We support 3 modes for bindgen: dnl - External /usr/bin/cbindgen (Fedora + CI) dnl - Downloading it from crates.io (CentOS + CI builds) dnl - Not running it at all, and using a pre-built rpmostree-rust.h (Koji) AS_IF([test -d "${srcdir}"/rust/vendor], [cbindgen=dist], [AC_PATH_PROG([cbindgen], [cbindgen])]) AM_CONDITIONAL(HAVE_PREBUILT_CBINDGEN, [test "${cbindgen}" = "dist"]) AM_CONDITIONAL(HAVE_EXTERNAL_CBINDGEN, [test -n "${cbindgen}" && test "${cbindgen}" != dist]) AC_MSG_CHECKING(whether to build in debug mode) debug_release=release if $(echo $CFLAGS |grep -q -E "(-O0|-Og)"); then debug_release=debug fi AC_MSG_RESULT($debug_release) dnl These bits based on gnome:librsvg/configure.ac dnl By default, we build in release mode (but without LTO!) AC_ARG_ENABLE(rust-debug, AC_HELP_STRING([--enable-rust-debug], [Build Rust code with debugging information [default=no]]), [rust_debug_release=$enableval], [rust_debug_release=$debug_release]) dnl Canonicalize yes/no to debug/release AS_IF([test x$rust_debug_release = xno ], [rust_debug_release=release]) AS_IF([test x$rust_debug_release = xyes ], [rust_debug_release=debug]) RUST_TARGET_SUBDIR=${rust_debug_release} AC_SUBST([RUST_TARGET_SUBDIR]) AM_CONDITIONAL(RUST_DEBUG, [test "x$rust_debug_release" = "xdebug"]) dnl Unconditional now. RPM_OSTREE_FEATURES="$RPM_OSTREE_FEATURES rust" dnl Only use this for package builds, as it will hackily edit Cargo.toml right now AC_ARG_ENABLE(lto, AC_HELP_STRING([--enable-lto], [Build code with Link Time Optimization [default=no]])) dnl https://github.com/rust-lang/cargo/issues/4349 dnl https://bugzilla.mozilla.org/show_bug.cgi?id=1386371 if test "${enable_lto}" = yes; then if ! grep -q '^lto.*=true' rust/Cargo.toml 2>/dev/null; then echo '# Inserted by configure --enable-lto' >> rust/Cargo.toml echo "lto = true" >> rust/Cargo.toml fi fi dnl And propagate the release/debug type to cmake cmake_args=-DCMAKE_BUILD_TYPE=RelWithDebugInfo if test ${debug_release} = debug; then cmake_args="-DCMAKE_BUILD_TYPE=Debug" fi export cmake_args dnl I picked /usr/libexec/rpm-ostree just because we need an dnl arbitrary path - we don't actually install there. dnl Use `WITH_GIR=0`; it's our private libdnf bundle and we don't need the bindings. (set -euo pipefail; mkdir -p libdnf-build && cd libdnf-build && set -x && export CXXFLAGS && cmake \ -DCMAKE_INSTALL_PREFIX:PATH=/usr/libexec/rpm-ostree \ -DINCLUDE_INSTALL_DIR:PATH=/usr/libexec/rpm-ostree/include \ -DLIB_INSTALL_DIR:PATH=/usr/libexec/rpm-ostree \ -DSYSCONF_INSTALL_DIR:PATH=/usr/libexec/rpm-ostree/etc \ -DSHARE_INSTALL_PREFIX:PATH=/usr/libexec/rpm-ostree/share \ -DBUILD_SHARED_LIBS:BOOL=ON \ -DWITH_SWDB:BOOL=0 \ -DWITH_BINDINGS:BOOL=0 \ -DWITH_HTML:BOOL=0 \ -DWITH_MAN:BOOL=0 \ -DWITH_GIR:BOOL=0 \ ${cmake_args} ../libdnf) || exit 1 AC_CONFIG_FILES([ Makefile api-doc/Makefile src/lib/rpm-ostree-1.pc src/lib/rpmostree-version.h ]) AC_OUTPUT echo " $PACKAGE $VERSION built with modern RPM (e.g. Fedora 25+): $have_modern_rpm ($librpm_version) nts name: $enable_new_name compose tooling: $enable_compose_tooling introspection: $found_introspection bubblewrap: $with_bubblewrap gtk-doc: $enable_gtk_doc rust: $rust_debug_release (lto: ${enable_lto:-no}) cbindgen: ${cbindgen:-internal} use dfd over D-Bus: $enable_dfd_over_dbus "