Ctrl K
ComunidadGuías…

CMakeLists.txt

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
cmake_minimum_required(VERSION 3.21...4.0)

include("${CMAKE_CURRENT_LIST_DIR}/cmake/BootstrapVcpkg.cmake")

# Has to be decided before project(), where the vcpkg toolchain installs the manifest dependencies
option(HS5_WITH_DUCKDB "Build with DuckDB UI support" ON)
if(NOT HS5_WITH_DUCKDB)
  set(VCPKG_MANIFEST_NO_DEFAULT_FEATURES ON)
endif()

project(hs5 VERSION 1.4.0 LANGUAGES CXX C)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_custom_target(sqlgen
  COMMAND "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/sqlite-cpp-sqlgen" "template.db" "DbDao.cpp"
  WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/src"
)

set(APIGEN_SCHEMAS
  HapiError
  AddUserParams
  AddUserResp
  RemoveUserParams
  RemoveUserResp
  ListUsersParams
  ListUsersResp
  AddAccessKeyParams
  AddAccessKeyResp
  ListAccessKeysParams
  ListAccessKeysResp
  RemoveAccessKeyParams
  RemoveAccessKeyResp
  AddPolicyParams
  AddPolicyResp
  RemovePolicyParams
  RemovePolicyResp
  ListPoliciesParams
  ListPoliciesResp
  AddRoleParams
  AddRoleResp
  RemoveRoleParams
  RemoveRoleResp
  ListRolesParams
  ListRolesResp
  AddUserRoleParams
  AddUserRoleResp
  RemoveUserRoleParams
  RemoveUserRoleResp
  ListUserRolesParams
  ListUserRolesResp
  AddRolePolicyParams
  AddRolePolicyResp
  RemoveRolePolicyParams
  RemoveRolePolicyResp
  ListRolePoliciesParams
  ListRolePoliciesResp
  ChangePolicyParams
  ChangePolicyResp
  DeleteBucketParams
  DeleteBucketResp
  ChangePasswordParams
  ChangePasswordResp
  LoginParams
  LoginResp    
  ListParams
  ListResp
  AddBucketParams
  AddBucketResp
  LogoutParams
  LogoutResp
  AddBucketPermissionParams
  AddBucketPermissionResp
  ListBucketPermissionsParams
  ListBucketPermissionsResp
  RemoveBucketPermissionParams
  RemoveBucketPermissionResp
  SetBucketPublicParams
  SetBucketPublicResp
  StatsParams
  StatsResp#
  SessionCheckParams
  SessionCheckResp # Must be last
)


find_program(CLANG_FORMAT_EXECUTABLE clang-format HINTS "${CMAKE_CURRENT_LIST_DIR}/.venv/bin")
find_program(BLACK_EXECUTABLE black HINTS "${CMAKE_CURRENT_LIST_DIR}/.venv/bin")
if(CLANG_FORMAT_EXECUTABLE AND BLACK_EXECUTABLE)
  set(HS5_FORMAT_CPP_FILES "git ls-files -z 'src/*.cpp' 'src/*.h' ':!src/apigen/*' | xargs -0 \"${CLANG_FORMAT_EXECUTABLE}\"")
  add_custom_target(format
    COMMAND sh -c "${HS5_FORMAT_CPP_FILES} -i"
    COMMAND "${BLACK_EXECUTABLE}" .
    WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
    VERBATIM
  )
  add_custom_target(format-check
    COMMAND sh -c "${HS5_FORMAT_CPP_FILES} --dry-run --Werror"
    COMMAND "${BLACK_EXECUTABLE}" --check --diff .
    WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
    VERBATIM
  )
endif()

add_custom_target(apigen)
foreach(SCHEMA ${APIGEN_SCHEMAS})
  add_custom_command(
    TARGET   apigen
    POST_BUILD
    COMMAND  "echo" "Generating ${SCHEMA}..."
    WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
  )
  add_custom_command(
    TARGET   apigen
    POST_BUILD 
    COMMAND  "${CMAKE_CURRENT_LIST_DIR}/quicktype-bundled.js" "-s" "schema" "src/schemas/${SCHEMA}.json" "-o" "src/apigen/${SCHEMA}.cpp" "--include-location" "global-include" "--type-style" "pascal-case" "--member-style" "camel-case"  "--enumerator-style" "camel-case" "--no-boost" "--source-style" "multi-source" "--namespace" "Api" "--code-format" "with-struct"
    WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
  )
  add_custom_command(TARGET apigen
                   POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E rename
                   "src/apigen/Generators.hpp"
                   "src/apigen/Generators${SCHEMA}.hpp"
                   WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}")
endforeach()

set(SCHEMA_SOURCES "")
foreach(SCHEMA ${APIGEN_SCHEMAS})
  if(EXISTS "src/apigen/${SCHEMA}.cpp")
    list(APPEND SCHEMA_SOURCES "src/apigen/${SCHEMA}.cpp")
  endif()
endforeach()

