FindErlang.cmake 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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
  41. /usr/local/bin /opt/local/bin
  42. )
  43. find_program(
  44. Erlang_RUNTIME
  45. NAMES erl
  46. PATHS ${Erlang_BIN_PATH}
  47. )
  48. find_program(
  49. Erlang_COMPILE
  50. NAMES erlc
  51. PATHS ${Erlang_BIN_PATH}
  52. )
  53. execute_process(
  54. COMMAND erl -noshell -eval "io:format(\"~s\", [code:lib_dir()])" -s erlang
  55. halt OUTPUT_VARIABLE Erlang_OTP_LIB_DIR
  56. )
  57. execute_process(
  58. COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang
  59. halt OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR
  60. )
  61. execute_process(
  62. COMMAND
  63. erl -noshell -eval
  64. "io:format(\"~s\",[filename:basename(code:lib_dir('erl_interface'))])" -s
  65. erlang halt
  66. OUTPUT_VARIABLE Erlang_EI_DIR
  67. )
  68. execute_process(
  69. COMMAND
  70. erl -noshell -eval
  71. "io:format(\"~s\",[filename:basename(code:lib_dir('erts'))])" -s erlang halt
  72. OUTPUT_VARIABLE Erlang_ERTS_DIR
  73. )
  74. set(Erlang_EI_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR})
  75. set(Erlang_EI_INCLUDE_DIRS ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/include)
  76. set(Erlang_EI_LIBRARY_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/lib)
  77. set(Erlang_ERTS_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR})
  78. set(Erlang_ERTS_INCLUDE_DIRS ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/include)
  79. set(Erlang_ERTS_LIBRARY_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/lib)
  80. find_package_handle_standard_args(
  81. Erlang
  82. DEFAULT_MSG
  83. Erlang_RUNTIME
  84. Erlang_COMPILE
  85. Erlang_OTP_LIB_DIR
  86. Erlang_OTP_ROOT_DIR
  87. Erlang_EI_DIR
  88. Erlang_ERTS_DIR
  89. )
  90. if(Erlang_FOUND)
  91. if(NOT TARGET Erlang::Erlang)
  92. add_library(Erlang::Erlang INTERFACE IMPORTED)
  93. set_target_properties(
  94. Erlang::Erlang PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
  95. ${Erlang_OTP_ROOT_DIR}/usr/include
  96. )
  97. endif()
  98. if(NOT TARGET Erlang::ERTS)
  99. add_library(Erlang::ERTS STATIC IMPORTED)
  100. set_target_properties(
  101. Erlang::ERTS
  102. PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Erlang_ERTS_INCLUDE_DIRS}
  103. IMPORTED_LOCATION ${Erlang_ERTS_LIBRARY_PATH}/liberts.a
  104. )
  105. endif()
  106. if(NOT TARGET Erlang::EI)
  107. add_library(erlang_ei STATIC IMPORTED)
  108. set_property(
  109. TARGET erlang_ei PROPERTY IMPORTED_LOCATION
  110. ${Erlang_EI_LIBRARY_PATH}/libei.a
  111. )
  112. add_library(erlang_erl_interface STATIC IMPORTED)
  113. set_property(
  114. TARGET erlang_erl_interface
  115. PROPERTY IMPORTED_LOCATION ${Erlang_EI_LIBRARY_PATH}/liberl_interface.a
  116. )
  117. add_library(Erlang::EI INTERFACE IMPORTED)
  118. set_property(
  119. TARGET Erlang::EI PROPERTY INTERFACE_INCLUDE_DIRECTORIES
  120. ${Erlang_EI_INCLUDE_DIRS}
  121. )
  122. set_property(
  123. TARGET Erlang::EI PROPERTY INTERFACE_LINK_LIBRARIES erlang_ei
  124. erlang_erl_interface
  125. )
  126. endif()
  127. endif(Erlang_FOUND)