FindErlang.cmake 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # https://gist.github.com/JayKickliter/c79cad0c3e3acfc3465cac41b7051fa9
  2. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  3. # file Copyright.txt or https://cmake.org/licensing for details.
  4. #[=======================================================================[.rst:
  5. FindErlang
  6. -------
  7. Finds Erlang libraries.
  8. Imported Targets
  9. ^^^^^^^^^^^^^^^^
  10. This module provides the following imported targets, if found:
  11. ``Erlang::Erlang``
  12. Header only interface library suitible for compiling NIFs.
  13. ``Erlang::EI``
  14. Erlang interface library.
  15. ``Erlang::ERTS``
  16. Erlang runtime system library.
  17. Result Variables
  18. ^^^^^^^^^^^^^^^^
  19. This will define the following variables:
  20. ``Erlang_FOUND``
  21. True if the system has the Erlang library.
  22. ``Erlang_RUNTIME``
  23. The path to the Erlang runtime.
  24. ``Erlang_COMPILE``
  25. The path to the Erlang compiler.
  26. ``Erlang_EI_PATH``
  27. The path to the Erlang erl_interface path.
  28. ``Erlang_ERTS_PATH``
  29. The path to the Erlang erts path.
  30. ``Erlang_EI_INCLUDE_DIRS``
  31. /include appended to Erlang_EI_PATH.
  32. ``Erlang_EI_LIBRARY_PATH``
  33. /lib appended to Erlang_EI_PATH.
  34. ``Erlang_ERTS_INCLUDE_DIRS``
  35. /include appended to Erlang_ERTS_PATH.
  36. ``Erlang_ERTS_LIBRARY_PATH``
  37. /lib appended to Erlang_ERTS_PATH.
  38. #]=======================================================================]
  39. include(FindPackageHandleStandardArgs)
  40. set(Erlang_BIN_PATH $ENV{ERLANG_HOME}/bin /opt/bin /sw/bin /usr/bin /usr/local/bin /opt/local/bin)
  41. find_program(
  42. Erlang_RUNTIME
  43. NAMES erl
  44. PATHS ${Erlang_BIN_PATH}
  45. )
  46. find_program(
  47. Erlang_COMPILE
  48. NAMES erlc
  49. PATHS ${Erlang_BIN_PATH}
  50. )
  51. execute_process(
  52. COMMAND erl -noshell -eval "io:format(\"~s\", [code:lib_dir()])" -s erlang halt
  53. OUTPUT_VARIABLE Erlang_OTP_LIB_DIR
  54. )
  55. execute_process(
  56. COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang halt
  57. OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR
  58. )
  59. execute_process(
  60. COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erl_interface'))])"
  61. -s erlang halt OUTPUT_VARIABLE Erlang_EI_DIR
  62. )
  63. execute_process(
  64. COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erts'))])" -s erlang
  65. halt OUTPUT_VARIABLE Erlang_ERTS_DIR
  66. )
  67. set(Erlang_EI_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR})
  68. set(Erlang_EI_INCLUDE_DIRS ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/include)
  69. set(Erlang_EI_LIBRARY_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/lib)
  70. set(Erlang_ERTS_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR})
  71. set(Erlang_ERTS_INCLUDE_DIRS ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/include)
  72. set(Erlang_ERTS_LIBRARY_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/lib)
  73. find_package_handle_standard_args(
  74. Erlang
  75. DEFAULT_MSG
  76. Erlang_RUNTIME
  77. Erlang_COMPILE
  78. Erlang_OTP_LIB_DIR
  79. Erlang_OTP_ROOT_DIR
  80. Erlang_EI_DIR
  81. Erlang_ERTS_DIR
  82. )
  83. if(Erlang_FOUND)
  84. if(NOT TARGET Erlang::Erlang)
  85. add_library(Erlang::Erlang INTERFACE IMPORTED)
  86. set_target_properties(
  87. Erlang::Erlang PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Erlang_OTP_ROOT_DIR}/usr/include
  88. )
  89. endif()
  90. if(NOT TARGET Erlang::ERTS)
  91. add_library(Erlang::ERTS STATIC IMPORTED)
  92. set_target_properties(
  93. Erlang::ERTS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Erlang_ERTS_INCLUDE_DIRS}
  94. IMPORTED_LOCATION ${Erlang_ERTS_LIBRARY_PATH}/liberts.a
  95. )
  96. endif()
  97. if(NOT TARGET Erlang::EI)
  98. add_library(erlang_ei STATIC IMPORTED)
  99. set_property(TARGET erlang_ei PROPERTY IMPORTED_LOCATION ${Erlang_EI_LIBRARY_PATH}/libei.a)
  100. add_library(erlang_erl_interface STATIC IMPORTED)
  101. set_property(
  102. TARGET erlang_erl_interface PROPERTY IMPORTED_LOCATION
  103. ${Erlang_EI_LIBRARY_PATH}/liberl_interface.a
  104. )
  105. add_library(Erlang::EI INTERFACE IMPORTED)
  106. set_property(TARGET Erlang::EI PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Erlang_EI_INCLUDE_DIRS})
  107. set_property(TARGET Erlang::EI PROPERTY INTERFACE_LINK_LIBRARIES erlang_ei erlang_erl_interface)
  108. endif()
  109. endif(Erlang_FOUND)