mirror of
https://github.com/nilfs-dev/nilfs-utils.git
synced 2026-01-26 21:52:12 +00:00
Add a mechanism to embed the git revision into the compiled binaries. This allows users and developers to identify the exact source commit used for the build, which aids in debugging and tracking versions. The git revision is obtained using 'git describe' and stored in the .comment ELF section using the new NILFS_UTILS_GITID() macro defined in util.h. This section is not loaded into memory at runtime. The embedded revision can be checked using 'readelf -p .comment <binary>'. This feature is opt-in to ensure deterministic builds for package maintainers. It is enabled only if the environment variable NILFS_UTILS_USE_GITID is set to 1, true, on, or yes when generating the configure script (e.g. by running autoconf or autogen.sh). Also, bump the minimum Autoconf version to 2.64 to utilize m4_esyscmd_s. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
388 lines
12 KiB
Plaintext
388 lines
12 KiB
Plaintext
dnl configure.ac
|
|
dnl
|
|
dnl Copyright (C) 2007-2012 Nippon Telegraph and Telephone Corporation.
|
|
|
|
# -*- Autoconf -*-
|
|
# Process this file with autoconf to produce a configure script.
|
|
|
|
AC_PREREQ(2.64)
|
|
AC_INIT([NILFS utils],[2.4.0-dev],[linux-nilfs@vger.kernel.org])
|
|
AM_INIT_AUTOMAKE
|
|
AC_CONFIG_SRCDIR([config.h.in])
|
|
AC_CONFIG_HEADERS([config.h])
|
|
AC_CONFIG_MACRO_DIR([m4])
|
|
|
|
dnl GIT ID embedding logic
|
|
m4_define([nilfs_utils_git_rev],
|
|
m4_esyscmd_s([case "$NILFS_UTILS_USE_GITID" in 1|[tT]*|[oO]n|[yY]*) \
|
|
git describe --tags --always --dirty 2>/dev/null ;; esac]))
|
|
|
|
dnl Emit to config.h if not empty
|
|
m4_if(nilfs_utils_git_rev, [], [],
|
|
[AC_DEFINE_UNQUOTED([NILFS_UTILS_GIT_REVISION], ["nilfs_utils_git_rev"],
|
|
[Git revision])])
|
|
|
|
# Checks for programs.
|
|
AC_PROG_CC
|
|
AM_PROG_CC_C_O
|
|
AC_PROG_CPP
|
|
AC_PROG_INSTALL
|
|
AC_PROG_LN_S
|
|
AC_PROG_MAKE_SET
|
|
AC_USE_SYSTEM_EXTENSIONS
|
|
LT_PREREQ([2.4])
|
|
LT_INIT([disable-static])
|
|
AC_PATH_PROG([LDCONFIG], [ldconfig],
|
|
[AC_MSG_ERROR([ldconfig not found])],
|
|
[$PATH:/usr/sbin:/sbin])
|
|
|
|
dnl --------------------------------------------------------------------------
|
|
dnl NILFS_UTILS_DEFINE_HAVE_LIB(PREFIX)
|
|
dnl
|
|
dnl Helper macro to define HAVE_LIB<PREFIX> with a standard description.
|
|
dnl Arguments:
|
|
dnl $1 : PREFIX (e.g., UUID) - used to name HAVE_LIB* variable.
|
|
dnl --------------------------------------------------------------------------
|
|
AC_DEFUN([NILFS_UTILS_DEFINE_HAVE_LIB], [
|
|
dnl Generate library name for description (e.g., uuid)
|
|
m4_pushdef([lib_name], m4_tolower([$1]))
|
|
|
|
AC_DEFINE(AS_TR_CPP([HAVE_LIB$1]), 1,
|
|
[Define to 1 if you have the ']lib_name[' library (-l]lib_name[).])
|
|
|
|
m4_popdef([lib_name])
|
|
])
|
|
|
|
dnl --------------------------------------------------------------------------
|
|
dnl NILFS_UTILS_PKG_CHECK(PREFIX, MODULE, FALLBACK_ACTION)
|
|
dnl
|
|
dnl Arguments:
|
|
dnl $1 : PREFIX (e.g., UUID) - Used to name HAVE_LIB* variable, etc.
|
|
dnl $2 : MODULE (e.g., uuid) - pkg-config module name
|
|
dnl $3 : FALLBACK_ACTION - Code to run if pkg-config fails or is missing
|
|
dnl --------------------------------------------------------------------------
|
|
AC_DEFUN([NILFS_UTILS_PKG_CHECK], [
|
|
dnl Generate a temporary variable name (e.g., have_uuid_pkg_config)
|
|
m4_pushdef([have_pkg_var], [have_]m4_tolower([$1])[_pkg_config])
|
|
|
|
have_pkg_var=no
|
|
|
|
dnl Try pkg-config if available
|
|
m4_ifdef([PKG_CHECK_MODULES], [
|
|
PKG_CHECK_MODULES([$1], [$2], [
|
|
have_pkg_var=yes
|
|
NILFS_UTILS_DEFINE_HAVE_LIB([$1])
|
|
], [have_pkg_var=no])
|
|
], [have_pkg_var=no])
|
|
|
|
dnl Fallback if pkg-config failed or was not available
|
|
AS_IF([test "x$have_pkg_var" = "xno"], [
|
|
$3
|
|
])
|
|
|
|
m4_popdef([have_pkg_var])
|
|
])
|
|
|
|
# Check for options.
|
|
AC_ARG_WITH([libmount],
|
|
AS_HELP_STRING([--without-libmount],
|
|
[compile mount.nilfs2 without libmount support]),
|
|
[], with_libmount=yes)
|
|
|
|
AC_ARG_WITH([selinux],
|
|
AS_HELP_STRING([--without-selinux], [compile without SELinux support]),
|
|
[], with_selinux=yes)
|
|
|
|
AC_ARG_WITH([blkid],
|
|
AS_HELP_STRING([--without-blkid], [compile without blkid support]),
|
|
[], with_blkid=yes)
|
|
|
|
AC_ARG_WITH([pkgconfigdir],
|
|
[AS_HELP_STRING([--with-pkgconfigdir[[=DIR]]],
|
|
[directory for pkg-config files (no to disable) [default=auto]])],
|
|
[pkgconfigdir=$withval],
|
|
[pkgconfigdir=auto])
|
|
|
|
AC_ARG_ENABLE([uapi_header_install],
|
|
AS_HELP_STRING([--enable-uapi-header-install],
|
|
[install kernel uapi header files]),
|
|
[enable_uapi_header_install="${enableval}"],
|
|
[enable_uapi_header_install=no])
|
|
|
|
AC_ARG_ENABLE([usrmerge],
|
|
[AS_HELP_STRING([--enable-usrmerge[[=TYPE]]],
|
|
[set UsrMerge hierarchy type (no, sbin, bin, or auto);
|
|
'sbin' (default TYPE) installs to /usr/sbin, 'bin' installs to
|
|
/usr/bin [default=auto, which probes the system configuration]])],
|
|
[enable_usrmerge="${enableval}"],
|
|
[enable_usrmerge=auto])
|
|
|
|
# Checks for the existence of pkg-config itself
|
|
m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG], [PKG_CONFIG=""])
|
|
|
|
AS_IF([test "x$pkgconfigdir" = "xno"], [enable_pkgconfig_output=no],
|
|
[test -n "$PKG_CONFIG"], [enable_pkgconfig_output=yes],
|
|
[test "x$pkgconfigdir" = "xyes"], [
|
|
AC_MSG_ERROR([pkg-config requested but not found])
|
|
], [
|
|
enable_pkgconfig_output=no
|
|
AC_MSG_WARN([pkg-config not found. PC file installation disabled.])
|
|
])
|
|
|
|
# Checks for UsrMerge hierarchy
|
|
AS_IF([test "x$enable_usrmerge" = "xauto"], [
|
|
AS_IF([test /usr/sbin -ef /usr/bin], [enable_usrmerge=bin],
|
|
[test -x /usr/bin/rpm && \
|
|
test "$(rpm --eval '%{_sbindir}')" = /usr/bin],
|
|
[enable_usrmerge=bin],
|
|
[test /usr/sbin/mkfs -ef /usr/bin/mkfs], [enable_usrmerge=bin],
|
|
[test /sbin -ef /usr/sbin], [enable_usrmerge=sbin],
|
|
[enable_usrmerge=no])
|
|
])
|
|
|
|
# Checks for libraries.
|
|
NILFS_UTILS_PKG_CHECK([UUID], [uuid], [
|
|
AC_CHECK_LIB([uuid], [uuid_generate], [
|
|
NILFS_UTILS_DEFINE_HAVE_LIB([UUID])
|
|
AC_SUBST(UUID_LIBS, ["-luuid"])
|
|
AC_SUBST(UUID_CFLAGS, ["-I/usr/include/uuid"])
|
|
], [
|
|
AC_MSG_ERROR([UUID library not found])
|
|
])
|
|
AC_CHECK_HEADERS([uuid/uuid.h])
|
|
])
|
|
|
|
LIB_POSIX_MQ=''
|
|
AC_CHECK_FUNC(mq_open,,
|
|
[AC_CHECK_LIB(rt, mq_open, LIB_POSIX_MQ=-lrt,
|
|
[AC_CHECK_LIB(posix4, mq_open, LIB_POSIX_MQ=-lposix4,
|
|
[AC_MSG_ERROR([posix message queue not found])])])])
|
|
AC_SUBST(LIB_POSIX_MQ)
|
|
|
|
LIB_POSIX_SEM=''
|
|
AC_CHECK_FUNC(sem_open,,
|
|
[AC_CHECK_LIB(rt, sem_open, LIB_POSIX_SEM=-lrt,
|
|
[AC_CHECK_LIB(pthread, sem_open, LIB_POSIX_SEM=-lpthread,
|
|
[AC_CHECK_LIB(posix4, sem_open, LIB_POSIX_SEM=-lposix4,
|
|
[AC_MSG_ERROR([posix semaphore not found])])])])])
|
|
AC_SUBST(LIB_POSIX_SEM)
|
|
|
|
LIB_POSIX_TIMER=''
|
|
AC_CHECK_FUNC(clock_gettime,,
|
|
[AC_CHECK_LIB(rt, clock_gettime, LIB_POSIX_TIMER=-lrt,
|
|
[AC_MSG_ERROR([clock_gettime not found])])])
|
|
AC_SUBST(LIB_POSIX_TIMER)
|
|
|
|
# Checks for header files.
|
|
AC_HEADER_SYS_WAIT
|
|
AC_CHECK_HEADERS([ctype.h err.h fcntl.h grp.h inttypes.h libintl.h limits.h \
|
|
linux/magic.h linux/types.h locale.h mntent.h mqueue.h \
|
|
paths.h poll.h pwd.h semaphore.h \
|
|
stdbool.h stddef.h stdint.h stdlib.h string.h strings.h \
|
|
sys/ioctl.h sys/mman.h sys/mount.h sys/sysmacros.h \
|
|
sys/time.h syslog.h time.h unistd.h])
|
|
|
|
# Check /etc/mtab
|
|
mtab_type=''
|
|
AC_MSG_CHECKING([for /etc/mtab])
|
|
if test -L /etc/mtab; then
|
|
AC_MSG_RESULT([symlink])
|
|
mtab_type=symlink
|
|
elif test -f /etc/mtab; then
|
|
AC_MSG_RESULT([regular file])
|
|
mtab_type=file
|
|
fi
|
|
|
|
# Check program_invocation_short_name and getprogname()
|
|
AC_CHECK_DECLS([program_invocation_short_name], [], [],
|
|
[[#include <errno.h>]])
|
|
|
|
AS_IF([test "x$ac_cv_have_decl_program_invocation_short_name" != "xyes"],
|
|
[AC_CHECK_FUNCS([getprogname])])
|
|
|
|
# Check for conditional libraries and headers.
|
|
AS_IF([test "${with_blkid}" = "yes"], [
|
|
NILFS_UTILS_PKG_CHECK([BLKID], [blkid], [
|
|
AC_CHECK_LIB(blkid, blkid_new_probe_from_filename, [
|
|
NILFS_UTILS_DEFINE_HAVE_LIB([BLKID])
|
|
AC_SUBST(BLKID_LIBS, ["-lblkid"])
|
|
AC_SUBST(BLKID_CFLAGS, ["-I/usr/include/blkid"])
|
|
], [
|
|
AC_MSG_ERROR([BLKID library not found])
|
|
], [$UUID_LIBS]) # Other libraries to link when compiling tests
|
|
|
|
AC_CHECK_HEADERS([blkid/blkid.h])
|
|
])
|
|
])
|
|
|
|
AS_IF([test "${with_libmount}" = "yes"], [
|
|
AS_IF([test "$mtab_type" = file], [
|
|
AC_MSG_WARN(m4_normalize([
|
|
Use --without-libmount option to generate mount helpers that work
|
|
with the legacy mtab file.
|
|
]))
|
|
])
|
|
|
|
NILFS_UTILS_PKG_CHECK([MOUNT], [mount], [
|
|
AC_CHECK_LIB(mount, mnt_context_do_mount, [
|
|
NILFS_UTILS_DEFINE_HAVE_LIB([MOUNT])
|
|
AC_SUBST(MOUNT_LIBS, ["-lmount $BLKID_LIBS"])
|
|
AC_SUBST(MOUNT_CFLAGS, ["-I/usr/include/libmount"])
|
|
], [
|
|
AC_MSG_ERROR([MOUNT library is enabled but libmount not found])
|
|
], [$BLKID_LIBS]) # Other libraries to link when compiling tests
|
|
|
|
AC_CHECK_HEADERS([libmount/libmount.h])
|
|
])
|
|
with_selinux=no
|
|
])
|
|
AM_CONDITIONAL(CONFIG_LIBMOUNT, [test "$with_libmount" = "yes"])
|
|
|
|
AS_IF([test "${with_selinux}" = "yes"], [
|
|
NILFS_UTILS_PKG_CHECK([SELINUX], [libselinux], [
|
|
AC_CHECK_LIB(selinux, getprevcon, [
|
|
NILFS_UTILS_DEFINE_HAVE_LIB([SELINUX])
|
|
AC_SUBST(SELINUX_LIBS, ["-lselinux"])
|
|
AC_SUBST(SELINUX_CFLAGS, [""])
|
|
], [
|
|
AC_MSG_ERROR([SELinux selected but libselinux not found])
|
|
])
|
|
AC_CHECK_HEADERS([selinux/context.h selinux/selinux.h])
|
|
])
|
|
# This function is missing in old libselinux 1.xx versions
|
|
AC_CHECK_FUNCS([security_get_initial_context])
|
|
])
|
|
|
|
AM_CONDITIONAL(CONFIG_UAPI_HEADER_INSTALL,
|
|
[test "$enable_uapi_header_install" = yes])
|
|
|
|
# Checks for typedefs, structures, and compiler characteristics.
|
|
AC_C_CONST
|
|
AC_C_INLINE
|
|
AC_TYPE_MODE_T
|
|
AC_TYPE_OFF_T
|
|
AC_TYPE_PID_T
|
|
AC_TYPE_SIZE_T
|
|
AC_TYPE_SSIZE_T
|
|
AC_STRUCT_TM
|
|
AC_C_VOLATILE
|
|
|
|
# Checks for library functions.
|
|
AC_FUNC_ALLOCA
|
|
AC_FUNC_CHOWN
|
|
AC_FUNC_ERROR_AT_LINE
|
|
AC_FUNC_FORK
|
|
AC_FUNC_LSTAT
|
|
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
|
|
AC_FUNC_MALLOC
|
|
AC_FUNC_MMAP
|
|
AC_FUNC_REALLOC
|
|
AC_FUNC_STAT
|
|
AC_FUNC_STRFTIME
|
|
AC_FUNC_VPRINTF
|
|
AC_CHECK_FUNC(posix_memalign,,
|
|
[AC_MSG_ERROR([cannot find posix_memalign() function])])
|
|
AC_CHECK_FUNCS([alarm atexit ftruncate getcwd getgrgid getmntent_r getpwuid \
|
|
gettimeofday localtime_r memmove memset pread strcasecmp \
|
|
strchr strdup strerror strrchr strsignal strstr strtok_r \
|
|
strtoul strtoull])
|
|
|
|
# Checks for system services
|
|
AC_SYS_LARGEFILE
|
|
|
|
# Install directories
|
|
AC_PREFIX_DEFAULT([/usr])
|
|
test "x$prefix" = "xNONE" && prefix="/usr"
|
|
test "x$exec_prefix" = "xNONE" && exec_prefix="${prefix}"
|
|
|
|
# Determine the location of /sbin binaries based on the --enable-usrmerge
|
|
# option
|
|
AS_CASE(["x$enable_usrmerge"],
|
|
[xbin], [
|
|
core_sbindir='${exec_prefix}/bin'
|
|
sbindir='${exec_prefix}/bin'
|
|
badblocksdir='/usr/bin'
|
|
# If /usr/sbin is effectively /usr/bin,
|
|
# we must not create compat symlinks because they would overwrite
|
|
# the actual binaries installed in /usr/bin.
|
|
AS_IF([test "/usr/sbin" -ef "/usr/bin"],
|
|
[create_compat_sbin_link=no],
|
|
[create_compat_sbin_link=yes])
|
|
],
|
|
[xsbin|xyes], [
|
|
core_sbindir='${exec_prefix}/sbin'
|
|
sbindir='${exec_prefix}/sbin'
|
|
badblocksdir='/usr/sbin'
|
|
create_compat_sbin_link=no
|
|
],
|
|
[
|
|
core_sbindir='/sbin'
|
|
sbindir='${exec_prefix}/sbin'
|
|
badblocksdir='/sbin'
|
|
create_compat_sbin_link=no
|
|
]
|
|
)
|
|
|
|
AC_SUBST([core_sbindir])
|
|
AC_SUBST([sbindir])
|
|
AC_SUBST([badblocksdir])
|
|
|
|
AM_CONDITIONAL([CREATE_COMPAT_SBIN_LINK],
|
|
[test "x$create_compat_sbin_link" = "xyes"])
|
|
|
|
# Automatic detection of library installation directory
|
|
|
|
AS_CASE(["$ac_configure_args"], [*--libdir*], [user_specified_libdir=yes],
|
|
[user_specified_libdir=no])
|
|
|
|
AS_IF([test "x$user_specified_libdir" = "xno" && \
|
|
test "x$libdir" = 'x${exec_prefix}/lib' && \
|
|
test "x$cross_compiling" = "xno"], [
|
|
AC_MSG_CHECKING([for architecture-specific library directory])
|
|
detected_libdir=""
|
|
|
|
AS_IF(
|
|
# 1. Primary: systemd-path (available on most modern distros)
|
|
[command -v systemd-path >/dev/null 2>&1],
|
|
[detected_libdir=$(systemd-path system-library-arch 2>/dev/null)],
|
|
|
|
# 2. Fallback: use rpm --eval for RPM-based systems
|
|
[command -v rpm >/dev/null 2>&1],
|
|
[detected_libdir=$(rpm --eval '%{_libdir}' 2>/dev/null)]
|
|
)
|
|
|
|
AS_IF([test "x$detected_libdir" != "x"], [
|
|
libdir="$detected_libdir"
|
|
AC_MSG_RESULT([$libdir (detected)])
|
|
], [
|
|
AC_MSG_RESULT([$libdir (default)])
|
|
])
|
|
])
|
|
|
|
AC_SUBST([libdir])
|
|
|
|
AC_SUBST([sysconfdir], [/etc])
|
|
AC_SUBST([localstatedir], [/var])
|
|
|
|
AS_IF([test "x$enable_pkgconfig_output" = "xyes"], [
|
|
AS_IF([test "x$pkgconfigdir" = "xyes" || test "x$pkgconfigdir" = "xauto"],
|
|
[pkgconfigdir='${libdir}/pkgconfig'])
|
|
|
|
AC_SUBST([pkgconfigdir])
|
|
AC_CONFIG_FILES([lib/nilfs.pc lib/nilfsgc.pc])
|
|
])
|
|
|
|
AM_CONDITIONAL([INSTALL_PKGCONFIG],
|
|
[test "x$enable_pkgconfig_output" = "xyes"])
|
|
|
|
AC_CONFIG_FILES([Makefile
|
|
bin/Makefile
|
|
etc/Makefile
|
|
include/Makefile
|
|
lib/Makefile
|
|
man/Makefile
|
|
sbin/Makefile
|
|
sbin/mount/Makefile
|
|
scripts/Makefile])
|
|
AC_OUTPUT
|