blob: 9633aa0508e23eda2330f236e4d301fa6110fc3e [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.16)
project(fory
VERSION 0.16.0
DESCRIPTION "Apache Fory - A blazingly fast multi-language serialization framework"
LANGUAGES CXX
)
# C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Options
option(FORY_BUILD_TESTS "Build Fory tests" OFF)
option(FORY_BUILD_SHARED "Build shared libraries" ON)
option(FORY_BUILD_STATIC "Build static libraries" ON)
option(FORY_USE_AVX2 "Enable AVX2 optimizations on x86_64" ON)
# Set default build type if not specified
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
# Output directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Platform detection
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64")
set(FORY_IS_X86_64 TRUE)
else()
set(FORY_IS_X86_64 FALSE)
endif()
# Compiler flags
if(MSVC)
add_compile_options(/W4)
if(FORY_USE_AVX2 AND FORY_IS_X86_64)
add_compile_options(/arch:AVX2)
endif()
else()
add_compile_options(-Wall -Wextra -Wpedantic)
if(FORY_USE_AVX2 AND FORY_IS_X86_64)
add_compile_options(-mavx2)
endif()
endif()
# Set Fory root directory for include paths (important when used as subdirectory)
set(FORY_CPP_ROOT ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Fory C++ root directory")
# Fetch Abseil (required for debugging support)
message(STATUS "Fetching Abseil via FetchContent")
include(FetchContent)
set(ABSL_PROPAGATE_CXX_STD ON)
set(ABSL_BUILD_TESTING OFF)
set(ABSL_ENABLE_INSTALL ON)
FetchContent_Declare(
abseil-cpp
GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git
GIT_TAG 20240722.0
)
FetchContent_MakeAvailable(abseil-cpp)
# Add subdirectories
add_subdirectory(fory/thirdparty)
add_subdirectory(fory/util)
add_subdirectory(fory/type)
add_subdirectory(fory/meta)
add_subdirectory(fory/serialization)
add_subdirectory(fory/row)
add_subdirectory(fory/encoder)
# Create main fory_serialization interface library (for users who only need serialization)
add_library(fory_serialization_lib INTERFACE)
target_link_libraries(fory_serialization_lib INTERFACE fory_serialization)
add_library(fory::serialization ALIAS fory_serialization_lib)
# Create main fory_row_format interface library (for users who need row format)
add_library(fory_row_format_lib INTERFACE)
target_link_libraries(fory_row_format_lib INTERFACE fory_row_format fory_encoder)
add_library(fory::row_format ALIAS fory_row_format_lib)
# Create main fory interface library (includes everything)
add_library(fory_lib INTERFACE)
target_link_libraries(fory_lib INTERFACE fory_serialization fory_row_format fory_encoder)
add_library(fory::fory ALIAS fory_lib)
# Tests
if(FORY_BUILD_TESTS)
enable_testing()
find_package(GTest REQUIRED)
include(GoogleTest)
add_subdirectory(tests)
endif()
# Installation
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# Install headers
install(DIRECTORY fory/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fory
FILES_MATCHING
PATTERN "*.h"
PATTERN "*_test.cc" EXCLUDE
PATTERN "python" EXCLUDE
)
# Install libraries
install(TARGETS
fory_thirdparty
fory_util
fory_type
fory_meta
fory_serialization
fory_row_format
fory_encoder
fory_serialization_lib
fory_row_format_lib
fory_lib
EXPORT ForyTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# Generate and install package config files
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/ForyConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/ForyConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/ForyConfig.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fory
)
install(EXPORT ForyTargets
FILE ForyTargets.cmake
NAMESPACE fory::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fory
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/ForyConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/ForyConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fory
)
# Print configuration summary
message(STATUS "")
message(STATUS "Fory Configuration Summary:")
message(STATUS " Version: ${PROJECT_VERSION}")
message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS " C++ standard: ${CMAKE_CXX_STANDARD}")
message(STATUS " Install prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS " Build tests: ${FORY_BUILD_TESTS}")
message(STATUS " AVX2 enabled: ${FORY_USE_AVX2} (x86_64: ${FORY_IS_X86_64})")
message(STATUS "")