|  | # CMake find_package() module for the OCaml language. | 
|  | # Assumes ocamlfind will be used for compilation. | 
|  | # http://ocaml.org/ | 
|  | # | 
|  | # Example usage: | 
|  | # | 
|  | # find_package(OCaml) | 
|  | # | 
|  | # If successful, the following variables will be defined: | 
|  | # OCAMLFIND | 
|  | # OCAML_VERSION | 
|  | # OCAML_STDLIB_PATH | 
|  | # HAVE_OCAMLOPT | 
|  | # | 
|  | # Also provides find_ocamlfind_package() macro. | 
|  | # | 
|  | # Example usage: | 
|  | # | 
|  | # find_ocamlfind_package(ctypes) | 
|  | # | 
|  | # In any case, the following variables are defined: | 
|  | # | 
|  | # HAVE_OCAML_${pkg} | 
|  | # | 
|  | # If successful, the following variables will be defined: | 
|  | # | 
|  | # OCAML_${pkg}_VERSION | 
|  |  | 
|  | include( FindPackageHandleStandardArgs ) | 
|  |  | 
|  | find_program(OCAMLFIND | 
|  | NAMES ocamlfind) | 
|  |  | 
|  | if( OCAMLFIND ) | 
|  | execute_process( | 
|  | COMMAND ${OCAMLFIND} ocamlc -version | 
|  | OUTPUT_VARIABLE OCAML_VERSION | 
|  | OUTPUT_STRIP_TRAILING_WHITESPACE) | 
|  |  | 
|  | execute_process( | 
|  | COMMAND ${OCAMLFIND} ocamlc -where | 
|  | OUTPUT_VARIABLE OCAML_STDLIB_PATH | 
|  | OUTPUT_STRIP_TRAILING_WHITESPACE) | 
|  |  | 
|  | execute_process( | 
|  | COMMAND ${OCAMLFIND} ocamlc -version | 
|  | OUTPUT_QUIET | 
|  | RESULT_VARIABLE find_ocaml_result) | 
|  | if( find_ocaml_result EQUAL 0 ) | 
|  | set(HAVE_OCAMLOPT TRUE) | 
|  | else() | 
|  | set(HAVE_OCAMLOPT FALSE) | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | find_package_handle_standard_args( OCaml DEFAULT_MSG | 
|  | OCAMLFIND | 
|  | OCAML_VERSION | 
|  | OCAML_STDLIB_PATH) | 
|  |  | 
|  | mark_as_advanced( | 
|  | OCAMLFIND) | 
|  |  | 
|  | function(find_ocamlfind_package pkg) | 
|  | CMAKE_PARSE_ARGUMENTS(ARG "OPTIONAL" "VERSION" "" ${ARGN}) | 
|  |  | 
|  | execute_process( | 
|  | COMMAND "${OCAMLFIND}" "query" "${pkg}" "-format" "%v" | 
|  | RESULT_VARIABLE result | 
|  | OUTPUT_VARIABLE version | 
|  | ERROR_VARIABLE error | 
|  | OUTPUT_STRIP_TRAILING_WHITESPACE | 
|  | ERROR_STRIP_TRAILING_WHITESPACE) | 
|  |  | 
|  | if( NOT result EQUAL 0 AND NOT ARG_OPTIONAL ) | 
|  | message(FATAL_ERROR ${error}) | 
|  | endif() | 
|  |  | 
|  | if( result EQUAL 0 ) | 
|  | set(found TRUE) | 
|  | else() | 
|  | set(found FALSE) | 
|  | endif() | 
|  |  | 
|  | if( found AND ARG_VERSION ) | 
|  | if( version VERSION_LESS ARG_VERSION AND ARG_OPTIONAL ) | 
|  | # If it's optional and the constraint is not satisfied, pretend | 
|  | # it wasn't found. | 
|  | set(found FALSE) | 
|  | elseif( version VERSION_LESS ARG_VERSION ) | 
|  | message(FATAL_ERROR | 
|  | "ocamlfind package ${pkg} should have version ${ARG_VERSION} or newer") | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | string(TOUPPER ${pkg} pkg) | 
|  |  | 
|  | set(HAVE_OCAML_${pkg} ${found} | 
|  | PARENT_SCOPE) | 
|  |  | 
|  | set(OCAML_${pkg}_VERSION ${version} | 
|  | PARENT_SCOPE) | 
|  | endfunction() |