summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorVladislav Vaintroub <vvaintroub@mysql.com>2010-01-26 13:47:34 +0100
committerVladislav Vaintroub <vvaintroub@mysql.com>2010-01-26 13:47:34 +0100
commita8c47397fc3ede7d3452e48baf56bbb9bc28ea8f (patch)
treee3f4d60661a317c145fccf61d530d7c9a4616c1b /cmake
parent28a5ee8f056a0c3423c611969980acfb2e9f98e1 (diff)
downloadmariadb-git-a8c47397fc3ede7d3452e48baf56bbb9bc28ea8f.tar.gz
WL#5161: Implement Mats' suggestion of moving OS specific CMake code to OS specific files, instead of
polluting code with IF(CMAKE_SYSTEM_NAME MATCHES...), first on Windows. cmake/libutils.cmake: Fix the case in MERGE_LIBRARIES, where there is no dependency on OS libraries. cmake/os/Windows.cmake: Move windows specific code to cmake/os/Windows.cmake configure.cmake: Move some Windows code to cmake/os/Windows.cmake
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Makefile.am4
-rw-r--r--cmake/libutils.cmake6
-rw-r--r--cmake/os/Windows.cmake183
3 files changed, 190 insertions, 3 deletions
diff --git a/cmake/Makefile.am b/cmake/Makefile.am
index 600cd442f6f..855af2e982f 100644
--- a/cmake/Makefile.am
+++ b/cmake/Makefile.am
@@ -22,4 +22,6 @@ EXTRA_DIST = \
dtrace_prelink.cmake \
versioninfo.rc.in \
mysql_add_executable.cmake \
- install_layout.cmake
+ install_layout.cmake \
+ build_configurations/mysql_release.cmake \
+ os/Windows.cmake
diff --git a/cmake/libutils.cmake b/cmake/libutils.cmake
index f20e21b8f86..2263b146ed6 100644
--- a/cmake/libutils.cmake
+++ b/cmake/libutils.cmake
@@ -155,8 +155,10 @@ MACRO(MERGE_STATIC_LIBS TARGET OUTPUT_NAME LIBS_TO_MERGE)
ENDIF()
ENDIF()
ENDFOREACH()
- LIST(REMOVE_DUPLICATES OSLIBS)
- TARGET_LINK_LIBRARIES(${TARGET} ${OSLIBS})
+ IF(OSLIBS)
+ LIST(REMOVE_DUPLICATES OSLIBS)
+ TARGET_LINK_LIBRARIES(${TARGET} ${OSLIBS})
+ ENDIF()
# Make the generated dummy source file depended on all static input
# libs. If input lib changes,the source file is touched
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake
new file mode 100644
index 00000000000..8a5ad4359d5
--- /dev/null
+++ b/cmake/os/Windows.cmake
@@ -0,0 +1,183 @@
+# Copyright (C) 2009 Sun Microsystems, Inc
+#
+# 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
+
+# This file includes Windows specific hacks, mostly around compiler flags
+
+INCLUDE (CheckCSourceCompiles)
+INCLUDE (CheckCXXSourceCompiles)
+INCLUDE (CheckStructHasMember)
+INCLUDE (CheckLibraryExists)
+INCLUDE (CheckFunctionExists)
+INCLUDE (CheckCCompilerFlag)
+INCLUDE (CheckCSourceRuns)
+INCLUDE (CheckSymbolExists)
+INCLUDE (CheckTypeSize)
+
+# Optionally read user configuration, generated by configure.js.
+# This is left for backward compatibility reasons only.
+INCLUDE(win/configure.data OPTIONAL)
+
+# OS display name (version_compile_os etc).
+# Used by the test suite to ignore bugs on some platforms,
+IF(CMAKE_SIZEOF_VOID_P MATCHES 8)
+ SET(SYSTEM_TYPE "Win64")
+ELSE()
+ SET(SYSTEM_TYPE "Win32")
+ENDIF()
+
+# Intel compiler is almost Visual C++
+# (same compile flags etc). Set MSVC flag
+IF(CMAKE_C_COMPILER MATCHES "icl")
+ SET(MSVC TRUE)
+ENDIF()
+
+ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
+ADD_DEFINITIONS("-D_WIN32_WINNT=0x0501")
+# Speed up build process excluding unused header files
+ADD_DEFINITIONS("-DWIN32_LEAN_AND_MEAN")
+
+# Adjust compiler and linker flags
+IF(MINGW AND CMAKE_SIZEOF_VOIDP EQUAL 4)
+ # mininal architecture flags, i486 enables GCC atomics
+ ADD_DEFINITIONS(-march=i486)
+ENDIF()
+
+IF(MSVC)
+ # Enable debug info also in Release build, and create PDB to be able to analyze
+ # crashes
+ FOREACH(lang C CXX)
+ SET(CMAKE_${lang}_FLAGS_RELEASE "${CMAKE_${lang}_FLAGS_RELEASE} /Zi")
+ ENDFOREACH()
+ FOREACH(type EXE SHARED MODULE)
+ SET(CMAKE_{type}_LINKER_FLAGS_RELEASE "${CMAKE_${type}_LINKER_FLAGS_RELEASE} /debug")
+ ENDFOREACH()
+
+ # Force static runtime libraries, and remove support for exception handling
+ FOREACH(flag
+ CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO
+ CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_DEBUG_INIT
+ CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG_INIT)
+ STRING(REPLACE "/MD" "/MT" "${flag}" "${${flag}}")
+ STRING(REPLACE "/EHsc" "" "${flag}" "${${flag}}")
+ ENDFOREACH()
+
+ # Fix CMake's predefined huge stack size
+ FOREACH(type EXE SHARED MODULE)
+ STRING(REGEX REPLACE "/STACK:([^ ]+)" "" CMAKE_${type}_LINKER_FLAGS "${CMAKE_${type}_LINKER_FLAGS}")
+ ENDFOREACH()
+
+ ADD_DEFINITIONS(-DPTHREAD_STACK_MIN=1048576)
+ # Mark 32 bit executables large address aware so they can
+ # use > 2GB address space
+ IF(CMAKE_SIZEOF_VOID_P MATCHES 4)
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ ENDIF()
+
+ # Speed up multiprocessor build
+ IF (MSVC_VERSION GREATER 1400)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
+ ENDIF()
+
+ #TODO: update the code and remove the disabled warnings
+ IF (MSVC_VERSION GREATER 1310)
+ ADD_DEFINITIONS(/wd4800 /wd4805)
+ ADD_DEFINITIONS(/wd4996)
+ ENDIF()
+
+ SET (PLATFORM X86)
+ IF(CMAKE_SIZEOF_VOID_P MATCHES 8)
+ # _WIN64 is defined by the compiler itself.
+ # Yet, we define it here again to work around a bug with Intellisense
+ # described here: http://tinyurl.com/2cb428.
+ # Syntax highlighting is important for proper debugger functionality.
+ ADD_DEFINITIONS("-D_WIN64")
+ SET (PLATFORM X64)
+ ENDIF()
+ENDIF()
+
+# Always link with socket library
+LINK_LIBRARIES(ws2_32)
+# ..also for tests
+SET(CMAKE_REQUIRED_LIBRARIES ws2_32)
+
+# System checks
+SET(SIGNAL_WITH_VIO_CLOSE 1) # Something that runtime team needs
+
+# IPv6 constants appeared in Vista SDK first. We need to define them in any case if they are
+# not in headers, to handle dual mode sockets correctly.
+CHECK_SYMBOL_EXISTS(IPPROTO_IPV6 "winsock2.h" HAVE_IPPROTO_IPV6)
+IF(NOT HAVE_IPPROTO_IPV6)
+ SET(HAVE_IPPROTO_IPV6 41)
+ENDIF()
+CHECK_SYMBOL_EXISTS(IPV6_V6ONLY "winsock2.h;ws2ipdef.h" HAVE_IPV6_V6ONLY)
+IF(NOT HAVE_IPV6_V6ONLY)
+ SET(IPV6_V6ONLY 27)
+ENDIF()
+
+# Some standard functions exist there under different
+# names (e.g popen is _popen or strok_r is _strtok_s)
+# If a replacement function exists, HAVE_FUNCTION is
+# defined to 1. CMake variable <function_name> will also
+# be defined to the replacement name.
+# So for example, CHECK_FUNCTION_REPLACEMENT(popen _popen)
+# will define HAVE_POPEN to 1 and set variable named popen
+# to _popen. If the header template, one needs to have
+# cmakedefine popen @popen@ which will expand to
+# define popen _popen after CONFIGURE_FILE
+
+MACRO(CHECK_FUNCTION_REPLACEMENT function replacement)
+ STRING(TOUPPER ${function} function_upper)
+ CHECK_FUNCTION_EXISTS(${function} HAVE_${function_upper})
+ IF(NOT HAVE_${function_upper})
+ CHECK_FUNCTION_EXISTS(${replacement} HAVE_${replacement})
+ IF(HAVE_${replacement})
+ SET(HAVE_${function_upper} 1 )
+ SET(${function} ${replacement})
+ ENDIF()
+ ENDIF()
+ENDMACRO()
+MACRO(CHECK_SYMBOL_REPLACEMENT symbol replacement header)
+ STRING(TOUPPER ${symbol} symbol_upper)
+ CHECK_SYMBOL_EXISTS(${symbol} ${header} HAVE_${symbol_upper})
+ IF(NOT HAVE_${symbol_upper})
+ CHECK_SYMBOL_EXISTS(${replacement} ${header} HAVE_${replacement})
+ IF(HAVE_${replacement})
+ SET(HAVE_${symbol_upper} 1)
+ SET(${symbol} ${replacement})
+ ENDIF()
+ ENDIF()
+ENDMACRO()
+
+CHECK_SYMBOL_REPLACEMENT(S_IROTH _S_IREAD sys/stat.h)
+CHECK_SYMBOL_REPLACEMENT(S_IFIFO _S_IFIFO sys/stat.h)
+CHECK_SYMBOL_REPLACEMENT(SIGQUIT SIGTERM signal.h)
+CHECK_SYMBOL_REPLACEMENT(SIGPIPE SIGINT signal.h)
+CHECK_SYMBOL_REPLACEMENT(isnan _isnan float.h)
+CHECK_SYMBOL_REPLACEMENT(finite _finite float.h)
+CHECK_FUNCTION_REPLACEMENT(popen _popen)
+CHECK_FUNCTION_REPLACEMENT(pclose _pclose)
+CHECK_FUNCTION_REPLACEMENT(access _access)
+CHECK_FUNCTION_REPLACEMENT(strcasecmp _stricmp)
+CHECK_FUNCTION_REPLACEMENT(strncasecmp _strnicmp)
+CHECK_FUNCTION_REPLACEMENT(snprintf _snprintf)
+CHECK_FUNCTION_REPLACEMENT(strtok_r strtok_s)
+CHECK_FUNCTION_REPLACEMENT(strtoll _strtoi64)
+CHECK_FUNCTION_REPLACEMENT(strtoull _strtoui64)
+CHECK_TYPE_SIZE(ssize_t SIZE_OF_SSIZE_T)
+IF(NOT HAVE_SIZE_OF_SSIZE_T)
+ SET(ssize_t SSIZE_T)
+ENDIF()