d218f27188
We now have bidirectional calling between Rust and C++, but we are generating two static libraries that we then link together with a tiny C++ `main.cxx`. Let's make another huge leap towards oxdiation by having Rust be the entrypoint. This way cargo natively takes care of linking the internal Rust library, and our C++ internals become the library. In other words, we've now fully inverted from "C app with internal Rust library" to "Rust binary with internal C++ library". In order to make this work though we have to finally kill the C unit tests. But mostly everything covered there is either being converted to Rust, or covered elsewhere anyways. Now as the doc comments in `main.rs` say...this is a bit awkward because all the CLI code is still in C++. Porting stuff to use e.g. `structopt` natively would be a bit of a slog. For now, we basically rely on the fact that the Rust-native CLIs are all hidden commands. Update submodule: libdnf
229 lines
7.8 KiB
Plaintext
229 lines
7.8 KiB
Plaintext
AC_PREREQ([2.63])
|
|
dnl
|
|
dnl SEE RELEASE.md FOR INSTRUCTIONS ON HOW TO DO A RELEASE.
|
|
dnl
|
|
m4_define([year_version], [2021])
|
|
m4_define([release_version], [1])
|
|
m4_define([package_version], [year_version.release_version])
|
|
AC_INIT([rpm-ostree], [package_version], [coreos@lists.fedoraproject.org])
|
|
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
|
|
|
|
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 \
|
|
-Werror=empty-body \
|
|
"-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=parenthesis \
|
|
-Werror=undef \
|
|
-Werror=misleading-indentation \
|
|
-Werror=missing-include-dirs \
|
|
-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])
|
|
# librepo libsolv etc. are libdnf dependencies
|
|
PKG_CHECK_MODULES(PKGDEP_RPMOSTREE, [gio-unix-2.0 >= 2.50.0 json-glib-1.0
|
|
ostree-1 >= 2020.7
|
|
libsystemd
|
|
polkit-gobject-1
|
|
rpm librepo libsolv libsolvext sqlite3 gpgme modulemd-2.0 json-c libcurl openssl
|
|
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 RHEL8.1 has old libarchive
|
|
AS_IF([pkg-config --atleast-version=3.3.3 libarchive],
|
|
[AC_DEFINE([HAVE_LIBARCHIVE_ZSTD], 1, [Define if we have libarchive with zstd])])
|
|
|
|
dnl This is the current version in Fedora 25.
|
|
AS_IF([pkg-config --atleast-version=4.14.2 rpm], [], [AC_MSG_ERROR([librpm 4.14.2 required])])
|
|
|
|
dnl We don't *actually* use this ourself, but librepo does, and libdnf gets confused
|
|
dnl if librepo doesn't support it.
|
|
have_zchunk=no
|
|
AS_IF([pkg-config --exists zck],
|
|
[have_zchunk=yes; AC_DEFINE([HAVE_ZCHUNK], 1, [Define if we have zchunk])])
|
|
|
|
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
|
|
GLIB_TESTS
|
|
LIBGLNX_CONFIGURE
|
|
|
|
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(sqlite_rpmdb_default,
|
|
AS_HELP_STRING([--enable-sqlite-rpmdb-default],
|
|
[Default to sqlite rpmdb backend (default: no)]),,
|
|
[enable_sqlite_rpmdb_default=no])
|
|
AM_CONDITIONAL(BUILDOPT_ENABLE_SQLITE_RPMDB_DEFAULT, test x$enable_sqlite_rpmdb_default = xyes)
|
|
|
|
RPM_OSTREE_FEATURES="$RPM_OSTREE_FEATURES compose"
|
|
|
|
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 See comment in install-extra-builddeps.sh
|
|
AM_CONDITIONAL(BUILDOPT_PREBUILT_BINDINGS, [test -f rpmostree-rust-prebuilt.h])
|
|
|
|
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"
|
|
|
|
AC_ARG_ENABLE(rojig,
|
|
AC_HELP_STRING([--enable-rojig],
|
|
[Support for shipping ostree commits via RPMs [default=no]]))
|
|
AM_CONDITIONAL([BUILDOPT_ROJIG], test x$enable_rojig = xyes)
|
|
AM_COND_IF([BUILDOPT_ROJIG], [
|
|
RPM_OSTREE_FEATURES="$RPM_OSTREE_FEATURES rojig"
|
|
AC_DEFINE([BUILDOPT_ROJIG], 1, [Define if rojig is enabled])
|
|
])
|
|
|
|
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
|
|
if test x${have_zchunk} = xno; then
|
|
cmake_args="${cmake_args} -DWITH_ZCHUNK:BOOL=0"
|
|
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.
|
|
dnl -fPIE for hardening
|
|
(set -euo pipefail; mkdir -p libdnf-build && cd libdnf-build &&
|
|
set -x &&
|
|
export CXXFLAGS="-fPIE $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 \
|
|
-DENABLE_STATIC:BOOL=1 \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=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
|
|
|
|
introspection: $found_introspection
|
|
rojig: ${enable_rojig:-no}
|
|
gtk-doc: $enable_gtk_doc
|
|
rust: $rust_debug_release
|
|
cbindgen: ${cbindgen:-external}
|
|
sqlite rpmdb default: ${enable_sqlite_rpmdb_default}
|
|
"
|