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
29include( FindPackageHandleStandardArgs )
30
31find_program(OCAMLFIND
32             NAMES ocamlfind)
33
34if( OCAMLFIND )
35  execute_process(
36    COMMAND ${OCAMLFIND} ocamlc -version
37    OUTPUT_VARIABLE OCAML_VERSION
38    OUTPUT_STRIP_TRAILING_WHITESPACE)
39
40  execute_process(
41    COMMAND ${OCAMLFIND} ocamlc -where
42    OUTPUT_VARIABLE OCAML_STDLIB_PATH
43    OUTPUT_STRIP_TRAILING_WHITESPACE)
44
45  execute_process(
46    COMMAND ${OCAMLFIND} ocamlc -version
47    OUTPUT_QUIET
48    RESULT_VARIABLE find_ocaml_result)
49  if( find_ocaml_result EQUAL 0 )
50    set(HAVE_OCAMLOPT TRUE)
51  else()
52    set(HAVE_OCAMLOPT FALSE)
53  endif()
54endif()
55
56find_package_handle_standard_args( OCaml DEFAULT_MSG
57  OCAMLFIND
58  OCAML_VERSION
59  OCAML_STDLIB_PATH)
60
61mark_as_advanced(
62  OCAMLFIND)
63
64function(find_ocamlfind_package pkg)
65  CMAKE_PARSE_ARGUMENTS(ARG "OPTIONAL" "VERSION" "" ${ARGN})
66
67  execute_process(
68    COMMAND "${OCAMLFIND}" "query" "${pkg}" "-format" "%v"
69    RESULT_VARIABLE result
70    OUTPUT_VARIABLE version
71    ERROR_VARIABLE error
72    OUTPUT_STRIP_TRAILING_WHITESPACE
73    ERROR_STRIP_TRAILING_WHITESPACE)
74
75  if( NOT result EQUAL 0 AND NOT ARG_OPTIONAL )
76    message(FATAL_ERROR ${error})
77  endif()
78
79  if( result EQUAL 0 )
80    set(found TRUE)
81  else()
82    set(found FALSE)
83  endif()
84
85  if( found AND ARG_VERSION )
86    if( version VERSION_LESS ARG_VERSION AND ARG_OPTIONAL )
87      # If it's optional and the constraint is not satisfied, pretend
88      # it wasn't found.
89      set(found FALSE)
90    elseif( version VERSION_LESS ARG_VERSION )
91      message(FATAL_ERROR
92              "ocamlfind package ${pkg} should have version ${ARG_VERSION} or newer")
93    endif()
94  endif()
95
96  string(TOUPPER ${pkg} pkg)
97
98  set(HAVE_OCAML_${pkg} ${found}
99      PARENT_SCOPE)
100
101  set(OCAML_${pkg}_VERSION ${version}
102      PARENT_SCOPE)
103endfunction()
104