summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2021-05-09 23:45:24 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2021-05-09 23:51:18 +0200
commitbc64a03c3a4beb046f023886d722232d63d38568 (patch)
tree2e563cbac2a7ac598af98419a2bff81ce54cd70f
parentf33e8e4a955ac54de39faa10d72c26f36005e916 (diff)
downloadmariadb-git-bc64a03c3a4beb046f023886d722232d63d38568.tar.gz
Windows - Fix CMAKE_INTERPROCEDURAL_OPTIMIZATION build with MSVC
If IPO is enabled, MSVC compiles with /GL which is not compatible with cmake's WINDOWS_EXPORT_ALL_SYMBOLS. Since server.dll can't autoexport symbols from /GL compiled objects, IPO must be disabled for dbug, string,mysys, and sql targets (in case we build "plugin" DLLs that need server.dll's symbols)
-rw-r--r--cmake/libutils.cmake9
-rw-r--r--sql/CMakeLists.txt8
-rw-r--r--sql/main.cc10
-rw-r--r--sql/winmain.cc14
4 files changed, 29 insertions, 12 deletions
diff --git a/cmake/libutils.cmake b/cmake/libutils.cmake
index 4c8401971f6..f8eaf082448 100644
--- a/cmake/libutils.cmake
+++ b/cmake/libutils.cmake
@@ -368,7 +368,12 @@ ENDFUNCTION()
# for some static libraries.
FUNCTION (MAYBE_DISABLE_IPO target)
- IF(MSVC AND NOT CLANG_CL)
- SET_TARGET_PROPERTIES(${target} PROPERTIES INTERPROCEDURAL_OPTIMIZATION OFF)
+ IF(MSVC AND (NOT CLANG_CL) AND (NOT WITHOUT_DYNAMIC_PLUGINS))
+ SET_TARGET_PROPERTIES(${target} PROPERTIES
+ INTERPROCEDURAL_OPTIMIZATION OFF
+ INTERPROCEDURAL_OPTIMIZATION_DEBUG OFF
+ INTERPROCEDURAL_OPTIMIZATION_RELEASE OFF
+ INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO OFF
+ INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL OFF)
ENDIF()
ENDFUNCTION()
diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt
index 6fae6fcef95..be26c09270f 100644
--- a/sql/CMakeLists.txt
+++ b/sql/CMakeLists.txt
@@ -187,7 +187,7 @@ IF ((CMAKE_SYSTEM_NAME MATCHES "Linux" OR
ENDIF()
IF(WIN32)
- SET(SQL_SOURCE ${SQL_SOURCE} handle_connections_win.cc)
+ SET(SQL_SOURCE ${SQL_SOURCE} handle_connections_win.cc winmain.cc)
ENDIF()
MYSQL_ADD_PLUGIN(partition ha_partition.cc STORAGE_ENGINE DEFAULT STATIC_ONLY
@@ -217,7 +217,7 @@ FOREACH(se aria partition perfschema sql_sequence wsrep)
ENDFOREACH()
IF(WIN32)
- SET(MYSQLD_SOURCE winmain.cc message.rc)
+ SET(MYSQLD_SOURCE main.cc message.rc)
ELSE()
SET(MYSQLD_SOURCE main.cc ${DTRACE_PROBES_ALL})
ENDIF()
@@ -259,7 +259,9 @@ IF(MSVC OR CMAKE_SYSTEM_NAME MATCHES AIX)
sql_builtins
)
IF(MSVC)
- SET_TARGET_PROPERTIES(server PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+ IF(NOT WITHOUT_DYNAMIC_PLUGINS)
+ SET_TARGET_PROPERTIES(server PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+ ENDIF()
ELSE()
SET_TARGET_PROPERTIES(server PROPERTIES AIX_EXPORT_ALL_SYMBOLS TRUE)
ENDIF()
diff --git a/sql/main.cc b/sql/main.cc
index 957efb8fa2e..357c72b815d 100644
--- a/sql/main.cc
+++ b/sql/main.cc
@@ -17,10 +17,20 @@
/*
main() for mysqld.
Calls mysqld_main() entry point exported by sql library.
+ On Windows, might do some service handling.
*/
+#ifdef _WIN32
+/* Windows main function, service handling, calls mysqld_main */
+extern int mysqld_win_main(int argc, char **argv);
+#else
extern int mysqld_main(int argc, char **argv);
+#endif
int main(int argc, char **argv)
{
+#ifdef _WIN32
+ return mysqld_win_main(argc, argv);
+#else
return mysqld_main(argc, argv);
+#endif
}
diff --git a/sql/winmain.cc b/sql/winmain.cc
index fb5da40cf2f..f999767cb27 100644
--- a/sql/winmain.cc
+++ b/sql/winmain.cc
@@ -60,8 +60,8 @@ static SERVICE_STATUS svc_status{SERVICE_WIN32_OWN_PROCESS};
static SERVICE_STATUS_HANDLE svc_status_handle;
static char *svc_name;
-static char **orig_argv;
-static int orig_argc;
+static char **save_argv;
+static int save_argc;
static int install_service(int argc, char **argv, const char *name);
static int remove_service(const char *name);
@@ -165,8 +165,8 @@ static void WINAPI svc_main(DWORD svc_argc, char **svc_argv)
Do not pass the service name parameter (last on the command line)
to mysqld_main(), it is unaware of it.
*/
- orig_argv[orig_argc - 1]= 0;
- mysqld_main(orig_argc - 1, orig_argv);
+ save_argv[save_argc - 1]= 0;
+ mysqld_main(save_argc - 1, save_argv);
}
/*
@@ -224,10 +224,10 @@ static const char *get_svc_name(const char *arg)
Plus, the obsolete functionality to register/remove services.
*/
-int main(int argc, char **argv)
+__declspec(dllexport) int mysqld_win_main(int argc, char **argv)
{
- orig_argv= argv;
- orig_argc= argc;
+ save_argv= argv;
+ save_argc= argc;
/*
If no special arguments are given, service name is nor present