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