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