# Copyright (C) 2006-2022 Brice Arnould.
#
# This file is part of ShaKe.
#
# ShaKe is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
#### MACROS AND WORKAROUNDS ####
CMAKE_MINIMUM_REQUIRED (VERSION 3.14) # Released on 2020-10-02
set (CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
MACRO (add_help2man_manpage file command)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${file}
COMMAND ${HELP2MAN_LOCATION} ARGS -s8 -N -i ${CMAKE_CURRENT_SOURCE_DIR}/doc/fdl-man_insert -I ${CMAKE_CURRENT_SOURCE_DIR}/doc/${command}-man_insert -o ${CMAKE_CURRENT_BINARY_DIR}/${file} $
DEPENDS ${command}
COMMENT "Building manpage for ${command}")
ENDMACRO ()
#### PROJECT CONFIG ####
project (Shake C)
set (CPACK_VERSION_MAJOR "1")
set (CPACK_VERSION_MINOR "0")
set (CPACK_PACKAGE_CONTACT "Brice Arnould ")
set (VERSION "${CPACK_VERSION_MAJOR}.${CPACK_VERSION_MINOR}")
#### System checks ####
find_program (HELP2MAN_LOCATION help2man)
IF (NOT HELP2MAN_LOCATION)
message (SEND_ERROR "Cannot find help2man. Please install it.")
ENDIF ()
#### Targets ####
add_executable (shake executive.c judge.c linux.c main.c msg.c signals.c)
add_executable (unattr executive.c linux.c signals.c unattr.c)
add_help2man_manpage (shake.8 shake)
add_help2man_manpage (unattr.8 unattr)
add_custom_target (doc ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/shake.8
${CMAKE_CURRENT_BINARY_DIR}/unattr.8)
#### Platform Specific ####
## LINUX ##
IF (CMAKE_SYSTEM_NAME MATCHES Linux)
add_definitions (-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) # For 64 bits files
add_definitions (-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112L) # For posix_fallocate
list (APPEND CMAKE_REQUIRED_LIBRARIES attr)
target_link_libraries (shake attr)
target_link_libraries (unattr attr)
ELSE ()
message ("For now, shake has only been tested under GNU/Linux.")
ENDIF ()
## GCC ##
IF (CMAKE_COMPILER_IS_GNUCC)
set (CMAKE_C_FLAGS "$ENV{CFLAGS} -std=gnu99 -O2 -Wall -Wextra -Wcast-align -Wpointer-arith -Wbad-function-cast -Wno-sign-compare")
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -O0 -ggdb3 -pedantic -Wconversion -Werror -DDEBUG=1")
ENDIF ()
## ALL ##
INCLUDE (CheckIncludeFiles)
INCLUDE (CheckFunctionExists)
check_function_exists (attr_setf HAVE_LIBATTR)
check_function_exists (fallocate HAVE_FALLOCATE)
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake
${CMAKE_CURRENT_BINARY_DIR}/config.h
ESCAPE_QUOTES)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
## SANITY CHECK ##
IF (NOT HAVE_LIBATTR)
message (SEND_ERROR "You need libattr headers for Shake to build. They might be in a package named libattr1-dev or libattr-devel.")
ENDIF()
#### Installation ####
install (TARGETS shake unattr
DESTINATION bin)
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/shake.8 ${CMAKE_CURRENT_BINARY_DIR}/unattr.8
DESTINATION share/man/man8)
## Packages ##
set (CPACK_PACKAGE_VERSION_MAJOR ${CPACK_VERSION_MAJOR})
set (CPACK_PACKAGE_VERSION_MINOR ${CPACK_VERSION_MINOR})
set (CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/GPL.txt)
set (CPACK_GENERATOR "STGZ;TGZ;TZ")
INCLUDE(CPack)