Home | History | Annotate | Download | only in llvm
      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 
     29 include( FindPackageHandleStandardArgs )
     30 
     31 find_program(OCAMLFIND
     32              NAMES ocamlfind)
     33 
     34 if( 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()
     54 endif()
     55 
     56 find_package_handle_standard_args( OCaml DEFAULT_MSG
     57   OCAMLFIND
     58   OCAML_VERSION
     59   OCAML_STDLIB_PATH)
     60 
     61 mark_as_advanced(
     62   OCAMLFIND)
     63 
     64 function(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)
    103 endfunction()
    104