# #
###############################################################################
-AC_PREREQ([2.64])
+AC_PREREQ([2.69])
AC_INIT([pakfire],
- [0.9.27],
+ [0.9.29],
[info@ipfire.org],
[pakfire],
- [http://git.ipfire.org/?p=pakfire.git;a=summary])
+ [https://git.ipfire.org/?p=pakfire.git;a=summary])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
IT_PROG_INTLTOOL([0.40.0])
+XGETTEXT="${XGETTEXT} --keyword=_:1,2 --keyword=N_:1,2 --no-location"
+
GETTEXT_PACKAGE=pakfire
AC_SUBST(GETTEXT_PACKAGE)
AC_PROG_MKDIR_P
AC_PROG_SED
+AC_ARG_ENABLE([debug],
+ AS_HELP_STRING([--enable-debug], [enable debug messages @<:@default=disabled@:>@]),
+ [], [enable_debug=no])
+AS_IF([test "x$enable_debug" = "xyes"], [
+ AC_DEFINE(ENABLE_DEBUG, [1], [Debug messages.])
+])
+
+# Online Tests
+AC_ARG_ENABLE([online-tests],
+ AS_HELP_STRING(
+ [--enable-online-tests],
+ [enable tests that require internet access @<:@default=disabled@:>@]
+ ), [], [enable_online_tests=no]
+)
+AS_IF([test "x$enable_online_tests" = "xyes"], [
+ AC_DEFINE(ENABLE_ONLINE_TESTS, [1], [Online Tests])
+])
+
+# Man Pages
+
+have_man_pages=no
+AC_ARG_ENABLE(man_pages, AS_HELP_STRING([--disable-man-pages],
+ [do not install man pages]))
+AS_IF([test "x$enable_man_pages" != xno], [have_man_pages=yes])
+AM_CONDITIONAL(ENABLE_MAN_PAGES, [test "x$have_man_pages" = "xyes"])
+
+AC_PATH_PROG([XSLTPROC], [xsltproc])
+
+AC_CHECK_PROGS(ASCIIDOC, [asciidoc])
+if test "${have_man_pages}" = "yes" && test -z "${ASCIIDOC}"; then
+ AC_MSG_ERROR([Required program 'asciidoc' not found])
+fi
+
# pkg-config
PKG_PROG_PKG_CONFIG
# This makes sure pkg.m4 is available.
# C Compiler
AC_PROG_CC
-AC_PROG_CC_C99
-AC_PROG_CC_C_O
-AC_PROG_GCC_TRADITIONAL
-AC_OPENMP
CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
- -pipe \
+ -std=gnu11 \
-Wall \
-Wextra \
- -Wno-inline \
- -Wundef \
- "-Wformat=2 -Wformat-security -Wformat-nonliteral" \
+ -Warray-bounds=2 \
+ -Wdate-time \
+ -Wendif-labels \
+ -Werror=format=2 \
+ -Werror=format-signedness \
+ -Werror=implicit-function-declaration \
+ -Werror=implicit-int \
+ -Werror=incompatible-pointer-types \
+ -Werror=int-conversion \
+ -Werror=missing-declarations \
+ -Werror=missing-prototypes \
+ -Werror=overflow \
+ -Werror=override-init \
+ -Werror=return-type \
+ -Werror=shift-count-overflow \
+ -Werror=shift-overflow=2 \
+ -Werror=strict-flex-arrays \
+ -Werror=undef \
+ -Wfloat-equal \
+ -Wimplicit-fallthrough=5 \
+ -Winit-self \
+ -Wlogical-op \
+ -Wmissing-include-dirs \
+ -Wmissing-noreturn \
+ -Wnested-externs \
+ -Wold-style-definition \
+ -Wpointer-arith \
+ -Wredundant-decls \
+ -Wshadow \
+ -Wstrict-aliasing=2 \
+ -Wstrict-prototypes \
+ -Wsuggest-attribute=noreturn \
+ -Wunused-function \
+ -Wwrite-strings \
+ -Wzero-length-bounds \
-Wno-unused-parameter \
- -Wno-unused-result \
- -fno-strict-aliasing \
- -ffunction-sections \
- -fdata-sections \
- -fstack-protector-all \
- --param=ssp-buffer-size=4])
-AC_SUBST([OUR_CFLAGS], $with_cflags)
+ -Wno-missing-field-initializers \
+ -fdiagnostics-show-option \
+ -fno-common \
+])
-AS_CASE([$CFLAGS], [*-O[[12345g\ ]]*],
- [CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
- -Wp,-D_FORTIFY_SOURCE=2])],
- [AC_MSG_RESULT([skipping -D_FORTIFY_SOURCE, optimization not enabled])])
-AC_SUBST([OUR_CPPFLAGS], $with_cppflags)
+# Enable -fanalyzer if requested
+AC_ARG_ENABLE([analyzer],
+ AS_HELP_STRING([--enable-analyzer], [enable static analyzer (-fanalyzer) @<:@default=disabled@:>@]),
+ [], [enable_analyzer=no])
+AS_IF([test "x$enable_analyzer" = "xyes"],
+ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [-fanalyzer])
+)
-CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
- -Wl,--as-needed \
- -Wl,--no-undefined \
- -Wl,--gc-sections \
- -Wl,-z,relro \
- -Wl,-z,now])
+# Enable -fno-semantic-interposition (if available)
+CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [-fno-semantic-interposition])
+CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [-fno-semantic-interposition])
+
+AC_SUBST([OUR_CPPFLAGS], $with_cppflags)
+AC_SUBST([OUR_CFLAGS], $with_cflags)
AC_SUBST([OUR_LDFLAGS], $with_ldflags)
-# Python
-AM_PATH_PYTHON([2.7])
+# C Types
+AC_TYPE_INT64_T
+AC_TYPE_INTMAX_T
+AC_TYPE_INTPTR_T
+AC_TYPE_MODE_T
+AC_TYPE_OFF_T
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_UID_T
+AC_TYPE_UINT64_T
-save_LIBS="$LIBS"
+# Bison
+AC_PROG_YACC
-# beecrypt
-LIBS=
-AC_SEARCH_LIBS([hashFunctionContextInit], [beecrypt], [], [AC_MSG_ERROR([*** beecrypt library not found])])
-BEECRYPT_LIBS="$LIBS"
-AC_SUBST(BEECRYPT_LIBS)
-
-# libdl
-LIBS=
-AC_SEARCH_LIBS([dlsym], [dl], [], [AC_MSG_ERROR([*** Dynamic linking loader library not found])])
-DL_LIBS="$LIBS"
-AC_SUBST(DL_LIBS)
-
-# libcap
-AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])])
-
-LIBS=
-AC_SEARCH_LIBS([cap_init], [cap], [], [AC_MSG_ERROR([*** POSIX caps library not found])])
-CAP_LIBS="$LIBS"
-AC_SUBST(CAP_LIBS)
-
-# libelf
-AC_CHECK_HEADERS([libelf.h gelf.h], [], [AC_MSG_ERROR([*** libelf headers not found])])
-
-LIBS=
-AC_SEARCH_LIBS([gelf_getvernaux], [elf], [], [AC_MSG_ERROR([*** libelf library not found])])
-ELF_LIBS="$LIBS"
-AC_SUBST(ELF_LIBS)
-
-# libpopt
-AC_CHECK_HEADERS([popt.h], [], [AC_MSG_ERROR([*** libpopt headers not found])])
-
-LIBS=
-AC_SEARCH_LIBS([poptGetContext], [popt], [], [AC_MSG_ERROR([*** libpopt library not found])])
-POPT_LIBS="$LIBS"
-AC_SUBST(POPT_LIBS)
-
-# libsolv
-AC_CHECK_HEADERS([solv/solvversion.h], [], [AC_MSG_ERROR([*** libsolv headers not found])])
-
-LIBS=
-AC_SEARCH_LIBS([solver_create], [solv], [], [AC_MSG_ERROR([*** libsolv library not found])])
-SOLV_LIBS="$LIBS"
-AC_SUBST(SOLV_LIBS)
-LIBS="$save_LIBS"
+if test -z "${ac_cv_prog_YACC}"; then
+ echo "*** Error: No suitable bison/yacc found. ***"
+ echo " Please install the 'bison' package."
+ exit 1
+fi
+
+# Flex
+AM_PROG_LEX
-PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])
+if test -z "${ac_cv_prog_LEX}"; then
+ echo "*** Error: No suitable flex/lex found. ***"
+ echo " Please install the 'flex' package."
+ exit 1
+fi
+
+AC_C_CONST
+AC_CHECK_LIB([m], [round])
+
+AC_CHECK_HEADERS([ \
+ ctype.h \
+ dirent.h \
+ errno.h \
+ fcntl.h \
+ fnmatch.h \
+ fts.h \
+ ftw.h \
+ glob.h \
+ grp.h \
+ libgen.h \
+ libintl.h \
+ linux/bpf.h \
+ linux/capability.h \
+ linux/limits.h \
+ linux/magic.h \
+ linux/sched.h \
+ math.h \
+ pwd.h \
+ regex.h \
+ sched.h \
+ signal.h \
+ stdarg.h \
+ stdint.h \
+ stdio.h \
+ stdlib.h \
+ string.h \
+ syslog.h \
+ sys/capability.h \
+ sys/epoll.h \
+ sys/file.h \
+ sys/ioctl.h \
+ sys/mount.h \
+ sys/personality.h \
+ sys/prctl.h \
+ sys/random.h \
+ sys/resource.h \
+ sys/sendfile.h \
+ sys/stat.h \
+ sys/sysmacros.h \
+ sys/types.h \
+ sys/user.h \
+ sys/utsname.h \
+ sys/vfs.h \
+ sys/wait.h \
+ time.h \
+ unistd.h \
+ utime.h
+])
+
+AC_CHECK_FUNCS([ \
+ asprintf \
+ bpf \
+ epoll_ctl \
+ epoll_create1 \
+ epoll_wait \
+ flock \
+ fnctl \
+ getpid \
+ glob \
+ nftw \
+ openlog \
+ personality \
+ prctl \
+ remove \
+ secure_getenv \
+ sendfile \
+ snprintf \
+ strcmp \
+ strdup \
+ syslog \
+ qsort \
+ uname \
+ unlink \
+ vasprintf \
+ vsnprintf
+])
+
+# Python Stuff
+AM_PATH_PYTHON([3.6])
+
+AX_PYTHON_MODULE([kerberos], [fatal])
+AX_PYTHON_MODULE([setproctitle], [fatal])
+AX_PYTHON_MODULE([systemd], [fatal])
+AX_PYTHON_MODULE([tornado], [fatal])
+
+# Libraries we depend on
+PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.4.0])
+PKG_CHECK_MODULES([BPF], [libbpf])
+PKG_CHECK_MODULES([CAP], [libcap])
+PKG_CHECK_MODULES([CURL], [libcurl])
+PKG_CHECK_MODULES([ELF], [libelf])
+PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}-embed],
+ [], [PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])])
+PKG_CHECK_MODULES([JSON_C], [json-c >= 0.15])
+PKG_CHECK_MODULES([KRB5], [krb5])
PKG_CHECK_MODULES([LZMA], [liblzma])
+PKG_CHECK_MODULES([MAGIC], [libmagic])
+PKG_CHECK_MODULES([MOUNT], [mount])
+PKG_CHECK_MODULES([NL3], [libnl-3.0])
+PKG_CHECK_MODULES([NL3_ROUTE], [libnl-route-3.0])
+PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.1.1])
+PKG_CHECK_MODULES([PCRE2], [libpcre2-8])
+PKG_CHECK_MODULES([SECCOMP], [libseccomp])
+PKG_CHECK_MODULES([SOLV], [libsolv >= 0.7.5])
+PKG_CHECK_MODULES([SQLITE3], [sqlite3])
+PKG_CHECK_MODULES([SYSTEMD], [libsystemd],
+ [AC_DEFINE([HAVE_SYSTEMD], [1], [Use systemd])])
+PKG_CHECK_MODULES([UUID], [uuid])
+PKG_CHECK_MODULES([ZSTD], [libzstd])
+
+save_LIBS="$LIBS"
+
+# subid
+#LIBS=
+#AC_SEARCH_LIBS([subid_init], [subid],
+# [AC_DEFINE([HAVE_SUBID], [], [subid is present])],
+# [AC_MSG_WARN([*** subid library not found])])
+#SUBID_LIBS="$LIBS"
+#AC_SUBST(SUBID_LIBS)
+
+LIBS="$save_LIBS"
AC_ARG_WITH([systemdsystemunitdir],
AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir"])
+AC_DEFINE_UNQUOTED([PAKFIRE_CONFIG_DIR], ["${sysconfdir}/${PACKAGE_NAME}"],
+ [The path where Pakfire stores configuration files])
+AC_DEFINE_UNQUOTED([PAKFIRE_CACHE_DIR], ["/var/cache/${PACKAGE_NAME}"],
+ [The path where Pakfire caches downloaded data])
+AC_DEFINE_UNQUOTED([PAKFIRE_PRIVATE_DIR], ["/var/lib/${PACKAGE_NAME}"],
+ [The path where Pakfire stores its private data])
+AC_DEFINE_UNQUOTED([PAKFIRE_SCRIPTS_DIR], ["${PREFIX}/lib/${PACKAGE_NAME}"],
+ [The path where Pakfire stores its scripts])
+AC_DEFINE_UNQUOTED([PAKFIRE_TMP_DIR], ["/var/tmp"],
+ [The path where Pakfire stores temporary data])
+
AC_CONFIG_FILES([
Makefile
po/Makefile.in
AC_MSG_RESULT([
$PACKAGE_NAME $VERSION
- CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
+ Debug: ${enable_debug}
+ Online Tests: ${enable_online_tests}
+
CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
+ CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
PYTHON_CFLAGS: ${PYTHON_DEVEL_CFLAGS}
PYTHON_LIBS: ${PYTHON_DEVEL_LIBS}