nilfs-utils/configure.ac
Ryusuke Konishi 67c58a898d build: add portable getprogname() support
Add a compatibility layer for getprogname() to allow utilities to
retrieve the short program name uniformly, removing the need for
manual argv[0] parsing.

The logic prioritizes the GNU extension variable
'program_invocation_short_name', falling back to getprogname.

If neither is available, the build fails with an #error.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
2026-01-19 23:04:37 +09:00

372 lines
11 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.60)
AC_INIT([NILFS utils],[2.3.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])
# 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 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'
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