Current section
Files
Jump to
Current section
Files
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
project(crc32cer_nif)
set(SOURCES
c_src/crc32c_nif.c
)
SET(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
SET(Erlang_EI_INCLUDE_DIRS ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/include)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/priv/)
# OTP limitation
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
# For cerl picking up the OTP_ROOT
if (DEFINED ENV{Erlang_OTP_ROOT_DIR})
SET(Erlang_OTP_ROOT_DIR $ENV{Erlang_OTP_ROOT_DIR})
else()
EXECUTE_PROCESS(
COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang halt
OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR
)
endif()
add_library(crc32cer_nif SHARED ${SOURCES})
target_include_directories(crc32cer_nif PRIVATE ${Erlang_OTP_ROOT_DIR}/usr/include/)
set(CMAKE_CXX_EXTENSIONS ON)
set_property(GLOBAL PROPERTY CXX_STANDARD 11)
include(ExternalProject)
ExternalProject_Add(google-crc32c
GIT_REPOSITORY "https://github.com/google/crc32c.git"
GIT_TAG "1.1.2"
GIT_SHALLOW 1
GIT_SUBMODULES ""
PREFIX "${CMAKE_BINARY_DIR}/external"
SOURCE_DIR "${CMAKE_BINARY_DIR}/external/crc32c"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCRC32C_INSTALL=ON -DCRC32C_BUILD_TESTS=OFF -DCRC32C_BUILD_BENCHMARKS=OFF -DCRC32C_USE_GLOG=0 -DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC
BUILD_COMMAND ${CMAKE_COMMAND} --build .
PATCH_COMMAND patch -N -p1 < ${PROJECT_SOURCE_DIR}/crc32c_cmake.patch || true
INSTALL_COMMAND ""
)
# Set appropriate include and link directories
include_directories(${CMAKE_BINARY_DIR}/external/crc32c/include)
add_library(crc32c SHARED IMPORTED)
# Specify the dependency on the external library
add_dependencies(crc32cer_nif google-crc32c)
set_property(TARGET crc32c PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/external/src/google-crc32c-build/libcrc32c.a)
if (CMAKE_SYSTEM_NAME MATCHES Darwin)
target_link_libraries(crc32cer_nif PRIVATE crc32c c++ "-Wl,-undefined,dynamic_lookup")
else()
target_link_libraries(crc32cer_nif crc32c stdc++)
endif()
install(TARGETS crc32cer_nif LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/priv/)
set_target_properties(crc32cer_nif
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/priv/
)
set_target_properties(crc32c
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/priv/
)