それが僕には楽しかったんです。

僕と MySQL と時々 MariaDB

MariaDB 10.6 を macOS BigSur 11.4 でビルドする

はじめに

どうも、最近クラウドアトラスを見てからあまり映画を漁りに行くことをしなくなり、代わりに異世界スローライフ系の作品を脳死で見ているけんつです。
気軽に Fork していた mariadb/sever リポジトリに対して fetch upstream を実行したらビルドが全く通らなくなったのでこれを機にビルド方法を残しておく。
なにやら macOS 上でのビルドは気軽に死ぬので mariadb/server 10.6 のこのコミット時点でビルドすることを前提にする。
bump the VERSION · MariaDB/server@a841069 · GitHub

ビルドする前に

ソースコードを持ってくる

いつもの。

> git@github.com:MariaDB/server.git

必要なパッケージ群をインストールする

Build Environment Setup for Mac - MariaDB Knowledge Base
ここに書いてあるように必要なパッケージをインストールする。今回は homebrew を使って突っ込んだ。

bison を変更する

XCode に頼っていると次のようなエラーがビルド時に出力される。

[ 22%] [BISON][gen_mariadb_cc_hh] Building parser with bison 2.3
/Users/lrf141/mariaProject/server/build/sql/yy_mariadb.yy:351.9-16: syntax error, unexpected identifier, expecting string
make[2]: *** [sql/yy_mariadb.cc] Error 1
make[1]: *** [sql/CMakeFiles/gen_lex_token.dir/all] Error 2
make: *** [all] Error 2

なにやら bison のバージョンが古いことが原因らしいので、homebrew を使っていい感じにする。

$ brew install bison
$ brew link bison --force

brew link 時にパスを通せと言われるので、お手持ちの .bashrc なり .zshrc なりに追加する。

どうしても /usr/bin 以下に突っ込みたい人

System Integrity Protection が有効になっていると sudo でも操作できないので

$ csrutil status 

の結果が enable だった場合、リカバリーモードで立ち上げて

$ csrutil disable

をやれば突っ込めるようになる。

gcc, g++ を突っ込む(宗教に応じて選択してください、おすすめはしません)

やりたい人はお勧めしないが Free Software Foundation の方の gcc, g++ を突っ込む。

$ brew install gcc
// path の確認
$ ls /usr/local/bin | grep gcc
$ ls /usr/local/bin | grep g++

$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++

ここまでやったらさっきと同様にパスを通す。

ビルド

CMake でよろしくやる

zenn.dev
Nayuta Yanagisawa さんの記事によると

cmake -DCMAKE_BUILD_TYPE=Debug ..

とすると良いようですが macOS 版でこのまま進むと mroonga のビルド時に vendor に入っている groonga をコンパイルするあたりで -Wformat を吐くのでこいつだけ抑制しておきます。
なので基本的には以下のような感じにするといい感じにやってくれます。
どうしても mroonga, groonga を触りたいんだという人は頑張ってください。

$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAG="-Wno-format" ..
$ cmake --build . --config Debug -j 8
homebrew で突っ込んだ gcc, g++ を突っ込むと何が起こるか

結論から書くとビルドでこけます。
何が起こるかというと

In file included from server/sql/structs.h:26,
                 from server/sql/handler.h:34,
                 from server/storage/innobase/include/trx0xa.h:27,
                 from server/storage/innobase/include/trx0trx.h:34,
                 from server/storage/innobase/btr/btr0pcur.cc:30:
server/include/my_time.h: In function 'void my_timeval_trunc(timeval*, uint)':
server/include/my_time.h:249:65: error: conversion from 'long int' to '__darwin_suseconds_t' {aka 'int'} may change value [-Werror=conversion]
  249 |   tv->tv_usec-= my_time_fraction_remainder(tv->tv_usec, decimals);

my_time.h で int と long int の変換やってええんか?って感じでエラーになります。
server/my_time.h at 76f4a78ba2639b5abd01a88b24a3c509c11530ce · MariaDB/server · GitHub


この辺をよく見てみると _timeval.h なるヘッダーで

/*
 * Copyright (c) 2003-2012 Apple Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 *
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
#ifndef _STRUCT_TIMEVAL
#define _STRUCT_TIMEVAL         struct timeval

#include <machine/types.h> /* __darwin_time_t */
#include <sys/_types.h> /* __darwin_suseconds_t */

_STRUCT_TIMEVAL
{
	__darwin_time_t         tv_sec;         /* seconds */
	__darwin_suseconds_t    tv_usec;        /* and microseconds */
};
#endif /* _STRUCT_TIMEVAL */

https://opensource.apple.com/source/xnu/xnu-4570.41.2/bsd/sys/_types/_timeval.h.auto.html

__darwin_suseconds_t なる輩が int なのでこいつが問題になってくるわけです。

おわりに

10.6 がリリースされる前に触ってたけどその時はさらに色々あって大変だったけどいい感じにビルドできることがわかって大変満足。
特にどのストレージエンジンか忘れたけど鬼のように出力されていた -Wsign-compare が消え去った上に、デバッグしようものなら gdb で table とか見れなかったのが見れるようになっていてこの上なく満足。