# # Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. # # The MySQL Connector/ODBC is licensed under the terms of the GPLv2 # , like most # MySQL Connectors. There are special exceptions to the terms and # conditions of the GPLv2 as it is applied to this software, see the # FLOSS License Exception # . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published # by the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ########################################################################## PROJECT(MySQL_Connector_ODBC) CMAKE_MINIMUM_REQUIRED(VERSION 2.6.2 FATAL_ERROR) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) FIND_PACKAGE(Threads) SET(CONNECTOR_MAJOR "5") SET(CONNECTOR_MINOR "2") IF(CONNECTOR_MINOR LESS 10) SET(CONNECTOR_MINOR_PADDED "0${CONNECTOR_MINOR}") ELSE(CONNECTOR_MINOR LESS 10) SET(CONNECTOR_MINOR_PADDED "${CONNECTOR_MINOR}") ENDIF(CONNECTOR_MINOR LESS 10) SET(CONNECTOR_PATCH "7") # If driver survives 100th patch this has to be changed IF(CONNECTOR_PATCH LESS 10) SET(CONNECTOR_PATCH_PADDED "000${CONNECTOR_PATCH}") ELSE(CONNECTOR_PATCH LESS 10) SET(CONNECTOR_PATCH_PADDED "00${CONNECTOR_PATCH}") ENDIF(CONNECTOR_PATCH LESS 10) SET(CONNECTOR_LEVEL "") SET(CONNECTOR_QUALITY "GA") SET(CONNECTOR_BASE_VERSION "${CONNECTOR_MAJOR}.${CONNECTOR_MINOR}") SET(CONNECTOR_BASE_PREVIOUS "5.1") SET(CONNECTOR_NUMERIC_VERSION "${CONNECTOR_BASE_VERSION}.${CONNECTOR_PATCH}") SET(CONNECTOR_VERSION "${CONNECTOR_NUMERIC_VERSION}${EXTRA_VERSION_SUFFIX}${CONNECTOR_LEVEL}") #Default is to build both drivers IF(UNICODE OR NOT ANSI) MESSAGE(STATUS "Configuring to build Unicode driver") SET(IS_UNICODE_DRIVER 1) SET(CONNECTOR_DRIVER_TYPE "Unicode") SET(CONNECTOR_DRIVER_TYPE_LIST "Unicode") SET(CONNECTOR_DRIVER_TYPES_SHORT "w") SET(PACKAGE_DRIVER_TYPES_SUFFIX "") ENDIF(UNICODE OR NOT ANSI) IF(ANSI OR NOT UNICODE) MESSAGE(STATUS "Configuring to build ANSI driver") SET(IS_UNICODE_DRIVER ${IS_UNICODE_DRIVER} 0) # We need space separated string IF(UNICODE OR NOT ANSI) SET(CONNECTOR_DRIVER_TYPE "${CONNECTOR_DRIVER_TYPE} ANSI") ELSE(UNICODE OR NOT ANSI) SET(CONNECTOR_DRIVER_TYPE "ANSI") ENDIF(UNICODE OR NOT ANSI) LIST(APPEND CONNECTOR_DRIVER_TYPE_LIST "ANSI") SET(CONNECTOR_DRIVER_TYPES_SHORT ${CONNECTOR_DRIVER_TYPES_SHORT} "a") SET(PACKAGE_DRIVER_TYPES_SUFFIX ${PACKAGE_DRIVER_TYPE_SUFFIX} "-ansi") ENDIF(ANSI OR NOT UNICODE) SET(EDIT_WARNING_MESSAGE "Please do not edit this file - it is generated by cmake. Edit its source file instead.") LIST(LENGTH IS_UNICODE_DRIVER DRIVERS_COUNT) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/VersionInfo.h.cmake ${CMAKE_SOURCE_DIR}/VersionInfo.h @ONLY) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/macosx/postflight.in ${CMAKE_SOURCE_DIR}/scripts/macosx/postflight @ONLY) IF(WIN32) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/Install.bat.cmake ${CMAKE_SOURCE_DIR}/Install.bat @ONLY) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/Uninstall.bat.cmake ${CMAKE_SOURCE_DIR}/Uninstall.bat @ONLY) ENDIF(WIN32) #SET(CMAKE_VERBOSE_MAKEFILE ON) IF(NOT WIN32) SET(DISABLE_GUI 1) ENDIF(NOT WIN32) #-------------- find mysql -------------------- INCLUDE(${CMAKE_SOURCE_DIR}/cmake/FindMySQL.cmake) #----------------------------------------------------- #-------------- unixodbc/iodbc/win ------------------- IF(WIN32) SET(ODBCLIB odbc32) IF (ODBCCP32_LIB) SET(ODBCINSTLIB ${ODBCCP32_LIB}) ELSE (ODBCCP32_LIB) SET(ODBCINSTLIB odbccp32) ENDIF (ODBCCP32_LIB) MESSAGE(STATUS "ODBC Installation Library: ${ODBCINSTLIB}") ELSE(WIN32) IF(WITH_UNIXODBC) SET(ODBCLIB odbc) SET(ODBCINSTLIB odbcinst) ELSE(WITH_UNIXODBC) SET(ODBCLIB iodbc) SET(ODBCINSTLIB iodbcinst) ENDIF(WITH_UNIXODBC) # FindODBC uses ODBCLIB and ODBCINSTLIB in some cases INCLUDE(cmake/FindODBC.cmake) IF(WITH_UNIXODBC) TRY_COMPILE(COMPILE_RESULT ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/havelpcwstr.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES='${ODBC_INCLUDES} ${ODBC_INCLUDE_DIR}'") MESSAGE(STATUS "Checking if LPCWSTR type is present - ${COMPILE_RESULT}") IF(COMPILE_RESULT) ADD_DEFINITIONS(-DHAVE_LPCWSTR) ADD_DEFINITIONS(-DUSE_UNIXODBC) ENDIF(COMPILE_RESULT) ELSE(WITH_UNIXODBC) ADD_DEFINITIONS(-DHAVE_SQLGETPRIVATEPROFILESTRINGW) #---- if it is not UnixODBC we assume iODBC ------- ADD_DEFINITIONS(-DUSE_IODBC) ENDIF(WITH_UNIXODBC) INCLUDE(CheckFunctionExists) CHECK_FUNCTION_EXISTS(dlopen DLOPEN_IN_LIBC) SET(DL_INCLUDES) SET(DL_LFLAGS) SET(DL_LIBS) IF(NOT DLOPEN_IN_LIBC) FIND_LIBRARY(DL_LIBS dl) ENDIF(NOT DLOPEN_IN_LIBC) ENDIF(WIN32) #----------------------------------------------------- #-------- configuring paths to odbc heders for compatibility checks --------- CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/sqlcolattrib1.c.cmake ${CMAKE_BINARY_DIR}/cmake/sqlcolattrib1.c @ONLY) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/sqlcolattrib2.c.cmake ${CMAKE_BINARY_DIR}/cmake/sqlcolattrib2.c @ONLY) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/sqlparamopt1.c.cmake ${CMAKE_BINARY_DIR}/cmake/sqlparamopt1.c @ONLY) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/sqlparamopt2.c.cmake ${CMAKE_BINARY_DIR}/cmake/sqlparamopt2.c @ONLY) #----------------------------------------------------- #------------------ check compatibility--------------- TRY_COMPILE(COMPILE_RESULT ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/cmake/sqlcolattrib1.c) MESSAGE(STATUS "Checking if SQLColAttribute last arg is compatible with SQLLEN* - ${COMPILE_RESULT}") IF(COMPILE_RESULT) ADD_DEFINITIONS(-DUSE_SQLCOLATTRIBUTE_SQLLEN_PTR) ELSE(COMPILE_RESULT) TRY_COMPILE(COMPILE_RESULT1 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/cmake/sqlcolattrib2.c) MESSAGE(STATUS "Checking if SQLColAttribute last arg is compatible with SQLPOINTER - ${COMPILE_RESULT1}") IF(COMPILE_RESULT1) ADD_DEFINITIONS(-DUSE_SQLCOLATTRIBUTE_SQLPOINTER) ELSE(COMPILE_RESULT1) # By default using SQLLEN parameter ADD_DEFINITIONS(-DUSE_SQLCOLATTRIBUTE_SQLLEN_PTR) ENDIF(COMPILE_RESULT1) ENDIF(COMPILE_RESULT) TRY_COMPILE(COMPILE_RESULT ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/cmake/sqlparamopt1.c) MESSAGE(STATUS "Checking if SQLParamOptions() 2nd and 3rd arg is compatible with SQLULEN - ${COMPILE_RESULT}") IF(COMPILE_RESULT) ADD_DEFINITIONS(-DUSE_SQLPARAMOPTIONS_SQLULEN_PTR) ELSE(COMPILE_RESULT) TRY_COMPILE(COMPILE_RESULT1 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/cmake/sqlparamopt2.c) MESSAGE(STATUS "Checking if SQLParamOptions() 2nd and 3rd arg is compatible with SQLUINTEGER - ${COMPILE_RESULT1}") IF(COMPILE_RESULT1) ADD_DEFINITIONS(-DUSE_SQLPARAMOPTIONS_SQLUINTEGER_PTR) ELSE(COMPILE_RESULT1) # SQLULEN is a default MESSAGE(STATUS "Apparently odbc headers could not be found. 2nd and 3rd parameters assumed to be (*)SQLULEN by default") ADD_DEFINITIONS(-DUSE_SQLPARAMOPTIONS_SQLULEN_PTR) ENDIF(COMPILE_RESULT1) ENDIF(COMPILE_RESULT) #----------------------------------------------------- IF(NOT NO_THREADS) MESSAGE(STATUS "Enabling threads support") ADD_DEFINITIONS(-DTHREAD) ENDIF(NOT NO_THREADS) #------------ build options for windows -------------- IF(WIN32) REMOVE_DEFINITIONS(-DUNICODE) ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) ADD_DEFINITIONS(-DENGLISH -D_USERDLL) ADD_DEFINITIONS(-D_WIN32 -DWIN32 -D_WINDOWS -D__WIN__) #Since 5.5.13 libmysql introduces dependency on Secur32.lib FILE(STRINGS "${MYSQL_INCLUDE_DIR}\\mysql_version.h" mysql_version REGEX "^\#define[ \t]+MYSQL_VERSION_ID") STRING(REGEX REPLACE "^\#define[ \t]+MYSQL_VERSION_ID[ \t]+([0-9]+)" "\\1" MYSQL_CLIENT_VERSION "${mysql_version}") IF(MYSQL_CLIENT_VERSION GREATER 50512) MESSAGE(STATUS "MySQL client lib(version ${MYSQL_CLIENT_VERSION}) requires Secure32.lib - TRUE") SET(SECURE32_LIB Secur32) ENDIF(MYSQL_CLIENT_VERSION GREATER 50512) # edits for all config build flags FOREACH(TYPE C CXX) # makefiles use blank configuration FOREACH(CFG "_DEBUG" "_MINSIZEREL" "_RELEASE" "_RELWITHDEBINFO") SET(NEW_FLAGS "${CMAKE_${TYPE}_FLAGS${CFG}}") # fix up static libc flags #STRING(REPLACE "/MD" "/MT" NEW_FLAGS "${NEW_FLAGS}") # Add some additional help for debug builds IF(CMAKE_BUILD_TYPE STREQUAL "Debug") STRING(REPLACE "/Zi" "/ZI" NEW_FLAGS "${NEW_FLAGS}") SET(NEW_FLAGS "${NEW_FLAGS} /RTC1 /RTCc") ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") # *FORCE* to override whats already placed into the cache SET(CMAKE_${TYPE}_FLAGS${CFG} "${NEW_FLAGS}" CACHE STRING "CMAKE_${TYPE}_FLAGS${CFG} (overwritten for odbc)" FORCE) ENDFOREACH(CFG) ENDFOREACH(TYPE) ELSE(WIN32) ADD_DEFINITIONS(-D_UNIX_) ENDIF(WIN32) #----------------------------------------------------- SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin") SET(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib") SET(LIB_SUBDIR "lib") IF(RPM_BUILD AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") SET(LIB_SUBDIR "lib64") ENDIF() INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) ADD_SUBDIRECTORY(util) ADD_SUBDIRECTORY(driver) IF(NOT DISABLE_GUI) ADD_SUBDIRECTORY(setupgui) ENDIF(NOT DISABLE_GUI) ADD_SUBDIRECTORY(dltest) ADD_SUBDIRECTORY(installer) ADD_SUBDIRECTORY(test) ############################################################################## # # Packaging # ############################################################################## # Some stuff for building RPMs, that is not using CPack # RPMs doesn't allow "-" in version, so we use like "5.3.0_alpha" STRING(REPLACE "-" "_" CONNECTOR_NODASH_VERSION "${CONNECTOR_VERSION}") IF(UNIX) EXECUTE_PROCESS(COMMAND "date" "+%Y" OUTPUT_VARIABLE CURRENT_YEAR OUTPUT_STRIP_TRAILING_WHITESPACE) ENDIF() CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/myodbc3.spec.sh ${CMAKE_SOURCE_DIR}/myodbc3.spec @ONLY) # The rest is mainly about CPack SET(CPACK_PACKAGE_VERSION_MAJOR ${CONNECTOR_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${CONNECTOR_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${CONNECTOR_PATCH}) IF(NOT EXTRA_NAME_SUFFIX) SET(EXTRA_NAME_SUFFIX "") ENDIF(NOT EXTRA_NAME_SUFFIX) IF(NOT EXTRA_NAME_SUFFIX2) SET(EXTRA_NAME_SUFFIX2 "") ENDIF(NOT EXTRA_NAME_SUFFIX2) SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Connector/ODBC ${CONNECTOR_BASE_VERSION}, a library for connecting to MySQL servers.") SET(CPACK_PACKAGE_NAME "mysql-connector-odbc${EXTRA_NAME_SUFFIX}") IF(EXISTS "${CMAKE_SOURCE_DIR}/COPYING") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") ELSE(EXISTS "${CMAKE_SOURCE_DIR}/COPYING") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.mysql") ENDIF(EXISTS "${CMAKE_SOURCE_DIR}/COPYING") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README") SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CONNECTOR_VERSION}-src") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}-${CONNECTOR_VERSION}${EXTRA_NAME_SUFFIX2}${PACKAGE_DRIVER_TYPE_SUFFIX}-${CONNECTOR_PLATFORM}") IF(WIN32) SET(CPACK_GENERATOR "ZIP") SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-noinstall-${CONNECTOR_VERSION}${EXTRA_NAME_SUFFIX2}${PACKAGE_DRIVER_TYPE_SUFFIX}-${CONNECTOR_PLATFORM}") ELSE(WIN32) SET(CPACK_GENERATOR "TGZ") SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") ENDIF(WIN32) SET(CPACK_SOURCE_IGNORE_FILES \\\\.bzr/ \\\\.bzr-mysql \\\\.bzrignore CMakeCache\\\\.txt CPackSourceConfig\\\\.cmake CPackConfig\\\\.cmake VersionInfo\\\\.h$ postflight$ /cmake_install\\\\.cmake /CTestTestfile\\\\.cmake /CMakeFiles/ /_CPack_Packages/ Makefile$ cmake/sql.*\\\\.c$ ) #------------ Installation --------------------------- IF(WIN32) # For conveninence copy (un)install.bat scripts to the build # directory to ease testing. CONFIGURE_FILE(Install.bat ${CMAKE_BINARY_DIR}/Install.bat COPYONLY) CONFIGURE_FILE(Uninstall.bat ${CMAKE_BINARY_DIR}/Uninstall.bat COPYONLY) # TODO: line-ending conversions unix->dos INSTALL(FILES ChangeLog DESTINATION . RENAME ChangeLog.txt) INSTALL(FILES README DESTINATION . RENAME README.txt) INSTALL(FILES README.debug DESTINATION . RENAME README.debug.txt) INSTALL(FILES INSTALL DESTINATION . RENAME INSTALL.txt) INSTALL(FILES INSTALL.win DESTINATION . RENAME INSTALL.win.txt) IF(EXISTS "${CMAKE_SOURCE_DIR}/COPYING") INSTALL(FILES COPYING DESTINATION . RENAME COPYING.txt) ELSE() INSTALL(FILES LICENSE.mysql DESTINATION . RENAME LICENSE.mysql.txt) ENDIF() INSTALL(FILES Install.bat DESTINATION .) INSTALL(FILES Uninstall.bat DESTINATION .) # Install all .pdb files to enable debugging. Note that what build # type and what sub directory the binaries ends up in, like # "Release" and "Debug", is not determined until we run "devenv" or # similar. So when running "cmake" we don't know the location. We # can't test for the location here, a IF(EXISTS ...) is run at # "cmake" invocation time, not when we are to install. So we do a # bit of a hack here until finding a better solution. INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/bin/RelWithDebInfo/ ${PROJECT_BINARY_DIR}/bin/Debug/ DESTINATION bin FILES_MATCHING PATTERN *.pdb ) INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/lib/RelWithDebInfo/ ${PROJECT_BINARY_DIR}/lib/Debug/ DESTINATION lib FILES_MATCHING PATTERN *.pdb ) ELSE(WIN32) INSTALL(FILES ChangeLog DESTINATION .) INSTALL(FILES README DESTINATION .) INSTALL(FILES README.debug DESTINATION .) INSTALL(FILES INSTALL DESTINATION .) IF(EXISTS "${CMAKE_SOURCE_DIR}/COPYING") INSTALL(FILES COPYING DESTINATION .) ELSE() INSTALL(FILES LICENSE.mysql DESTINATION .) ENDIF() ENDIF(WIN32) INSTALL(FILES Licenses_for_Third-Party_Components.txt DESTINATION .) INCLUDE(CPack)