FindOCaml.cmake 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # CMake find_package() module for the OCaml language.
  2. # Assumes ocamlfind will be used for compilation.
  3. # http://ocaml.org/
  4. #
  5. # Example usage:
  6. #
  7. # find_package(OCaml)
  8. #
  9. # If successful, the following variables will be defined:
  10. # OCAMLFIND
  11. # OCAML_VERSION
  12. # OCAML_STDLIB_PATH
  13. # HAVE_OCAMLOPT
  14. #
  15. # Also provides find_ocamlfind_package() macro.
  16. #
  17. # Example usage:
  18. #
  19. # find_ocamlfind_package(ctypes)
  20. #
  21. # In any case, the following variables are defined:
  22. #
  23. # HAVE_OCAML_${pkg}
  24. #
  25. # If successful, the following variables will be defined:
  26. #
  27. # OCAML_${pkg}_VERSION
  28. include( FindPackageHandleStandardArgs )
  29. find_program(OCAMLFIND
  30. NAMES ocamlfind)
  31. if( OCAMLFIND )
  32. execute_process(
  33. COMMAND ${OCAMLFIND} ocamlc -version
  34. OUTPUT_VARIABLE OCAML_VERSION
  35. OUTPUT_STRIP_TRAILING_WHITESPACE)
  36. execute_process(
  37. COMMAND ${OCAMLFIND} ocamlc -where
  38. OUTPUT_VARIABLE OCAML_STDLIB_PATH
  39. OUTPUT_STRIP_TRAILING_WHITESPACE)
  40. execute_process(
  41. COMMAND ${OCAMLFIND} ocamlc -version
  42. OUTPUT_QUIET
  43. RESULT_VARIABLE find_ocaml_result)
  44. if( find_ocaml_result EQUAL 0 )
  45. set(HAVE_OCAMLOPT TRUE)
  46. else()
  47. set(HAVE_OCAMLOPT FALSE)
  48. endif()
  49. endif()
  50. find_package_handle_standard_args( OCaml DEFAULT_MSG
  51. OCAMLFIND
  52. OCAML_VERSION
  53. OCAML_STDLIB_PATH)
  54. mark_as_advanced(
  55. OCAMLFIND)
  56. function(find_ocamlfind_package pkg)
  57. CMAKE_PARSE_ARGUMENTS(ARG "OPTIONAL" "VERSION" "" ${ARGN})
  58. execute_process(
  59. COMMAND "${OCAMLFIND}" "query" "${pkg}" "-format" "%v"
  60. RESULT_VARIABLE result
  61. OUTPUT_VARIABLE version
  62. ERROR_VARIABLE error
  63. OUTPUT_STRIP_TRAILING_WHITESPACE
  64. ERROR_STRIP_TRAILING_WHITESPACE)
  65. if( NOT result EQUAL 0 AND NOT ARG_OPTIONAL )
  66. message(FATAL_ERROR ${error})
  67. endif()
  68. if( result EQUAL 0 )
  69. set(found TRUE)
  70. else()
  71. set(found FALSE)
  72. endif()
  73. if( found AND ARG_VERSION )
  74. if( version VERSION_LESS ARG_VERSION AND ARG_OPTIONAL )
  75. # If it's optional and the constraint is not satisfied, pretend
  76. # it wasn't found.
  77. set(found FALSE)
  78. elseif( version VERSION_LESS ARG_VERSION )
  79. message(FATAL_ERROR
  80. "ocamlfind package ${pkg} should have version ${ARG_VERSION} or newer")
  81. endif()
  82. endif()
  83. string(TOUPPER ${pkg} pkg)
  84. set(HAVE_OCAML_${pkg} ${found}
  85. PARENT_SCOPE)
  86. set(OCAML_${pkg}_VERSION ${version}
  87. PARENT_SCOPE)
  88. endfunction()