MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

很多开发环境需要我们安装数据库,随着mysql的日渐衰弱,更多的开发环境使用mariadb作为数据库,而mariadb数据库目前没有OS X的release版本,所以我们需要手动编译安装

修改代码

由于mariadb本身使用了tokudb的上游代码,而tokudb目前尚未有支持OS X的计划,所以常规安装方式是不成功的,我们需要对代码本身进行修改。
由于是tokudb引擎导致的问题,所以只需要修改两个文件
storage/tokudb/ft-index/cmake_modules/TokuSetupCompiler.cmake

-set(CMAKE_C_FLAGS "-Wall -Werror ${CMAKE_C_FLAGS}")
-set(CMAKE_CXX_FLAGS "-Wall -Werror ${CMAKE_CXX_FLAGS}")
+set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}")

storage/tokudb/ha_tokudb.cc

  • extern const char * const tokudb_hton_name;

  • extern const char *tokudb_hton_name;

笔者猜测最根本的原因是tokudb没有对OS X编译工具链做编译测试,OS X的编译工具是LLVM和BSD工具,而并非是gcc和GNU工具,所以在一些细节上有一些差别。如果没有改代码,会导致以下信息报错

[ 80%] Building CXX object storage/tokudb/ft-index/locktree/CMakeFiles/locktree_static.dir/locktree.cc.o
In file included from /Users/tangjiacheng/Development/server/storage/tokudb/ft-index/locktree/locktree.cc:99:
In file included from /Users/tangjiacheng/Development/server/storage/tokudb/ft-index/locktree/locktree.h:94:
/Users/tangjiacheng/Development/server/storage/tokudb/ft-index/buildheader/db.h:323:1: error: 
empty struct has size 0 in C, size 1 in C++ [-Werror,-Wextern-c-compat]
struct __toku_db_lsn {
^
1 error generated.
make[2]: *** [storage/tokudb/ft-index/locktree/CMakeFiles/locktree_static.dir/locktree.cc.o] Error 1
make[1]: *** [storage/tokudb/ft-index/locktree/CMakeFiles/locktree_static.dir/all] Error 2
make: *** [all] Error 2

In file included from /Users/tangjiacheng/Development/server/storage/tokudb/ha_tokudb.cc:8293:
/Users/tangjiacheng/Development/server/storage/tokudb/hatoku_hton.cc:262:13: error: 
redefinition of 'tokudb_hton_name' with a different type: 'const char *'
vs 'const char *const'
const char *tokudb_hton_name = "TokuDB";
^
/Users/tangjiacheng/Development/server/storage/tokudb/ha_tokudb.cc:382:31: note: 
previous definition is here
extern const char * const tokudb_hton_name;

注:至于一些朋友说homebrew install mariadb可以安装mariadb的说法,其实是因为homebrew本身修改过mariadb的代码,增加了一个cmake选项禁用了tokudb,而tokudb本身代码是没有问题的,因噎废食的做法笔者不敢苟同,所以还是原生编译安装更加实在。Homebrew.mariadb

Mariadb增加Jemalloc内存管理

Jemalloc在OS X下有一个很奇怪的问题,jemalloc安装在/usr/local目录的开发包无法被Mariadb识别,几经尝试,暂时发现了一个解决方法。
Mariadb本身使用cmake作为跨平台编译解决方案,但是最终在OS X上还是使用LLVM来编译,所以我们直接编译好jemalloc以后直接使用-L和-l参数来手动指定库文件位置。

Jemalloc编译

还是三板斧
./configure --prefix=/path/to & make & make install

/path/to即为安装目录,随便指定即可。

然后我们来到安装目录的lib目录下,所有的动态静态链接库都在这里,我们直接删除到只剩下jemalloc_pic.a这个静态库文件,因为gcc默认发现了动态库文件就会使用动态库文件来连接,而我们需要静态连接。
然后这次我选择了mariadb-10.1.8这个10.1系列第一个stable(GA)版本。

cd mariadb-10.1.8
cmake . -DBUILD_CONFIG=mysql_release -DCMAKE_EXE_LINKER_FLAGS="-L/path/to -ljemalloc_pic" -DWITH_SAFEMALLOC=OFF
make

注意:/path/to是要到libjemalloc_pic.a目录的
然后。。。就发现,神奇的报错了,报错信息如下

[ 55%] Building CXX object storage/mroonga/vendor/groonga/lib/CMakeFiles/libgroonga.dir/dat.cpp.o
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:191:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:222:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:423:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:452:5: error: cannot use 'try' with exceptions disabled
    try {
    ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:465:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:552:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:576:5: error: cannot use 'try' with exceptions disabled
    try {
    ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:592:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:617:5: error: cannot use 'try' with exceptions disabled
    try {
    ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:616:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:652:5: error: cannot use 'try' with exceptions disabled
    try {
    ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:651:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:703:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:811:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:864:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:921:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:969:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:1007:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
/Users/tangjiacheng/Downloads/mariadb-10.1.8/storage/mroonga/vendor/groonga/lib/dat.cpp:1101:3: error: cannot use 'try' with exceptions disabled
  try {
  ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.

查了一下,原来是Mroonga引擎搞的鬼,幸好homebrew已经有了解决方案,我们直接修改
storage/mroonga/vendor/groonga/CMakeLists.txt

@@ -192,6 +192,10 @@ if(CMAKE_COMPILER_IS_GNUCXX)
   check_build_flag("-Wno-clobbered")
 endif()
 
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+  MY_CHECK_AND_SET_COMPILER_FLAG("-fexceptions")
+endif()
+
 if(NOT DEFINED CMAKE_C_COMPILE_OPTIONS_PIC)
   # For old CMake
   if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGCXX)

然后再编译就成功了


山河永寂
2.4k 声望159 粉丝