blob: cf6415be518b6abafd37fdae2056b11a5cfb1129 [file] [log] [blame]
# Copyright 2020 The casbin Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
cmake_minimum_required(VERSION 3.19)
set(CMAKE_WARN_DEPRECATED ON)
set(PY_CASBIN_VERSION 1.1)
if(APPLE AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
# The value of this variable should be set prior to the first project() command invocation
# because it may influence configuration of the toolchain and flags.
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version")
endif()
if(WIN32)
add_compile_options("/bigobj")
endif()
###############################################################################
# Project definition.
project(
casbin
VERSION 1.53.2
DESCRIPTION "An authorization library that supports access control models like ACL, RBAC, ABAC in C/C++"
HOMEPAGE_URL https://github.com/casbin/casbin-cpp
LANGUAGES CXX C
)
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${PROJECT_SOURCE_DIR}/cmake/modules
)
###############################################################################
# Forbid in-source build.
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
message(FATAL_ERROR
"In-source build not allowed. Please make a new sub-directory and run CMake from there.")
endif()
###############################################################################
# Global CMake options.
option(CASBIN_BUILD_TEST "State whether to build test" ON)
option(CASBIN_BUILD_BENCHMARK "State whether to build benchmarks" ON)
option(INTENSIVE_BENCHMARK "State whether to build intensive benchmarks" OFF)
option(CASBIN_BUILD_PYTHON_BINDINGS "State whether to build python bindings" ON)
option(CASBIN_INSTALL "State whether to install casbin targets on the current system" ON)
# Intrinsic directory paths
set(CASBIN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/casbin)
set(CASBIN_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(CASBIN_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
# Do not output install messages.
if(NOT DEFINED CMAKE_INSTALL_MESSAGE)
set(CMAKE_INSTALL_MESSAGE "LAZY")
endif()
# Change the path max size to avoid problem on Windows.
if(NOT DEFINED CMAKE_OBJECT_PATH_MAX)
set(CMAKE_OBJECT_PATH_MAX 300)
endif()
# Setting to C++ standard to C++17
set(CMAKE_CXX_STANDARD 17)
###############################################################################
# Install external dependencies
# Some required targets may be created by third-party CMake configs, which
# don't generally produce global targets. To guarantee all imported targets are
# global, this module is included at the project root level.
include(FindExtPackages)
add_subdirectory(casbin)
if(CASBIN_BUILD_PYTHON_BINDINGS)
add_subdirectory(pycasbin)
endif()
if(CASBIN_BUILD_TEST)
enable_testing()
add_subdirectory(tests)
endif()
##########################################
# "make format"
# "make check-format"
# Only support clang format for unix like operating system.
if(UNIX)
# Expected directory structure.
set(CASBIN_BUILD_SUPPORT_DIR "${CMAKE_SOURCE_DIR}/build_support")
set(CASBIN_CLANG_SEARCH_PATH "/usr/local/bin" "/usr/bin" "/usr/local/opt/llvm/bin" "/usr/local/opt/llvm@8/bin"
"/usr/local/Cellar/llvm/8.0.1/bin")
# clang-format
if (NOT DEFINED CLANG_FORMAT_BIN)
# attempt to find the binary if user did not specify
find_program(CLANG_FORMAT_BIN
NAMES clang-format clang-format-8
HINTS ${CASBIN_CLANG_SEARCH_PATH})
endif()
if ("${CLANG_FORMAT_BIN}" STREQUAL "CLANG_FORMAT_BIN-NOTFOUND")
message(WARNING "Casbin couldn't find clang-format.")
else()
message(STATUS "Casbin found clang-format at ${CLANG_FORMAT_BIN}")
endif()
# clang-tidy
if (NOT DEFINED CLANG_TIDY_BIN)
# attempt to find the binary if user did not specify
find_program(CLANG_TIDY_BIN
NAMES clang-tidy clang-tidy-8
HINTS ${CASBIN_CLANG_SEARCH_PATH})
endif()
if ("${CLANG_TIDY_BIN}" STREQUAL "CLANG_TIDY_BIN-NOTFOUND")
message(WARNING "Casbin couldn't find clang-tidy.")
else()
# Output compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
message(STATUS "Casbin found clang-tidy at ${CLANG_TIDY_BIN}")
endif()
string(CONCAT CASBIN_FORMAT_DIRS
"${CASBIN_SOURCE_DIR},"
"${CASBIN_INCLUDE_DIR},"
"${CMAKE_CURRENT_SOURCE_DIR}/tests,"
)
# runs clang format and updates files in place.
add_custom_target(format ${CASBIN_BUILD_SUPPORT_DIR}/run_clang_format.py
${CLANG_FORMAT_BIN}
${CASBIN_BUILD_SUPPORT_DIR}/clang_format_exclusions.txt
--source_dirs
${CASBIN_FORMAT_DIRS}
--format_style
"file"
--fix
--quiet
)
# runs clang format and exits with a non-zero exit code if any files need to be reformatted
add_custom_target(check-format ${CASBIN_BUILD_SUPPORT_DIR}/run_clang_format.py
${CLANG_FORMAT_BIN}
${CASBIN_BUILD_SUPPORT_DIR}/clang_format_exclusions.txt
--source_dirs
${CASBIN_FORMAT_DIRS}
--format_style
"file"
--quiet
)
endif()
##########################################
# Install casbin
if(CASBIN_INSTALL)
message(CHECK_START "[casbin]: Installing casbin ...")
export(
TARGETS casbin
NAMESPACE casbin::
FILE casbinConfig.cmake
)
# Installing headers
install(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/casbin
DESTINATION include
)
set(CMAKE_EXPORT_PACKAGE_REGISTRY ON)
export(PACKAGE casbin)
message(CHECK_PASS " The targets can now be imported with find_package(casbin)")
message(STATUS "[casbin]: Build the \"install\" target and add \"${CMAKE_INSTALL_PREFIX}/include\" to you PATH for casbin to work")
endif()