# Get the current git revision
execute_process(
  COMMAND git rev-parse --short HEAD
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  OUTPUT_VARIABLE GIT_REVISION
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

# Configure config.h
configure_file(
  ${CMAKE_SOURCE_DIR}/src/config.h.in
  ${CMAKE_BINARY_DIR}/config.h
  @ONLY
)

# add_compile_options(-fno-omit-frame-pointer)
# if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_CONFIGURATION_TYPES MATCHES ".*[dD]ebug.*")
#   add_compile_options(-fsanitize=address)
#   add_link_options(-fsanitize=address)
# endif()

# LMDB accesses DUPSORT sub-pages stored inline in nodes (only 2-byte aligned) as MDB_page
if(CMAKE_C_FLAGS MATCHES "-fsanitize=[^ ]*undefined")
  set_source_files_properties(external/lmdb/mdb.c PROPERTIES COMPILE_OPTIONS "-fno-sanitize=alignment")
endif()

add_executable(hs5
    external/lmdb/midl.cpp
    external/lmdb/mdb.c
    external/lmdb/cppmidl.cpp
    src/zig_libc_compat.c
    src/main.cpp
    src/s3handler.cpp
    src/SingleFileStorage.cpp
    src/data.cpp
    src/os_functions.cpp 
    src/utils.cpp
    src/crypt.cpp
    src/File.cpp
    src/Buckets.cpp
    src/DbDao.cpp
    src/Policy.cpp
    src/Auth.cpp
    src/ApiHandler.cpp
    src/Session.cpp
    src/cmd.cpp
    src/StaticHandler.cpp
    src/WalFile.cpp
    wwwgen/www_files.cpp
    src/ObjectReader.cpp
    src/Action.cpp
    src/ContentType.cpp
    src/PayloadHash.cpp
    src/UserMetadata.cpp
    src/ObjMetadata.cpp
    external/proxygen/RFC1867.cpp
    ${SCHEMA_SOURCES}
    )

set_property(TARGET hs5 PROPERTY CXX_STANDARD 20)

# Include the generated config.h
target_include_directories(hs5 PRIVATE ${CMAKE_BINARY_DIR})

#set(GCC_COVERAGE_COMPILE_FLAGS "-fcoroutines")

add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})

find_package(fmt CONFIG REQUIRED)
find_package(folly CONFIG REQUIRED)
find_package(proxygen CONFIG REQUIRED)
find_package(zstd CONFIG REQUIRED)
find_package(expat CONFIG REQUIRED)
find_package(unofficial-sodium CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(sqlite-cpp-sqlgen CONFIG REQUIRED)
find_package(nlohmann_json  CONFIG REQUIRED)
if(HS5_WITH_DUCKDB)
  find_package(DuckDB CONFIG REQUIRED)
  target_sources(hs5 PRIVATE src/DuckDbFs.cpp)
  target_compile_definitions(hs5 PRIVATE HS5_WITH_DUCKDB)
  target_link_libraries(hs5 PRIVATE $<IF:$<TARGET_EXISTS:duckdb_static>,duckdb_static,duckdb>)
endif()
find_package(aws-c-common CONFIG REQUIRED)
find_package(aws-checksums CONFIG REQUIRED)
find_package(date CONFIG REQUIRED)
option(HS5_USE_JEMALLOC "Link jemalloc as the memory allocator" ON)
if(HS5_USE_JEMALLOC)
  find_library(JEMALLOC_LIBRARY NAMES jemalloc REQUIRED)
endif()
find_path(TCLAP_INCLUDE_DIRS "tclap/Arg.h")
target_include_directories(hs5 PRIVATE ${TCLAP_INCLUDE_DIRS})
target_link_directories(hs5 PRIVATE ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib)
# Patch missing transitive dependency: wangle_acceptor uses folly::AsyncFdSocket
# but doesn't declare the dependency in its CMake config
if(TARGET wangle::wangle_acceptor)
  set_property(TARGET wangle::wangle_acceptor APPEND PROPERTY INTERFACE_LINK_LIBRARIES Folly::folly_io_async_fdsock_async_fd_socket)
endif()

target_link_libraries(hs5 PRIVATE $<IF:$<TARGET_EXISTS:zstd::libzstd_shared>,zstd::libzstd_shared,zstd::libzstd_static>
  Folly::folly Folly::folly_deps Folly::follybenchmark Folly::folly_test_util
  proxygen::proxygen proxygen::proxygenhttpserver
  expat::expat unofficial-sodium::sodium OpenSSL::Crypto SqliteCppGen::SqliteCppGen nlohmann_json::nlohmann_json fmt::fmt
  AWS::aws-c-common AWS::aws-checksums date::date $<$<BOOL:${HS5_USE_JEMALLOC}>:${JEMALLOC_LIBRARY}>)

target_compile_features(hs5 PUBLIC cxx_std_20)
if(HS5_USE_JEMALLOC)
  target_compile_definitions(hs5 PRIVATE USE_JEMALLOC)
endif()
# Always use mvfst's expected-lite implementation (nonstd::expected), never std::expected
target_compile_definitions(hs5 PRIVATE nsel_CONFIG_SELECT_EXPECTED=nsel_EXPECTED_NONSTD)
# off64_t, stat64 etc. are only declared with this on musl (glibc implies it with _GNU_SOURCE)
target_compile_definitions(hs5 PRIVATE _LARGEFILE64_SOURCE)