Last active
December 24, 2022 21:23
-
-
Save ibre5041/fb9ce9b71afa50f8fde2 to your computer and use it in GitHub Desktop.
CMake: Configure Oracle libraries
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#.rst: | |
# FindOracle | |
# ---------- | |
# | |
# Configure Oracle libraries | |
# | |
# ORACLE_FOUND - system has Oracle OCI | |
# ORACLE_HAS_XML - Oracle has XDK support(thick client installed) | |
# ORACLE_INCLUDES - where to find oci.h | |
# ORACLE_LIBRARIES - the libraries to link against to use Oracle OCI | |
# | |
# Components: CLNTSH, CLNTST, OCCI, XML, OCIEI | |
# CLNTSH is enabled by default | |
# for example: FIND_PACKAGE(Oracle REQUIRED CLNTSH OCCI) | |
# | |
# This module will set the following variables in your project: | |
# | |
# ``ORACLE_FOUND`` | |
# Oracle installation detected (InstantClient or "thick" client) | |
# ``ORACLE_INCLUDES`` | |
# Oracle include directory (where oci.h resides) | |
# ``ORACLE_LIBRARY_CLNTSH`` | |
# Library libclntsh.so.* | |
# ``ORACLE_LIBRARY_CLNTST`` | |
# Library libclntst??.a (not present in InstantClient, must be generated by executing genclntst) | |
# ``ORACLE_LIBRARY_OCCI`` | |
# OCCI C++ client library | |
# ``ORACLE_LIBRARY_XML`` | |
# Oracle XMLTYPE library libxml?.a (usually static, only present in thick client) | |
# ``ORACLE_LIBRARIES`` | |
# All Oracle libraries detected libclntsh.so.*, libociei.so.8 libxml.a .... | |
# ``ORACLE_OCI_VERSION`` | |
# This is set to 8i, 9i, 10g, 11g, 12c | |
# TOra Project: Configure Oracle libraries | |
# | |
# Copyright (c) 2007 Petr Vanek <[email protected]> | |
# Copyright (c) 2016 Ivan Brezina <[email protected]> | |
# Redistribution and use is allowed according to the terms of the BSD license. | |
# | |
SET(ORACLE_FOUND "NO") | |
SET(ORACLE_HAS_XML "NO") | |
FILE(TO_CMAKE_PATH "$ENV{ORACLE_HOME}" ORACLE_HOME) | |
GET_FILENAME_COMPONENT(XE_HOME "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_XE;ORACLE_HOME]" ABSOLUTE CACHE) | |
# "components" handling. It enables to find various independent libraries, | |
IF( Oracle_FIND_COMPONENTS ) | |
FOREACH( component ${Oracle_FIND_COMPONENTS} ) | |
STRING( TOUPPER ${component} _COMPONENT ) | |
SET( ORACLE_USE_${_COMPONENT} 1 ) | |
ENDFOREACH( component ) | |
# legacy behaviour | |
IF (NOT ORACLE_USE_CLNTSH) | |
SET(ORACLE_USE_CLNTSH 1) | |
ENDIF (NOT ORACLE_USE_CLNTSH) | |
ENDIF( Oracle_FIND_COMPONENTS ) | |
IF (ORACLE_PATH_INCLUDES) | |
SET (ORACLE_INCLUDES_LOCATION ${ORACLE_PATH_INCLUDES}) | |
ELSE (ORACLE_PATH_INCLUDES) | |
SET (ORACLE_INCLUDES_LOCATION | |
${ORACLE_HOME}/rdbms/public | |
${ORACLE_HOME}/include | |
# xdk | |
${ORACLE_HOME}/xdk/include | |
# sdk | |
${ORACLE_HOME}/sdk/include/ | |
# xe on windows | |
${ORACLE_HOME}/OCI/include/ | |
# instant client from rpm | |
/usr/include/oracle/11.2/client${LIB_SUFFIX}/ | |
/usr/include/oracle/12.1/client${LIB_SUFFIX}/ | |
# instantclient on OS X from macports | |
/opt/local/lib/oracle/sdk/include/ | |
# Oracle XE Windows | |
${XE_HOME}/oci/include/ | |
) | |
ENDIF (ORACLE_PATH_INCLUDES) | |
IF (ORACLE_PATH_LIB) | |
SET (ORACLE_LIB_LOCATION ${ORACLE_PATH_LIB}) | |
ELSE (ORACLE_PATH_LIB) | |
SET (ORACLE_LIB_LOCATION | |
# TODO add 32/64bit version here (lib32/lib64 on some platforms) | |
${ORACLE_HOME}/lib | |
# xe on windows | |
${ORACLE_HOME}/OCI/lib/MSVC/ | |
${ORACLE_HOME} | |
# InstantClient on WinXP | |
${ORACLE_HOME}/sdk/lib/msvc/ | |
# Instant client from rpm | |
/usr/lib${LIB_SUFFIX}/ | |
/usr/lib/oracle/11.2/client${LIB_SUFFIX}/lib/ | |
/usr/lib/oracle/12.1/client${LIB_SUFFIX}/lib/ | |
# instant client on OS X from macports | |
/opt/local/lib/oracle/ | |
# Oracle XE Windows | |
${XE_HOME}/oci/lib/MSVC/ | |
) | |
ENDIF (ORACLE_PATH_LIB) | |
FIND_PATH( | |
ORACLE_INCLUDES | |
oci.h | |
${ORACLE_INCLUDES_LOCATION} | |
NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
SET(FORCE_ERROR 0) | |
# guess OCI version | |
# we need it before lib checking because of OS X bugs in instant client (see below) | |
IF (NOT DEFINED ORACLE_OCI_VERSION AND ORACLE_INCLUDES) | |
TRY_RUN(OCIVER_TYPE OCIVER_COMPILED | |
${CMAKE_BINARY_DIR} | |
${CMAKE_SOURCE_DIR}/cmake/modules/OCIVersion.c | |
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${ORACLE_INCLUDES}" | |
OUTPUT_VARIABLE OCIVER) | |
IF (${OCIVER_TYPE} GREATER "120") | |
SET(ORACLE_OCI_VERSION "12C") | |
ELSEIF (${OCIVER_TYPE} GREATER "110") | |
SET(ORACLE_OCI_VERSION "11G") | |
ELSEIF (${OCIVER_TYPE} EQUAL "102") | |
SET(ORACLE_OCI_VERSION "10G_R2") | |
ELSEIF (${OCIVER_TYPE} EQUAL "101") | |
SET(ORACLE_OCI_VERSION "10G") | |
ELSEIF (${OCIVER_TYPE} EQUAL "91") | |
SET(ORACLE_OCI_VERSION "9") | |
ELSEIF (${OCIVER_TYPE} EQUAL "92") | |
SET(ORACLE_OCI_VERSION "9") | |
ELSEIF (NOT ${OCIVER_TYPE} GREATER "90") | |
SET(ORACLE_OCI_VERSION "8I") | |
ELSE (${OCIVER_TYPE} GREATER "110") | |
SET(ORACLE_OCI_VERSION "10G_R2") | |
ENDIF () | |
MESSAGE(STATUS "Guessed ORACLE_OCI_VERSION value: ${ORACLE_OCI_VERSION} for ${OCIVER_TYPE}") | |
IF (APPLE) | |
IF (${OCIVER_TYPE} LESS 110) | |
SET(ORACLE_USE_OCIEI 1) | |
message(STATUS " APPLE requires libociei for instantclient < 11, enforcing ociei") | |
ENDIF () | |
ENDIF (APPLE) | |
ENDIF (NOT DEFINED ORACLE_OCI_VERSION AND ORACLE_INCLUDES) | |
IF (ORACLE_USE_CLNTSH) | |
# The NO_DEFAULT_PATH is necessary here in the case there is Oracle DB | |
# *and* instant client installed. The order is given in ORACLE_LIB_LOCATION. | |
# See above. | |
FIND_LIBRARY( | |
ORACLE_LIBRARY_CLNTSH | |
NAMES libclntsh clntsh oci | |
PATHS ${ORACLE_LIB_LOCATION} | |
NO_DEFAULT_PATH | |
#NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_LIBRARY_CLNTSH) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "CLNTSH") | |
ENDIF (Oracle_FIND_REQUIRED) | |
set(ORACLE_LIBRARY_CLNTSH "") | |
ENDIF (NOT ORACLE_LIBRARY_CLNTSH) | |
ENDIF (ORACLE_USE_CLNTSH) | |
IF (ORACLE_USE_CLNTST) | |
# The NO_DEFAULT_PATH is necessary here in the case there is Oracle DB | |
# *and* instant client installed. The order is given in ORACLE_LIB_LOCATION. | |
# See above. | |
# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES | |
IF(WIN32) | |
set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) | |
ELSE() | |
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ) | |
ENDIF() | |
MESSAGE(STATUS "Looking for libclntst") | |
FIND_LIBRARY( | |
ORACLE_LIBRARY_CLNTST | |
NAMES libclntst libclntst9 libclntst10 libclntst11 libclntst12 clntst clntst9 clntst10 clntst11 clntst12 | |
PATHS ${ORACLE_LIB_LOCATION} | |
NO_DEFAULT_PATH | |
#NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_LIBRARY_CLNTST) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "CLNTST") | |
ENDIF (Oracle_FIND_REQUIRED) | |
set(ORACLE_LIBRARY_CLNTST "") | |
ENDIF (NOT ORACLE_LIBRARY_CLNTST) | |
ENDIF (ORACLE_USE_CLNTST) | |
#set (ORACLE_LIBRARY_OCCI "") | |
IF (ORACLE_USE_OCCI) | |
FIND_LIBRARY( | |
ORACLE_LIBRARY_OCCI | |
NAMES libocci occi | |
PATHS ${ORACLE_LIB_LOCATION} | |
NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_LIBRARY_OCCI) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "OCCI") | |
ENDIF (Oracle_FIND_REQUIRED) | |
set (ORACLE_LIBRARY_OCCI "") | |
ENDIF (NOT ORACLE_LIBRARY_OCCI) | |
ENDIF (ORACLE_USE_OCCI) | |
IF (ORACLE_USE_XML) | |
FIND_PATH( | |
ORACLE_INCLUDES_XML | |
xml.h | |
${ORACLE_INCLUDES_LOCATION} | |
NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_INCLUDES_XML) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "XML") | |
ENDIF (Oracle_FIND_REQUIRED) | |
set (ORACLE_INCLUDES_XML "") | |
ENDIF (NOT ORACLE_INCLUDES_XML) | |
FIND_LIBRARY( | |
ORACLE_LIBRARY_XML | |
NAMES libxml xml libxml10 xml10 libxml11 xml11 oraxml10 oraxml11 | |
PATHS ${ORACLE_LIB_LOCATION} | |
NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_LIBRARY_XML) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "XML") | |
endif (Oracle_FIND_REQUIRED) | |
set (ORACLE_LIBRARY_XML "") | |
ENDIF (NOT ORACLE_LIBRARY_XML) | |
ENDIF (ORACLE_USE_XML) | |
IF (ORACLE_USE_OCIEI) | |
FIND_LIBRARY(ORACLE_LIBRARY_OCIEI | |
NAMES libociei ociei | |
PATHS ${ORACLE_LIB_LOCATION} | |
NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH | |
) | |
IF (NOT ORACLE_LIBRARY_OCIEI) | |
IF (Oracle_FIND_REQUIRED) | |
SET(FORCE_ERROR "OCIEI") | |
ENDIF (Oracle_FIND_REQUIRED) | |
set (ORACLE_LIBRARY_OCIEI "") | |
ENDIF (NOT ORACLE_LIBRARY_OCIEI) | |
ENDIF (ORACLE_USE_OCIEI) | |
IF (NOT FORCE_ERROR) | |
SET (ORACLE_LIBRARIES ${ORACLE_LIBRARY_CLNTSH} ${ORACLE_LIBRARY_OCCI} ${ORACLE_LIBRARY_XML} ${ORACLE_LIBRARY_OCIEI}) | |
ENDIF (NOT FORCE_ERROR) | |
MESSAGE(STATUS "ORACLE_LIBRARY_CLNTSH ${ORACLE_LIBRARY_CLNTSH}") | |
MESSAGE(STATUS "ORACLE_LIBRARY_CLNTST ${ORACLE_LIBRARY_CLNTST}") | |
MESSAGE(STATUS "ORACLE_LIBRARY_OCCI ${ORACLE_LIBRARY_OCCI}") | |
MESSAGE(STATUS "ORACLE_LIBRARY_XML ${ORACLE_LIBRARY_XML}") | |
MESSAGE(STATUS "ORACLE_LIBRARY_OCIEI ${ORACLE_LIBRARY_OCIEI}") | |
IF (ORACLE_INCLUDES AND ORACLE_LIBRARIES) | |
SET(ORACLE_FOUND "YES") | |
ENDIF (ORACLE_INCLUDES AND ORACLE_LIBRARIES) | |
IF (ORACLE_INCLUDES_XML AND ORACLE_LIBRARY_XML) | |
ADD_DEFINITIONS(-DORACLE_HAS_XML) | |
SET(ORACLE_HAS_XML "YES") | |
LIST(APPEND ORACLE_INCLUDES ${ORACLE_INCLUDES_XML}) | |
ENDIF (ORACLE_INCLUDES_XML AND ORACLE_LIBRARY_XML) | |
MESSAGE(STATUS "Found Oracle: ${ORACLE_LIBRARIES} (ORACLE_HOME='${ORACLE_HOME}')") | |
MESSAGE(STATUS " includes: ${ORACLE_INCLUDES}") | |
MESSAGE(STATUS "Found XML Oracle: ${ORACLE_INCLUDES_XML} ${ORACLE_LIBRARY_XML}") | |
IF (ORACLE_FOUND) | |
# there *must* be OCI version defined for internal libraries | |
IF (ORACLE_OCI_VERSION) | |
ADD_DEFINITIONS(-DORACLE_OCI_VER_${ORACLE_OCI_VERSION}) | |
ELSE (ORACLE_OCI_VERSION) | |
MESSAGE(FATAL_ERROR "Set -DORACLE_OCI_VER_* for your oci. [8, 8I, 9I, 10G, 10G_R2, 11G, 12C]") | |
ENDIF (ORACLE_OCI_VERSION) | |
ELSE (ORACLE_FOUND) | |
MESSAGE(STATUS "Oracle not found.") | |
MESSAGE(STATUS "Oracle: You can specify includes: -DORACLE_PATH_INCLUDES=/usr/include/oracle/10.2.0.3/client") | |
MESSAGE(STATUS " currently found includes: ${ORACLE_INCLUDES}") | |
MESSAGE(STATUS "Oracle: You can specify libs: -DORACLE_PATH_LIB=/usr/lib/oracle/10.2.0.3/client/lib") | |
MESSAGE(STATUS " currently found libs: ${ORACLE_LIBRARIES}") | |
IF (FORCE_ERROR) | |
MESSAGE(STATUS "Failed module info: ${FORCE_ERROR}") | |
ENDIF (FORCE_ERROR) | |
IF (Oracle_FIND_REQUIRED) | |
MESSAGE(FATAL_ERROR "Could not find Oracle library") | |
ELSE (Oracle_FIND_REQUIRED) | |
# setup the variables for silent continue | |
SET (ORACLE_INCLUDES "") | |
ENDIF (Oracle_FIND_REQUIRED) | |
ENDIF (ORACLE_FOUND) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment