mysql: rework (#4982)
* mysql: rework * fix ncurses * fix readline * fix readline again * fix windows arm * add deps editline * editline: add apt sources * hack editline * use editline & ncurses * use 8.0.39 * use bundle editline * fix ncurses * support cross compilation * fix find ncurses * remove 9.0.1 version * fix editline * mysql-build-tools: fix linux dpes * revert libedit & ncurses code * refractor configs * fix editline * mysql-build-tools: make deps host & improve build time * improve xmake.luapull/5095/head
parent
ea12e0f1c9
commit
f5f4c6f213
6 changed files with 508 additions and 122 deletions
@ -0,0 +1,77 @@ |
||||
package("mysql-build-tools") |
||||
set_kind("binary") |
||||
set_homepage("http://www.mysql.com") |
||||
set_description("This package help for mysql corss compilation") |
||||
set_license("GPL-2.0") |
||||
|
||||
add_urls("https://github.com/mysql/mysql-server/archive/refs/tags/mysql-$(version).tar.gz") |
||||
|
||||
add_versions("8.0.39", "3a72e6af758236374764b7a1d682f7ab94c70ed0d00bf0cb0f7dd728352b6d96") |
||||
|
||||
add_configs("server", {description = "Build server", default = false, type = "boolean"}) |
||||
add_configs("debug", {description = "Enable debug symbols.", default = false, readonly = true}) |
||||
|
||||
add_deps("cmake") |
||||
add_deps("zlib", "zstd", "lz4", "openssl", "rapidjson", {host = true, private = true}) |
||||
if is_plat("linux") then |
||||
add_deps("patchelf") |
||||
add_deps("libedit", {host = true, private = true, configs = {terminal_db = "ncurses"}}) |
||||
end |
||||
|
||||
local tool_list = { |
||||
"uca9dump", |
||||
"comp_sql", |
||||
"comp_err", |
||||
"comp_client_err", |
||||
"libmysql_api_test", |
||||
} |
||||
|
||||
on_load(function(package) |
||||
if package:config("server") then |
||||
table.join2(tool_list, { |
||||
"json_schema_embedder", |
||||
"gen_lex_token", |
||||
"gen_lex_hash", |
||||
"gen_keyword_list" |
||||
}) |
||||
end |
||||
|
||||
local version = package:version() |
||||
if version:lt("9.0.0") then |
||||
package:add("deps", "boost", "libevent", {host = true, private = true}) |
||||
end |
||||
end) |
||||
|
||||
on_install("windows", "macosx", "linux", function (package) |
||||
local mysql_script_dir = path.join(path.directory(package:scriptdir()), "mysql") |
||||
|
||||
import("patch", {rootdir = mysql_script_dir}) |
||||
import("configs", {rootdir = mysql_script_dir}) |
||||
import("package.tools.cmake") |
||||
import("core.base.hashset") |
||||
|
||||
local opt = {} |
||||
if cmake.configure then -- xmake 2.9.5 |
||||
opt.target = tool_list |
||||
end |
||||
patch.cmake(package) |
||||
cmake.build(package, configs.get(package, true), opt) |
||||
|
||||
local hash = hashset.from(tool_list) |
||||
local tools_dir = path.join(package:buildir(), "runtime_output_directory/**") |
||||
for _, file in ipairs(os.files(tools_dir)) do |
||||
if hash:has(path.basename(file)) then |
||||
os.vcp(file, package:installdir("bin")) |
||||
end |
||||
end |
||||
end) |
||||
|
||||
on_test(function (package) |
||||
for _, name in ipairs(tool_list) do |
||||
if is_host("windows") then |
||||
name = name .. ".exe" |
||||
end |
||||
local exec = path.join(package:installdir("bin", name)) |
||||
assert(os.isexec(exec), name .. " not found!") |
||||
end |
||||
end) |
@ -0,0 +1,70 @@ |
||||
function _host_tool_configs(package) |
||||
return { |
||||
"-DCMAKE_BUILD_TYPE=Release", |
||||
|
||||
"-DWITH_CURL=none", |
||||
"-DWITH_KERBEROS=none", |
||||
"-DWITH_FIDO=none", |
||||
} |
||||
end |
||||
|
||||
function _target_configs(package) |
||||
local configs = {} |
||||
table.insert(configs, "-DWITH_CURL=" .. (package:config("curl") and "system" or "none")) |
||||
table.insert(configs, "-DWITH_KERBEROS=" .. (package:config("kerberos") and "system" or "none")) |
||||
table.insert(configs, "-DWITH_FIDO=" .. (package:config("fido") and "system" or "none")) |
||||
return configs |
||||
end |
||||
|
||||
function get(package, build_host_tool) |
||||
local configs = { |
||||
"-DWITH_BUILD_ID=OFF", |
||||
"-DWITH_UNIT_TESTS=OFF", |
||||
"-DENABLED_PROFILING=OFF", |
||||
"-DWIX_DIR=OFF", |
||||
"-DWITH_TEST_TRACE_PLUGIN=OFF", |
||||
"-DMYSQL_MAINTAINER_MODE=OFF", |
||||
"-DBUNDLE_RUNTIME_LIBRARIES=OFF", |
||||
"-DDOWNLOAD_BOOST=OFF", |
||||
|
||||
"-DWITH_BOOST=system", |
||||
"-DWITH_LIBEVENT=system", |
||||
"-DWITH_ZLIB=system", |
||||
"-DWITH_ZSTD=system", |
||||
"-DWITH_SSL=system", |
||||
"-DWITH_LZ4=system", |
||||
"-DWITH_RAPIDJSON=system", |
||||
} |
||||
|
||||
if package:is_cross() then |
||||
table.insert(configs, "-DCMAKE_CROSSCOMPILING=ON") |
||||
end |
||||
|
||||
if package:is_plat("linux") then |
||||
local widec = package:dep("ncurses"):config("widec") |
||||
-- From FindCurses.cmake |
||||
table.insert(configs, "-DCURSES_NEED_WIDE=" .. (widec and "ON" or "OFF")) |
||||
table.insert(configs, "-DWITH_EDITLINE=system") |
||||
end |
||||
|
||||
if package:config("server") then |
||||
-- TODO: server deps |
||||
table.insert(configs, "-DWITH_ICU=system") |
||||
table.insert(configs, "-DWITH_PROTOBUF=system") |
||||
end |
||||
|
||||
if package:config("x") then |
||||
table.join2(configs, {"-DWITH_MYSQLX=ON", "-DWITH_MYSQLX_USE_PROTOBUF_FULL=ON"}) |
||||
else |
||||
table.insert(configs, "-DWITH_MYSQLX=OFF") |
||||
end |
||||
|
||||
if package:config("cluster") then |
||||
table.join2(configs, {"-DWITH_NDB=ON", "-DWITH_NDBCLUSTER=ON"}) |
||||
else |
||||
table.join2(configs, {"-DWITH_NDB=OFF", "-DWITH_NDBCLUSTER=OFF"}) |
||||
end |
||||
table.insert(configs, "-DWITHOUT_SERVER=" .. (package:config("server") and "OFF" or "ON")) |
||||
table.join2(configs, (build_host_tool and _host_tool_configs(package) or _target_configs(package))) |
||||
return configs |
||||
end |
@ -0,0 +1,53 @@ |
||||
function _patch_editline(package) |
||||
if not package:is_plat("linux") then |
||||
return |
||||
end |
||||
-- cmake/readline.cmake always consider editline is shared library |
||||
-- If we use static library, CHECK_CXX_SOURCE_COMPILES will fail because missing ncurses |
||||
local editline = package:dep("libedit") |
||||
if not editline:config("shared") then |
||||
local strings = "\nFIND_PACKAGE(Curses)\nlist(APPEND EDITLINE_LIBRARY ${CURSES_LIBRARIES})\n" |
||||
io.replace("cmake/readline.cmake", |
||||
"MARK_AS_ADVANCED(EDITLINE_INCLUDE_DIR EDITLINE_LIBRARY)", |
||||
"MARK_AS_ADVANCED(EDITLINE_INCLUDE_DIR EDITLINE_LIBRARY)" .. strings, |
||||
{plain = true}) |
||||
end |
||||
end |
||||
|
||||
function cmake(package) |
||||
local version = package:version() |
||||
if version:eq("8.0.39") then |
||||
io.replace("cmake/ssl.cmake", "IF(NOT OPENSSL_APPLINK_C)", "IF(FALSE)", {plain = true}) |
||||
io.replace("cmake/boost.cmake", "IF(NOT BOOST_MINOR_VERSION EQUAL 77)", "IF(FALSE)", {plain = true}) |
||||
if package:is_cross() then |
||||
local libevent_version = package:dep("libevent"):version() |
||||
if not libevent_version then |
||||
version = "2.1.12" |
||||
end |
||||
-- skip try_run |
||||
io.replace("cmake/libevent.cmake", |
||||
[[SET(LIBEVENT_VERSION_STRING "${RUN_OUTPUT}")]], |
||||
format([[SET(LIBEVENT_VERSION_STRING "%s")]], libevent_version), {plain = true}) |
||||
end |
||||
elseif version:eq("9.0.1") then |
||||
io.replace("cmake/ssl.cmake", "FIND_CUSTOM_OPENSSL()", "FIND_SYSTEM_OPENSSL()", {plain = true}) |
||||
end |
||||
|
||||
if package:is_plat("windows") then |
||||
-- fix pdb install |
||||
io.replace("cmake/install_macros.cmake", |
||||
[[NOT type MATCHES "STATIC_LIBRARY"]], |
||||
[[NOT type MATCHES "STATIC_LIBRARY" AND CMAKE_BUILD_TYPE STREQUAL "DEBUG"]], {plain = true}) |
||||
|
||||
if package:is_cross() then |
||||
-- skip try_run |
||||
io.replace("cmake/rapidjson.cmake", "IF (NOT HAVE_RAPIDJSON_WITH_STD_REGEX)", "if(FALSE)", {plain = true}) |
||||
end |
||||
end |
||||
|
||||
if not package:config("cluster") then |
||||
io.replace("CMakeLists.txt", "ADD_SUBDIRECTORY(storage/ndb)", "", {plain = true}) |
||||
end |
||||
|
||||
_patch_editline(package) |
||||
end |
@ -0,0 +1,229 @@ |
||||
diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt
|
||||
index f3669e2a26..43176da5a5 100644
|
||||
--- a/libmysql/CMakeLists.txt
|
||||
+++ b/libmysql/CMakeLists.txt
|
||||
@@ -403,20 +403,20 @@ ENDFOREACH()
|
||||
# Generate api_test.c source, substituting @CLIENT_API_FUNCTION_LIST@
|
||||
# with the list of API functions.
|
||||
#
|
||||
-CONFIGURE_FILE(api_test.c.in ${CMAKE_CURRENT_BINARY_DIR}/api_test.c)
|
||||
+# CONFIGURE_FILE(api_test.c.in ${CMAKE_CURRENT_BINARY_DIR}/api_test.c)
|
||||
|
||||
#
|
||||
# Note: Compiling this test application will fail if not all symbols
|
||||
# from @CLIENT_API_FUNCTIONS@ are declared by <mysql.h>. It will fail
|
||||
# to run if not all of these symbols are exported by the library.
|
||||
#
|
||||
-MYSQL_ADD_EXECUTABLE(libmysql_api_test
|
||||
- ${CMAKE_CURRENT_BINARY_DIR}/api_test.c
|
||||
- LINK_LIBRARIES libmysql ${LIBRT}
|
||||
- SKIP_INSTALL
|
||||
- )
|
||||
+# MYSQL_ADD_EXECUTABLE(libmysql_api_test
|
||||
+# ${CMAKE_CURRENT_BINARY_DIR}/api_test.c
|
||||
+# LINK_LIBRARIES libmysql ${LIBRT}
|
||||
+# SKIP_INSTALL
|
||||
+# )
|
||||
# Clang/UBSAN needs this on some platforms.
|
||||
-SET_TARGET_PROPERTIES(libmysql_api_test PROPERTIES LINKER_LANGUAGE CXX)
|
||||
+# SET_TARGET_PROPERTIES(libmysql_api_test PROPERTIES LINKER_LANGUAGE CXX)
|
||||
|
||||
IF(MY_COMPILER_IS_GNU)
|
||||
ADD_COMPILE_FLAGS(
|
||||
@@ -434,12 +434,12 @@ IF(HAS_WARN_FLAG)
|
||||
ENDIF()
|
||||
|
||||
# Verify that libmysql_api_test runs OK
|
||||
-ADD_CUSTOM_COMMAND(
|
||||
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
- DEPENDS libmysql_api_test
|
||||
- COMMAND libmysql_api_test
|
||||
- > ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
- )
|
||||
-MY_ADD_CUSTOM_TARGET(run_libmysql_api_test ALL
|
||||
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
- )
|
||||
+# ADD_CUSTOM_COMMAND(
|
||||
+# OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
+# DEPENDS libmysql_api_test
|
||||
+# COMMAND libmysql_api_test
|
||||
+# > ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
+# )
|
||||
+# MY_ADD_CUSTOM_TARGET(run_libmysql_api_test ALL
|
||||
+# DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmysql_api_test.out
|
||||
+# )
|
||||
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
|
||||
index 818b214ce9..6c96ba9a02 100644
|
||||
--- a/scripts/CMakeLists.txt
|
||||
+++ b/scripts/CMakeLists.txt
|
||||
@@ -25,7 +25,7 @@ DISABLE_MISSING_PROFILE_WARNING()
|
||||
|
||||
ADD_SUBDIRECTORY(sys_schema)
|
||||
|
||||
-MYSQL_ADD_EXECUTABLE(comp_sql comp_sql.cc SKIP_INSTALL)
|
||||
+# MYSQL_ADD_EXECUTABLE(comp_sql comp_sql.cc SKIP_INSTALL)
|
||||
|
||||
# Add compiler information, for easier debugging of output from mysql_config.
|
||||
SET(COMPILER_ID_AND_VERSION
|
||||
@@ -63,7 +63,7 @@ ADD_CUSTOM_COMMAND(
|
||||
mysql_fix_privilege_tables.sql
|
||||
mysql_fix_privilege_tables_sql.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables.sql
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables_fix.sql
|
||||
)
|
||||
@@ -81,7 +81,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_sys_schema.sql
|
||||
sql_commands_sys_schema.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_sys_schema.sql
|
||||
)
|
||||
|
||||
@@ -92,7 +92,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables_data.sql
|
||||
sql_commands_system_data.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables_data.sql
|
||||
)
|
||||
|
||||
@@ -103,7 +103,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables_data_fix.sql
|
||||
sql_commands_system_tables_data_fix.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables_data_fix.sql
|
||||
)
|
||||
|
||||
@@ -114,7 +114,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables.sql
|
||||
sql_commands_system_tables.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_tables.sql
|
||||
)
|
||||
|
||||
@@ -125,7 +125,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_users.sql
|
||||
sql_commands_system_users.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mysql_system_users.sql
|
||||
)
|
||||
|
||||
@@ -136,7 +136,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/fill_help_tables.sql
|
||||
sql_commands_help_data.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/fill_help_tables.sql
|
||||
)
|
||||
|
||||
@@ -147,7 +147,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/firewall_stored_procedures.sql
|
||||
sql_firewall_stored_procedures.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql
|
||||
+ DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/firewall_stored_procedures.sql
|
||||
)
|
||||
|
||||
diff --git a/scripts/sys_schema/CMakeLists.txt b/scripts/sys_schema/CMakeLists.txt
|
||||
index 1d3295e8d4..c862909257 100644
|
||||
--- a/scripts/sys_schema/CMakeLists.txt
|
||||
+++ b/scripts/sys_schema/CMakeLists.txt
|
||||
@@ -213,7 +213,7 @@ ADD_CUSTOM_COMMAND(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ALL_SYS_SCHEMA.sql
|
||||
sql_commands.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
- DEPENDS comp_sql all_sys_schema
|
||||
+ DEPENDS all_sys_schema
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ALL_SYS_SCHEMA.sql
|
||||
VERBATIM
|
||||
)
|
||||
@@ -223,7 +223,7 @@ MY_ADD_CUSTOM_TARGET(sql_commands
|
||||
|
||||
MY_ADD_CUSTOM_TARGET(GenSysSchemaC
|
||||
ALL
|
||||
- DEPENDS comp_sql sql_commands
|
||||
+ DEPENDS sql_commands
|
||||
COMMENT "Generating Sys Schema C code"
|
||||
)
|
||||
|
||||
diff --git a/strings/CMakeLists.txt b/strings/CMakeLists.txt
|
||||
index f4cd85e786..99dbd5f811 100644
|
||||
--- a/strings/CMakeLists.txt
|
||||
+++ b/strings/CMakeLists.txt
|
||||
@@ -59,7 +59,7 @@ SET(STRINGS_SOURCES
|
||||
xml.cc
|
||||
)
|
||||
|
||||
-MYSQL_ADD_EXECUTABLE(uca9dump uca9-dump.cc SKIP_INSTALL)
|
||||
+# MYSQL_ADD_EXECUTABLE(uca9dump uca9-dump.cc SKIP_INSTALL)
|
||||
|
||||
MY_CHECK_CXX_COMPILER_WARNING("-Wmissing-profile" HAS_MISSING_PROFILE)
|
||||
IF(HAS_MISSING_PROFILE)
|
||||
@@ -78,7 +78,7 @@ ADD_CUSTOM_COMMAND(OUTPUT ${ZH_HANS_DST_FILE}
|
||||
COMMAND uca9dump ja
|
||||
--in_file=${JA_HANS_SRC_FILE}
|
||||
--out_file=${JA_HANS_DST_FILE}
|
||||
- DEPENDS uca9dump ${ZH_HANS_SRC_FILE} ${JA_HANS_SRC_FILE}
|
||||
+ DEPENDS ${ZH_HANS_SRC_FILE} ${JA_HANS_SRC_FILE}
|
||||
)
|
||||
|
||||
SET_SOURCE_FILES_PROPERTIES(
|
||||
diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt
|
||||
index 621a8e140d..d5aefda309 100644
|
||||
--- a/utilities/CMakeLists.txt
|
||||
+++ b/utilities/CMakeLists.txt
|
||||
@@ -26,19 +26,19 @@ DISABLE_MISSING_PROFILE_WARNING()
|
||||
MSVC_CPPCHECK_DISABLE()
|
||||
|
||||
IF(NOT CMAKE_CROSSCOMPILING)
|
||||
- MYSQL_ADD_EXECUTABLE(comp_err
|
||||
- comp_err.cc
|
||||
- COMPONENT Test
|
||||
- LINK_LIBRARIES mysys
|
||||
- )
|
||||
+ # MYSQL_ADD_EXECUTABLE(comp_err
|
||||
+ # comp_err.cc
|
||||
+ # COMPONENT Test
|
||||
+ # LINK_LIBRARIES mysys
|
||||
+ # )
|
||||
ENDIF()
|
||||
|
||||
-MYSQL_ADD_EXECUTABLE(comp_client_err
|
||||
- comp_client_err.cc
|
||||
- ${CMAKE_SOURCE_DIR}/libmysql/errmsg.cc
|
||||
- LINK_LIBRARIES mysys
|
||||
- SKIP_INSTALL
|
||||
- )
|
||||
+# MYSQL_ADD_EXECUTABLE(comp_client_err
|
||||
+# comp_client_err.cc
|
||||
+# ${CMAKE_SOURCE_DIR}/libmysql/errmsg.cc
|
||||
+# LINK_LIBRARIES mysys
|
||||
+# SKIP_INSTALL
|
||||
+# )
|
||||
|
||||
ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/include/mysqlclient_ername.h
|
||||
COMMAND comp_client_err
|
||||
@@ -104,8 +104,8 @@ ADD_DEFINITIONS(-DMUTEX_EVENT)
|
||||
# The copied shared libraries must be available at build time.
|
||||
IF(TARGET copy_openssl_dlls)
|
||||
ADD_DEPENDENCIES(GenError copy_openssl_dlls)
|
||||
- ADD_DEPENDENCIES(comp_client_err copy_openssl_dlls)
|
||||
- ADD_DEPENDENCIES(comp_err copy_openssl_dlls)
|
||||
+ # ADD_DEPENDENCIES(comp_client_err copy_openssl_dlls)
|
||||
+ # ADD_DEPENDENCIES(comp_err copy_openssl_dlls)
|
||||
ENDIF()
|
||||
|
||||
MYSQL_ADD_EXECUTABLE(static_thread_local_test
|
@ -1,142 +1,103 @@ |
||||
package("mysql") |
||||
set_homepage("http://www.mysql.com") |
||||
set_description("A real-time, open source transactional database.") |
||||
set_license("GPL-2.0") |
||||
|
||||
set_homepage("https://dev.mysql.com/doc") |
||||
set_description("Open source relational database management system.") |
||||
add_urls("https://github.com/mysql/mysql-server/archive/refs/tags/mysql-$(version).tar.gz") |
||||
|
||||
if is_plat("macosx", "linux") then |
||||
set_urls("https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-$(version).tar.gz", |
||||
"https://github.com/xmake-mirror/mysql-boost/releases/download/$(version)/mysql-boost-$(version).tar.gz") |
||||
add_versions("5.7.29", "00f514124de2bad1ba7b380cbbd46e316cae7fc7bc3a5621456cabf352f27978") |
||||
end |
||||
add_versions("8.0.39", "3a72e6af758236374764b7a1d682f7ab94c70ed0d00bf0cb0f7dd728352b6d96") |
||||
|
||||
if is_plat("windows", "macosx", "linux") then |
||||
set_urls("https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-$(version).tar.gz") |
||||
add_versions("8.0.31", "67bb8cba75b28e95c7f7948563f01fb84528fcbb1a35dba839d4ce44fe019baa") |
||||
end |
||||
|
||||
if is_plat("mingw") then |
||||
add_configs("shared", {description = "Download shared binaries.", default = true, type = "boolean", readonly = true}) |
||||
if is_arch("i386") then |
||||
set_urls("https://github.com/xmake-mirror/mysql/releases/download/$(version)/mysql_$(version)_x86.zip") |
||||
add_versions("8.0.31", "fd626cae72b1f697b941cd3a2ea9d93507e689adabb1c2c11d465f01f4b07cb9") |
||||
else |
||||
set_urls("https://github.com/xmake-mirror/mysql/releases/download/$(version)/mysql_$(version)_x64.zip") |
||||
add_versions("8.0.31", "26312cfa871c101b7a55cea96278f9d14d469455091c4fd3ffaaa67a2d1aeea5") |
||||
end |
||||
add_configs("server", {description = "Build server", default = false, type = "boolean"}) |
||||
add_configs("curl", {description = "Build with curl", default = false, type = "boolean"}) |
||||
add_configs("kerberos", {description = "Build with kerberos", default = false, type = "boolean"}) |
||||
add_configs("fido", {description = "Build FIDO based authentication plugins", default = false, type = "boolean"}) |
||||
add_configs("x", {description = "Build MySQL X plugin", default = false, type = "boolean"}) |
||||
if is_plat("windows") then |
||||
add_configs("debug", {description = "Enable debug symbols.", default = false, readonly = true}) |
||||
end |
||||
|
||||
add_includedirs("include", "include/mysql") |
||||
|
||||
add_deps("cmake") |
||||
add_deps("zlib", "zstd", "lz4", "openssl", "rapidjson") |
||||
if is_plat("linux") then |
||||
add_deps("patchelf") |
||||
add_deps("libedit", {configs = {terminal_db = "ncurses"}}) |
||||
end |
||||
|
||||
on_load("windows", "mingw", "linux", "macosx", function(package) |
||||
if package:version():ge("8.0.0") then |
||||
package:add("deps", "boost") |
||||
package:add("deps", "openssl") |
||||
package:add("deps", "zlib") |
||||
package:add("deps", "zstd") |
||||
package:add("deps", "lz4") |
||||
else |
||||
package:add("deps", "openssl") |
||||
if package:is_plat("linux") then |
||||
package:add("deps", "ncurses") |
||||
if on_check then |
||||
on_check(function (package) |
||||
local version = package:version() |
||||
if version:ge("9.0.0") then |
||||
assert(package:is_arch(".*64"), "package(mysql) supports only 64-bit platforms.") |
||||
assert(not package:is_plat("macosx"), "package(mysql >=9.0.0) need c++20 compiler") |
||||
end |
||||
end) |
||||
end |
||||
|
||||
on_load(function(package) |
||||
local version = package:version() |
||||
if version:lt("9.0.0") then |
||||
package:add("deps", "boost", "libevent") |
||||
end |
||||
end) |
||||
|
||||
on_install("mingw", function (package) |
||||
os.cp("lib", package:installdir()) |
||||
os.cp("include", package:installdir()) |
||||
os.cp("lib/libmysql.dll", package:installdir("bin")) |
||||
if package:config("server") then |
||||
package:add("deps", "icu4c", "protobuf-cpp") |
||||
end |
||||
|
||||
if package:config("fido") then |
||||
-- TODO: patch cmakelists to find our fido or let it use system libfido2 |
||||
package:add("deps", "libfido2") |
||||
end |
||||
|
||||
if package:config("curl") then |
||||
package:add("deps", "libcurl") |
||||
end |
||||
|
||||
if package:config("kerberos") then |
||||
package:add("deps", "krb5") |
||||
end |
||||
|
||||
if package:is_cross() then |
||||
package:add("deps", "mysql-build-tools") |
||||
package:add("patches", "8.0.39", "patches/8.0.39/cmake-cross-compilation.patch", "0f951afce6bcbc5b053d4e7e4aef57f602ff89960d230354f36385ca31c1c7a5") |
||||
end |
||||
end) |
||||
|
||||
on_install("windows|x86", "windows|x64", "linux", "macosx", function (package) |
||||
if package:version():ge("8.0.0") then |
||||
io.gsub("CMakeLists.txt", "ADD_SUBDIRECTORY%(storage/ndb%)", "") |
||||
local configs = {"-DCOMPILATION_COMMENT=XMake", |
||||
"-DDEFAULT_CHARSET=utf8", |
||||
"-DDEFAULT_COLLATION=utf8_general_ci", |
||||
"-DINSTALL_DOCDIR=share/doc/#{name}", |
||||
"-DINSTALL_INCLUDEDIR=include/mysql", |
||||
"-DINSTALL_INFODIR=share/info", |
||||
"-DINSTALL_MANDIR=share/man", |
||||
"-DINSTALL_MYSQLSHAREDIR=share/mysql", |
||||
"-DWITH_EDITLINE=bundled", |
||||
"-DWITH_UNIT_TESTS=OFF", |
||||
"-DDISABLE_SHARED=" .. (package:config("shared") and "OFF" or "ON"), |
||||
"-DWITH_LZ4='system'", |
||||
"-DWITH_ZSTD='system'", |
||||
"-DWITH_ZLIB='system'", |
||||
"-DWINDOWS_RUNTIME_MD=" .. (is_plat("windows") and package:config("vs_runtime"):startswith("MD") and "ON" or "OFF"), |
||||
"-DWITHOUT_SERVER=ON"} |
||||
io.replace("cmake/ssl.cmake","IF(NOT OPENSSL_APPLINK_C)","IF(FALSE AND NOT OPENSSL_APPLINK_C)", {plain = true}) |
||||
for _, removelib in ipairs({"icu", "libevent", "re2", "rapidjson", "protobuf", "libedit"}) do |
||||
io.replace("CMakeLists.txt", "MYSQL_CHECK_" .. string.upper(removelib) .. "()\n", "", {plain = true}) |
||||
io.replace("CMakeLists.txt", "INCLUDE(" .. removelib .. ")\n", "", {plain = true}) |
||||
io.replace("CMakeLists.txt", "WARN_MISSING_SYSTEM_" .. string.upper(removelib) .. "(" .. string.upper(removelib) .. "_WARN_GIVEN)", "# WARN_MISSING_SYSTEM_" .. string.upper(removelib) .. "(" .. string.upper(removelib) .. "_WARN_GIVEN)", {plain = true}) |
||||
io.replace("CMakeLists.txt", "SET(" .. string.upper(removelib) .. "_WARN_GIVEN)", "# SET(" .. string.upper(removelib) .. "_WARN_GIVEN)", {plain = true}) |
||||
end |
||||
os.rmdir("extra") |
||||
for _, folder in ipairs({"client", "man", "mysql-test", "libbinlogstandalone"}) do |
||||
os.rmdir(folder) |
||||
io.replace("CMakeLists.txt", "ADD_SUBDIRECTORY(" .. folder .. ")\n", "", {plain = true}) |
||||
end |
||||
os.rmdir("storage/ndb") |
||||
for _, line in ipairs({"INCLUDE(cmake/boost.cmake)\n", "MYSQL_CHECK_EDITLINE()\n"}) do |
||||
io.replace("CMakeLists.txt", line, "", {plain = true}) |
||||
end |
||||
io.replace("libbinlogevents/CMakeLists.txt", "INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/libbinlogevents/include)", "MY_INCLUDE_SYSTEM_DIRECTORIES(LZ4)\nINCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/libbinlogevents/include)", {plain = true}) |
||||
io.replace("cmake/install_macros.cmake", " INSTALL_DEBUG_SYMBOLS("," # INSTALL_DEBUG_SYMBOLS(", {plain = true}) |
||||
import("package.tools.cmake").install(package, configs) |
||||
if package:is_plat("windows") then |
||||
if package:config("shared") then |
||||
os.rm(package:installdir(path.join("lib", "mysqlclient.lib"))) |
||||
os.cp(package:installdir(path.join("lib", "libmysql.dll")), package:installdir("bin")) |
||||
else |
||||
os.rm(package:installdir(path.join("lib", "libmysql.lib"))) |
||||
os.rm(package:installdir(path.join("lib", "libmysql.dll"))) |
||||
end |
||||
on_install("windows", "macosx", "linux", function (package) |
||||
import("patch").cmake(package) |
||||
|
||||
local configs = import("configs").get(package, false) |
||||
table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release")) |
||||
table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF")) |
||||
table.insert(configs, "-DINSTALL_STATIC_LIBRARIES=" .. (package:config("shared") and "OFF" or "ON")) |
||||
table.insert(configs, "-DWITH_LTO=" .. (package:config("lto") and "ON" or "OFF")) |
||||
table.insert(configs, "-DWITH_ASAN=" .. (package:config("asan") and "ON" or "OFF")) |
||||
table.insert(configs, "-DWITH_LSAN=" .. (package:config("lsan") and "ON" or "OFF")) |
||||
table.insert(configs, "-DWITH_MSAN=" .. (package:config("msan") and "ON" or "OFF")) |
||||
table.insert(configs, "-DWITH_UBSAN=" .. (package:config("ubsan") and "ON" or "OFF")) |
||||
if package:is_plat("windows") then |
||||
table.insert(configs, "-DLINK_STATIC_RUNTIME_LIBRARIES=" .. (package:has_runtime("MT", "MTd") and "ON" or "OFF")) |
||||
end |
||||
import("package.tools.cmake").install(package, configs) |
||||
|
||||
if package:is_plat("windows") then |
||||
if package:config("shared") then |
||||
os.tryrm(package:installdir("lib/mysqlclient.lib")) |
||||
os.trymv(package:installdir("lib/libmysql.dll"), package:installdir("bin")) |
||||
else |
||||
if package:config("shared") then |
||||
os.rm(package:installdir(path.join("lib", "*.a"))) |
||||
os.cp(package:installdir(path.join("lib", "*.so.*")), package:installdir("bin")) |
||||
else |
||||
os.rm(package:installdir(path.join("lib", "*.so.*"))) |
||||
end |
||||
os.tryrm(package:installdir("lib/libmysql.lib")) |
||||
os.tryrm(package:installdir("lib/libmysql.dll")) |
||||
end |
||||
else |
||||
io.gsub("CMakeLists.txt", "ADD_SUBDIRECTORY%(storage/ndb%)", "") |
||||
local configs = {"-DCOMPILATION_COMMENT=XMake", |
||||
"-DDEFAULT_CHARSET=utf8", |
||||
"-DDEFAULT_COLLATION=utf8_general_ci", |
||||
"-DINSTALL_DOCDIR=share/doc/#{name}", |
||||
"-DINSTALL_INCLUDEDIR=include/mysql", |
||||
"-DINSTALL_INFODIR=share/info", |
||||
"-DINSTALL_MANDIR=share/man", |
||||
"-DINSTALL_MYSQLSHAREDIR=share/mysql", |
||||
"-DWITH_BOOST=../boost", |
||||
"-DWITH_EDITLINE=" .. (is_plat("macosx") and "system" or "bundled"), |
||||
"-DWITH_SSL=yes", |
||||
"-DWITH_UNIT_TESTS=OFF", |
||||
"-DWITHOUT_SERVER=ON"} |
||||
if package:is_plat("linux") then |
||||
local curses = package:dep("ncurses"):fetch() |
||||
if curses then |
||||
local includedirs = table.wrap(curses.sysincludedirs or curses.includedirs) |
||||
local libfiles = table.wrap(curses.libfiles) |
||||
table.insert(configs, "-DCURSES_INCLUDE_PATH=" .. table.concat(includedirs, ";")) |
||||
table.insert(configs, "-DCURSES_LIBRARY=" .. table.concat(libfiles, ";")) |
||||
end |
||||
if package:config("shared") then |
||||
os.tryrm(package:installdir("lib/*.a")) |
||||
else |
||||
os.tryrm(package:installdir("lib/*.so*")) |
||||
end |
||||
import("package.tools.cmake").install(package, configs) |
||||
end |
||||
end) |
||||
|
||||
on_test(function (package) |
||||
assert(package:has_cfuncs("mysql_init", {includes = "mysql.h"})) |
||||
assert(package:check_cxxsnippets({test = [[ |
||||
#include <mysql.h> |
||||
void test() { |
||||
MYSQL s; |
||||
} |
||||
]]})) |
||||
end) |
||||
|
Loading…
Reference in new issue