Files
mars-nwe/cmake/modules/FindQuota.cmake
Mario Fetka 8017c0c078
All checks were successful
Source release / source-package (push) Successful in 47s
Add CMake quota detection and enable quota support by default
Add a FindQuota.cmake module that checks for the Linux quota headers and
symbols required by the MARS NWE quota backend. Prefer modern
<sys/quota.h> with quotactl(), and keep <linux/quota.h> as fallback for
older systems.

Enable quota support by default, but only compile it in when the required
headers and quota symbols are available. Also move the QTAINSYS define to
the detected sys/quota.h path so modern Linux builds use the correct
header automatically.
2026-05-26 09:32:01 +02:00

87 lines
3.2 KiB
CMake

# - Find Linux quota support
#
# This module checks whether the system provides the headers and symbols
# needed by mars_nwe's Linux user quota backend.
#
# It sets:
# QUOTA_FOUND - true if usable quota support was found
# QUOTA_USE_SYS_QUOTA_H - true if <sys/quota.h> should be used
# QUOTA_USE_LINUX_QUOTA_H - true if <linux/quota.h> should be used
# QUOTA_HAVE_Q_SETQUOTA - true if Q_SETQUOTA is available
# QUOTA_HAVE_Q_SETQLIM - true if Q_SETQLIM is available
#
# Modern Linux/glibc systems declare quotactl() in <sys/quota.h>. Prefer
# that header. Older systems may only have <linux/quota.h>, which is kept
# as a fallback for the historical mars_nwe code path.
include(CheckIncludeFile)
include(CheckSymbolExists)
set(QUOTA_FOUND FALSE)
set(QUOTA_USE_SYS_QUOTA_H FALSE)
set(QUOTA_USE_LINUX_QUOTA_H FALSE)
check_include_file("sys/quota.h" QUOTA_HAVE_SYS_QUOTA_H)
check_include_file("linux/quota.h" QUOTA_HAVE_LINUX_QUOTA_H)
if(QUOTA_HAVE_SYS_QUOTA_H)
check_symbol_exists(quotactl "sys/types.h;sys/quota.h" QUOTA_HAVE_QUOTACTL_SYS)
check_symbol_exists(QCMD "sys/types.h;sys/quota.h" QUOTA_HAVE_QCMD_SYS)
check_symbol_exists(Q_GETQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_GETQUOTA_SYS)
check_symbol_exists(USRQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_USRQUOTA_SYS)
check_symbol_exists(Q_SETQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_SETQUOTA_SYS)
check_symbol_exists(Q_SETQLIM "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_SETQLIM_SYS)
if(QUOTA_HAVE_QUOTACTL_SYS AND QUOTA_HAVE_QCMD_SYS AND
QUOTA_HAVE_Q_GETQUOTA_SYS AND QUOTA_HAVE_USRQUOTA_SYS AND
(QUOTA_HAVE_Q_SETQUOTA_SYS OR QUOTA_HAVE_Q_SETQLIM_SYS))
set(QUOTA_FOUND TRUE)
set(QUOTA_USE_SYS_QUOTA_H TRUE)
set(QUOTA_HAVE_Q_SETQUOTA ${QUOTA_HAVE_Q_SETQUOTA_SYS})
set(QUOTA_HAVE_Q_SETQLIM ${QUOTA_HAVE_Q_SETQLIM_SYS})
endif()
endif()
if(NOT QUOTA_FOUND AND QUOTA_HAVE_LINUX_QUOTA_H)
check_symbol_exists(QCMD "linux/quota.h" QUOTA_HAVE_QCMD_LINUX)
check_symbol_exists(Q_GETQUOTA "linux/quota.h" QUOTA_HAVE_Q_GETQUOTA_LINUX)
check_symbol_exists(USRQUOTA "linux/quota.h" QUOTA_HAVE_USRQUOTA_LINUX)
check_symbol_exists(Q_SETQUOTA "linux/quota.h" QUOTA_HAVE_Q_SETQUOTA_LINUX)
check_symbol_exists(Q_SETQLIM "linux/quota.h" QUOTA_HAVE_Q_SETQLIM_LINUX)
if(QUOTA_HAVE_QCMD_LINUX AND QUOTA_HAVE_Q_GETQUOTA_LINUX AND
QUOTA_HAVE_USRQUOTA_LINUX AND
(QUOTA_HAVE_Q_SETQUOTA_LINUX OR QUOTA_HAVE_Q_SETQLIM_LINUX))
set(QUOTA_FOUND TRUE)
set(QUOTA_USE_LINUX_QUOTA_H TRUE)
set(QUOTA_HAVE_Q_SETQUOTA ${QUOTA_HAVE_Q_SETQUOTA_LINUX})
set(QUOTA_HAVE_Q_SETQLIM ${QUOTA_HAVE_Q_SETQLIM_LINUX})
endif()
endif()
if(QUOTA_FOUND)
if(QUOTA_USE_SYS_QUOTA_H)
message(STATUS "Found Quota: sys/quota.h")
else()
message(STATUS "Found Quota: linux/quota.h")
endif()
else()
message(STATUS "Could NOT find Quota")
endif()
mark_as_advanced(
QUOTA_HAVE_SYS_QUOTA_H
QUOTA_HAVE_LINUX_QUOTA_H
QUOTA_HAVE_QUOTACTL_SYS
QUOTA_HAVE_QCMD_SYS
QUOTA_HAVE_Q_GETQUOTA_SYS
QUOTA_HAVE_USRQUOTA_SYS
QUOTA_HAVE_Q_SETQUOTA_SYS
QUOTA_HAVE_Q_SETQLIM_SYS
QUOTA_HAVE_QCMD_LINUX
QUOTA_HAVE_Q_GETQUOTA_LINUX
QUOTA_HAVE_USRQUOTA_LINUX
QUOTA_HAVE_Q_SETQUOTA_LINUX
QUOTA_HAVE_Q_SETQLIM_LINUX
)