You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/cmake/modules/FindErlang.cmake

176 lines
5.2 KiB

# https://gist.github.com/JayKickliter/c79cad0c3e3acfc3465cac41b7051fa9
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindErlang
-------
Finds Erlang libraries.
Imported Targets
^^^^^^^^^^^^^^^^
This module provides the following imported targets, if found:
``Erlang::Erlang``
Header only interface library suitible for compiling NIFs.
``Erlang::EI``
Erlang interface library.
``Erlang::ERTS``
Erlang runtime system library.
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``Erlang_FOUND``
True if the system has the Erlang library.
``Erlang_RUNTIME``
The path to the Erlang runtime.
``Erlang_COMPILE``
The path to the Erlang compiler.
``Erlang_EI_PATH``
The path to the Erlang erl_interface path.
``Erlang_ERTS_PATH``
The path to the Erlang erts path.
``Erlang_EI_INCLUDE_DIRS``
/include appended to Erlang_EI_PATH.
``Erlang_EI_LIBRARY_PATH``
/lib appended to Erlang_EI_PATH.
``Erlang_ERTS_INCLUDE_DIRS``
/include appended to Erlang_ERTS_PATH.
``Erlang_ERTS_LIBRARY_PATH``
/lib appended to Erlang_ERTS_PATH.
#]=======================================================================]
include(FindPackageHandleStandardArgs)
set(Erlang_BIN_PATH
"$ENV{ERLANG_HOME}/bin;/opt/bin;/sw/bin;/usr/bin;/usr/local/bin;/opt/local/bin"
CACHE STRING "Semicolon-separated list of paths to search for Erlang binaries"
)
find_program(
Erlang_RUNTIME
NAMES erl
PATHS ${Erlang_BIN_PATH}
)
find_program(
Erlang_COMPILE
NAMES erlc
PATHS ${Erlang_BIN_PATH}
)
set(Erlang_OTP_LIB_DIR
""
CACHE STRING "Erlang OTP library directory. Will be determined by erl bin if not set."
)
if(NOT Erlang_OTP_LIB_DIR)
execute_process(
COMMAND erl -noshell -eval "io:format(\"~s\", [code:lib_dir()])" -s erlang halt
OUTPUT_VARIABLE Erlang_OTP_LIB_DIR
)
endif()
set(Erlang_OTP_ROOT_DIR
""
CACHE STRING "Erlang OTP root directory. Will be determined by erl bin if not set."
)
if(NOT Erlang_OTP_ROOT_DIR)
execute_process(
COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang halt
OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR
)
endif()
set(Erlang_EI_DIR
""
CACHE STRING "Erlang erl_interface directory name. Will be determined by erl bin if not set."
)
if(NOT Erlang_EI_DIR)
execute_process(
COMMAND erl -noshell -eval
"io:format(\"~s\",[filename:basename(code:lib_dir('erl_interface'))])" -s erlang halt
OUTPUT_VARIABLE Erlang_EI_DIR
)
endif()
set(Erlang_ERTS_DIR
""
CACHE STRING "Erlang ERTS directory name. Will be determined by erl bin if not set."
)
if(NOT Erlang_ERTS_DIR)
execute_process(
COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erts'))])" -s
erlang halt OUTPUT_VARIABLE Erlang_ERTS_DIR
)
endif()
set(Erlang_EI_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR})
set(Erlang_EI_INCLUDE_DIRS ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/include)
set(Erlang_EI_LIBRARY_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/lib)
set(Erlang_ERTS_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR})
set(Erlang_ERTS_INCLUDE_DIRS ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/include)
set(Erlang_ERTS_LIBRARY_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/lib)
# Find the version of Erlang
execute_process(
COMMAND
erl -eval
"{ok, Version} = file:read_file(filename:join([code:root_dir(), 'releases', erlang:system_info(otp_release), 'OTP_VERSION'])), io:fwrite(Version), halt()."
-noshell
OUTPUT_VARIABLE Erlang_VERSION
)
string(STRIP "${Erlang_VERSION}" Erlang_VERSION)
find_package_handle_standard_args(
Erlang
REQUIRED_VARS Erlang_RUNTIME Erlang_COMPILE Erlang_OTP_LIB_DIR Erlang_OTP_ROOT_DIR Erlang_EI_DIR
Erlang_ERTS_DIR
VERSION_VAR Erlang_VERSION
)
if(Erlang_FOUND)
if(NOT TARGET Erlang::Erlang)
add_library(Erlang::Erlang INTERFACE IMPORTED)
set_target_properties(
Erlang::Erlang PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Erlang_OTP_ROOT_DIR}/usr/include
)
endif()
if(NOT TARGET Erlang::ERTS)
add_library(Erlang::ERTS STATIC IMPORTED)
set_target_properties(
Erlang::ERTS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Erlang_ERTS_INCLUDE_DIRS}
IMPORTED_LOCATION ${Erlang_ERTS_LIBRARY_PATH}/liberts.a
)
endif()
if(NOT TARGET Erlang::EI)
add_library(Erlang::EI INTERFACE IMPORTED)
add_library(erlang_ei STATIC IMPORTED)
set_property(TARGET erlang_ei PROPERTY IMPORTED_LOCATION ${Erlang_EI_LIBRARY_PATH}/libei.a)
if(Erlang_VERSION VERSION_LESS "23")
add_library(erlang_erl_interface STATIC IMPORTED)
set_property(
TARGET erlang_erl_interface PROPERTY IMPORTED_LOCATION
${Erlang_EI_LIBRARY_PATH}/liberl_interface.a
)
set_property(TARGET Erlang::EI PROPERTY INTERFACE_LINK_LIBRARIES erlang_erl_interface)
endif()
set_property(TARGET Erlang::EI PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Erlang_EI_INCLUDE_DIRS})
set_property(
TARGET Erlang::EI
APPEND
PROPERTY INTERFACE_LINK_LIBRARIES erlang_ei
)
endif()
endif(Erlang_FOUND)