mirror of
https://github.com/anope/anope.git
synced 2026-06-12 17:04:47 +02:00
aef1925b1d
Unfortunately we need to move our escape character from 0x1A to 0x1B because newer versions of gettext treat the former as an EOF character.
295 lines
11 KiB
CMake
295 lines
11 KiB
CMake
# This usage of CMake requires at least version 3.20
|
|
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
|
|
|
|
# Set the project as C++ primarily
|
|
project(Anope CXX)
|
|
|
|
# Force the locale to C for later uses of things like gcc so the messages come up in English, not the user's default language
|
|
set(ENV{LC_ALL} C)
|
|
|
|
# We require C++17 to build
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# Put modules in their own folder
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "")
|
|
message(STATUS "CMAKE_BUILD_TYPE has not been specified; defaulting to Debug")
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
endif()
|
|
|
|
# Include the checking functions used later in this CMakeLists.txt
|
|
include(CheckFunctionExists)
|
|
include(CheckTypeSize)
|
|
include(CheckLibraryExists)
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
if(NOT WIN32)
|
|
include(FindPkgConfig)
|
|
endif()
|
|
|
|
# If extra include directories were specified, tell cmake about them.
|
|
if(EXTRA_INCLUDE)
|
|
include_directories(${EXTRA_INCLUDE})
|
|
endif()
|
|
|
|
# If extra library directories were specified, tell cmake about them.
|
|
if(EXTRA_LIBS)
|
|
link_directories(${EXTRA_LIBS})
|
|
endif()
|
|
|
|
# Find gettext
|
|
find_package(Gettext)
|
|
find_package(Intl)
|
|
if(GETTEXT_FOUND AND Intl_FOUND)
|
|
set(HAVE_LOCALIZATION ON)
|
|
include_directories(${Intl_INCLUDE_DIRS})
|
|
link_libraries(${Intl_LIBRARIES})
|
|
else()
|
|
message("Unable to find gettext and libintl; disabling localization")
|
|
set(HAVE_LOCALIZATION OFF)
|
|
endif()
|
|
|
|
# Use the following directories as includes
|
|
include_directories(
|
|
${Anope_BINARY_DIR}/include
|
|
${Anope_SOURCE_DIR}/include
|
|
${Anope_SOURCE_DIR}/vendor
|
|
)
|
|
|
|
if(WIN32)
|
|
# If using Windows, include the windows specific folder for anope_windows.h
|
|
include_directories(${Anope_SOURCE_DIR}/src/win32)
|
|
endif()
|
|
|
|
# If using Visual Studio, set the C++ flags accordingly
|
|
if(MSVC)
|
|
# Set the compile flags to have warnings on the max setting (but disable a few annoying ones), exception handling turned on
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /wd4100 /wd4127 /wd4250 /wd4251 /wd4267 /wd4275 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
|
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
# Otherwise, we're not using Visual Studio
|
|
else()
|
|
# Set the compile flags to have all warnings on (including shadowed variables)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -Wformat=2 -Wmissing-format-attribute -Wpedantic")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format-nonliteral -Wno-format-y2k -Wno-format-zero-length -Wno-date-time -Wno-unused-parameter")
|
|
endif()
|
|
|
|
# If CMake has found that the given system requires a special library for dl* calls, include it with the linker flags
|
|
if(CMAKE_DL_LIBS)
|
|
link_libraries(${CMAKE_DL_LIBS})
|
|
endif()
|
|
|
|
# Find the linker flags required for using threads.
|
|
find_package("Threads" REQUIRED)
|
|
if(CMAKE_THREAD_LIBS_INIT)
|
|
link_libraries(${CMAKE_THREAD_LIBS_INIT})
|
|
endif()
|
|
|
|
# On Windows, also link Anope to the memory library and Winsock.
|
|
if(WIN32)
|
|
link_libraries("Ws2_32")
|
|
if(MSVC)
|
|
link_libraries("win32_memory")
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT PROGRAM_NAME)
|
|
set(PROGRAM_NAME anope)
|
|
endif()
|
|
|
|
# If we are not using Visual Studio, we'll run the following checks
|
|
if(NOT MSVC)
|
|
# Check if the C++ compiler can accept the -pipe flag, and add it to the compile flags if it works
|
|
check_cxx_compiler_flag(-pipe HAVE_PIPE_FLAG)
|
|
# If the flag was accepted, add it to the list of flags
|
|
if(HAVE_PIPE_FLAG)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe")
|
|
endif()
|
|
endif()
|
|
|
|
# If DEFUMASK wasn't passed to CMake, set a default depending on if RUNGROUP was passed in or not
|
|
if(NOT DEFUMASK)
|
|
if(RUNGROUP)
|
|
set(DEFUMASK "007")
|
|
else()
|
|
set(DEFUMASK "077")
|
|
endif()
|
|
endif()
|
|
|
|
# Set the DEBUG_BUILD for sysconf.h
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
set(DEBUG_BUILD TRUE)
|
|
endif()
|
|
|
|
# Check for the existence of the following functions
|
|
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
|
|
check_function_exists(umask HAVE_UMASK)
|
|
check_function_exists(epoll_wait HAVE_EPOLL)
|
|
check_function_exists(poll HAVE_POLL)
|
|
check_function_exists(kqueue HAVE_KQUEUE)
|
|
|
|
# Search for the following programs
|
|
if(NOT WIN32 AND RUNGROUP)
|
|
find_program(CHGRP "chgrp" REQUIRED)
|
|
find_program(CHMOD "chmod" REQUIRED)
|
|
endif()
|
|
|
|
# If a INSTDIR was passed in to CMake, use it as the install prefix, otherwise set the default install prefix to the anope directory under the user's home directory
|
|
if(INSTDIR)
|
|
set(CMAKE_INSTALL_PREFIX "${INSTDIR}")
|
|
elseif(NOT CMAKE_INSTALL_PREFIX)
|
|
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/anope-${VERSION_MAJOR}-${VERSION_MINOR}")
|
|
endif()
|
|
|
|
# Set default paths for various directories if not already defined
|
|
if(NOT BIN_DIR)
|
|
set(BIN_DIR "bin")
|
|
endif()
|
|
if(NOT DATA_DIR)
|
|
set(DATA_DIR "data")
|
|
endif()
|
|
if(NOT DOC_DIR)
|
|
set(DOC_DIR "doc")
|
|
endif()
|
|
if(NOT CONF_DIR)
|
|
set(CONF_DIR "conf")
|
|
endif()
|
|
if(NOT MODULE_DIR)
|
|
set(MODULE_DIR "modules")
|
|
endif()
|
|
if(NOT LOCALE_DIR)
|
|
set(LOCALE_DIR "locale")
|
|
endif()
|
|
if(NOT LOG_DIR)
|
|
set(LOG_DIR "logs")
|
|
endif()
|
|
|
|
# Version number processing
|
|
# Find all lines in src/version.sh that start with VERSION_
|
|
file(STRINGS ${Anope_SOURCE_DIR}/src/version.sh VERSIONS REGEX "^VERSION_")
|
|
# Iterate through the strings found
|
|
foreach(VERSION_STR ${VERSIONS})
|
|
string(REGEX REPLACE "^VERSION_([A-Z]+)=\"?([^\"]*)\"?$" "\\1;\\2" VERSION_OUT ${VERSION_STR})
|
|
list(LENGTH VERSION_OUT VERSION_LEN)
|
|
list(GET VERSION_OUT 0 VERSION_TYPE)
|
|
if(${VERSION_LEN} GREATER 1)
|
|
list(GET VERSION_OUT 1 VERSION_DATA)
|
|
set(VERSION_${VERSION_TYPE} ${VERSION_DATA})
|
|
endif()
|
|
endforeach()
|
|
|
|
# Default build version to 0
|
|
set(VERSION_BUILD 0)
|
|
|
|
# Only change the build number if version.h exists
|
|
if(EXISTS "${Anope_SOURCE_DIR}/include/version.h")
|
|
# Attempt to read the build number from include/version.h
|
|
file(STRINGS ${Anope_SOURCE_DIR}/src/version.sh VERSIONS REGEX "^#define VERSION_BUILD")
|
|
foreach(VERSION_STR ${VERSIONS})
|
|
# Get the length of the string
|
|
string(LENGTH ${VERSION_STR} VERSION_LEN)
|
|
# Subtract 22 from the string's length
|
|
math(EXPR VERSION_NUM_LEN "${VERSION_LEN} - 22")
|
|
# Extract the value from the string
|
|
string(SUBSTRING ${VERSION_STR} 22 ${VERSION_NUM_LEN} VERSION)
|
|
# Set VERSION_BUILD correctly
|
|
set(VERSION_BUILD ${VERSION})
|
|
endforeach()
|
|
endif()
|
|
|
|
# Set the version variables based on what was found above
|
|
set(VERSION_COMMA "${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_BUILD}")
|
|
set(VERSION_DOTTED_NOBUILD "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
|
set(VERSION_DOTTED "${VERSION_DOTTED_NOBUILD}.${VERSION_BUILD}")
|
|
set(VERSION_FULL "${VERSION_DOTTED}${VERSION_EXTRA}")
|
|
set(VERSION_FULL_NOBUILD "${VERSION_DOTTED_NOBUILD}${VERSION_EXTRA}")
|
|
|
|
# Only do the following for Windows
|
|
if(WIN32)
|
|
# Generate the win32.rc file using the above variables
|
|
configure_file(${Anope_SOURCE_DIR}/src/win32/win32.rc.cmake ${Anope_BINARY_DIR}/src/win32/win32.rc)
|
|
endif()
|
|
|
|
# Get the filename of the Anope binary, to use later
|
|
set(SERVICES_BINARY "$<TARGET_FILE:${PROGRAM_NAME}>")
|
|
cmake_path(GET SERVICES_BINARY FILENAME SERVICES_BINARY)
|
|
|
|
# At install time, create the following additional directories
|
|
file(REAL_PATH ${DATA_DIR} ABSOLUTE_DATA_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
|
file(REAL_PATH ${LOG_DIR} ABSOLUTE_LOG_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
|
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
|
|
if(WIN32)
|
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/runtime\")")
|
|
endif()
|
|
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
|
|
if(NOT WIN32 AND RUNGROUP)
|
|
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
|
|
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
|
|
install(CODE "execute_process(COMMAND ${CHGRP} -R ${RUNGROUP} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")")
|
|
endif()
|
|
# On Windows platforms, install extra files
|
|
if(WIN32)
|
|
install(FILES ${Anope_SOURCE_DIR}/src/win32/anope.bat
|
|
DESTINATION ${BIN_DIR}
|
|
)
|
|
endif()
|
|
|
|
file(REAL_PATH ${MODULE_DIR} ABSOLUTE_MODULE_DIR BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
|
|
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${ABSOLUTE_MODULE_DIR}\")")
|
|
|
|
# Only process the CPack section if we have CPack
|
|
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
|
# Various options for CPack
|
|
set(CPACK_PACKAGE_NAME "Anope IRC Services")
|
|
set(CPACK_PACKAGE_VENDOR "Anope Team")
|
|
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
|
|
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
|
|
set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}${VERSION_EXTRA}")
|
|
set(CPACK_PACKAGE_FILE_NAME "anope-${VERSION_FULL_NOBUILD}")
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${Anope_SOURCE_DIR}/docs/LICENSE.txt")
|
|
# The following doesn't actually do anything. :(
|
|
#set(CPACK_RESOURCE_FILE_README "${Anope_SOURCE_DIR}/docs/README")
|
|
# The following is primarily for NSIS
|
|
if(WIN32)
|
|
# By default, do not warn when built on machines using only VS Express:
|
|
IF(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
|
|
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
|
ENDIF(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
|
|
# Also for Windows, include installing the MSVCRT library
|
|
include(InstallRequiredSystemLibraries)
|
|
set(CPACK_GENERATOR "NSIS")
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Anope")
|
|
set(CPACK_PACKAGE_EXECUTABLES "")
|
|
set(CPACK_NSIS_MENU_LINKS
|
|
"bin\\\\${SERVICES_BINARY}" "Anope IRC Services"
|
|
"bin\\\\anope.bat\\\" \\\"-debug -nofork" "Anope IRC Services (Debug and Window Logging)"
|
|
"bin\\\\anope.bat\\\" \\\"-nofork" "Anope IRC Services (Window Logging)"
|
|
"bin\\\\anope.bat\\\" \\\"-nothird" "Anope IRC Services (No Third Party Modules)"
|
|
"https://www.anope.org/" "Anope Web Site"
|
|
)
|
|
# The following doesn't work, but a bug report has been filed about it
|
|
#set(CPACK_CREATE_DESKTOP_LINK_${SERVICES_BINARY} TRUE)
|
|
set(CPACK_NSIS_MUI_ICON "${Anope_SOURCE_DIR}/src\\\\win32\\\\anope-icon.ico")
|
|
set(CPACK_NSIS_MUI_UNIICON "${Anope_SOURCE_DIR}/src\\\\win32\\\\anope-icon.ico")
|
|
set(CPACK_NSIS_INSTALLED_ICON_NAME "${SERVICES_BINARY}")
|
|
set(CPACK_NSIS_URL_INFO_ABOUT "https://www.anope.org/")
|
|
set(CPACK_NSIS_COMPRESSOR "/SOLID lzma")
|
|
endif()
|
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "anope-${VERSION_FULL_NOBUILD}-source")
|
|
set(CPACK_SOURCE_GENERATOR "TGZ")
|
|
set(CPACK_MONOLITHIC_INSTALL TRUE)
|
|
include(CPack)
|
|
endif()
|
|
|
|
# Go into the following directories and run their CMakeLists.txt as well
|
|
add_subdirectory(data)
|
|
add_subdirectory(docs)
|
|
add_subdirectory(language)
|
|
add_subdirectory(src)
|
|
add_subdirectory(modules)
|
|
add_subdirectory(include)
|