blob: aa75eae59b1a9c9719057609430dd87851b435d7 [file]
# 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.24)
cmake_policy(SET CMP0135 NEW)
project(opendal-c)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug")
endif()
option(TEST_ENABLE_ASAN "Enable AddressSanitizer for tests" OFF)
set(FEATURES "" CACHE STRING "opendal features")
set(CARGO_FEATURES_FLAG "--features=${FEATURES}")
# force the compiler to support these standards
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# for GoogleTest, it should be no less than C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# fetch google test via GitHub
include(FetchContent)
set(GOOGLETEST_VERSION 1.15.2)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/tags/v${GOOGLETEST_VERSION}.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
set(CARGO_DIST_DIR "${PROJECT_SOURCE_DIR}/target/debug")
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CARGO_BUILD_TYPE "--release")
set(CARGO_DIST_DIR "${PROJECT_SOURCE_DIR}/target/release")
endif()
set(OPENDAL_STATIC_LIB "${CARGO_DIST_DIR}/libopendal_c${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(OPENDAL_SHARED_LIB "${CARGO_DIST_DIR}/libopendal_c${CMAKE_SHARED_LIBRARY_SUFFIX}")
message(NOTICE "-- OpenDAL C static lib: ${OPENDAL_STATIC_LIB}")
message(NOTICE "-- OpenDAL C shared lib: ${OPENDAL_SHARED_LIB}")
# custom target for cargo build
add_custom_target(cargo_build
COMMAND sh -c "cargo build ${CARGO_BUILD_TYPE} ${CARGO_FEATURES_FLAG}"
BYPRODUCTS ${OPENDAL_STATIC_LIB} ${OPENDAL_SHARED_LIB}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
# cmake target for static lib
add_library(opendal_c_static INTERFACE)
target_link_libraries(opendal_c_static INTERFACE ${OPENDAL_STATIC_LIB})
target_include_directories(opendal_c_static INTERFACE include)
add_dependencies(opendal_c_static cargo_build)
# cmake target for shared lib
add_library(opendal_c_shared INTERFACE)
target_link_libraries(opendal_c_shared INTERFACE ${OPENDAL_SHARED_LIB})
target_include_directories(opendal_c_shared INTERFACE include)
add_dependencies(opendal_c_shared cargo_build)
# example targets
add_executable(basic examples/basic.c)
target_link_libraries(basic opendal_c_shared)
add_executable(error_handle examples/error_handle.c)
target_link_libraries(error_handle opendal_c_shared)
# test targets
set(GTEST_SRCS
tests/bdd.cpp
tests/error_msg.cpp
tests/list.cpp
tests/opinfo.cpp
tests/reader.cpp
)
add_executable(tests ${GTEST_SRCS})
target_link_libraries(tests PRIVATE opendal_c_shared gtest_main)
if(UNIX AND NOT APPLE)
target_link_libraries(tests PRIVATE uuid)
endif()
if (TEST_ENABLE_ASAN)
target_compile_options(tests PRIVATE -fsanitize=address)
target_link_options(tests PRIVATE -fsanitize=address)
endif()