ubuntu 16.04 交叉编译 mysql 5.7.16 到 arm平台

ubuntu 16.04 交叉编译 mysql 5.7.16 到 arm平台


1 平台:
(1) ubuntu 16.04 32bit
(2) arm: 210  arm cortex-A8
(3) mysql 5.7.16 32bit



2 准备两套mysql源码,把mysql-5.7.16.tar.gz解压,复制两份分别放在ubuntu #/opt目录下的两个目录mysql-arm,mysql-x86,源文件目录分别为,
(1) mysql-arm   (arm平台的arm-linux-gcc,arm-linux-g++的编译)
(2) mysql-x86 (x86 linux平台的gcc,g++的编译)


3 用到的工具及库
1.cmake-3.5.1.tar.gz      ---新版的MySQL用CMAKE编译安装
2.ncurses-5.9.tar.gz      ---安装MySQL时需要 http://ftp.gnu.org/gnu/ncurses/
3.bison-3.0.4.tar.gz      ---安装MySQL时需要
4.boost_1_59_0.tar.gz  ---安装MySQL时需要 http://www.boost.org/users/news/


从MySQL 5.7.5开始Boost库是必需的,下载Boost库并上传到/usr/local/src下,在解压后复制到/usr/local/boost目录下,然后重新cmake并在后面的选项中加上选项-
DWITH_BOOST=/usr/local/boost
5. git
没安装git编译会出现错误 Could NOT find Git (missing:  GIT_EXECUTABLE)
6. mysql-5.7.16.tar.gz


/**************************************************************/
一 安装相关工具和库存
首先$ sudo apt-get update
1.安装cmake。搭建跨平台安装(编译工具),新版的MySQL用CMAKE编译安装
 $ apt-get install cmake -y
 
2.安装C/C++编译器
$ sudo apt-get install gcc g++ -y (一般来说我们使用的UBUNTU自带的) 


3.安装交叉工具链
3.1 安装arm-linux-gcc 4.4.3 
(1)解压
  $ tar zxvf arm-linux-gcc-4.4.3.tar.gz
(2)把 4.4.3目录拷贝到 /usr/local/arm目录下
  $ cp 4.4.3 /usr/local/arm -radf
3.2 配置好环境变量,
(1)在后面加上export PATH=/usr/local/arm/4.4.1/bin:$PATH
  $  vi /etc/bash.bashrc
(2)使bash.bashrc生效
  $ source /etc/bash.bashrc  
(3)查看有没有包含/usr/local/arm/4.4.1/bin路径
  $ echo $PATH  
(3)测试可以看到版本号为止
  $ arm-linux-gcc -v


4.安装git
  $ apt-get install git -y   


5.安装LINUX常用图形库
  $ apt-get install libncurses5 libncurses5-dev -y
 
6 安装boost,
(1).解压boost_1_59_0
  $ tar zxvf boost_1_59_0.tar.gz
(2).进入boost_1_59_0目录
  $ cd /boost_1_59_0
(3).运行脚本,配置boost
  $ ./bootstrap.sh
(4).编译安装 ,将会安装到/usr/local/include/boost目录下
  $./b2 install

二:编译.mysql-x86,  (此处是mysql-x86目录x86平台的gcc,g++的编译)
(1) 进入BUILD目录
  $ cd /root/mysql-x86/BUILD
(2)编译, 如是64位的./compile-pentium64
  $ ./compile-pentium    


//---------------
...
[100%] Linking CXX executable my_safe_process
[100%] Built target my_safe_process
编译成功,留作备用。
//---------------


错误及解决
1 执行./compile-pentium 时的错误
/*****************************************************************************************************
用其它版本boost编译时的错误


$./compile-pentium


-- Running cmake version 3.5.1
-- Found Git: /usr/bin/git (found version "2.7.4") 
-- Configuring with MAX_INDEXES = 64U
-- SIZEOF_VOIDP 4
-- MySQL 5.7.16 //[MySQL版本]
-- Packaging as: mysql-5.7.16-Linux-i686
-- Found /usr/local/include/boost/version.hpp 
-- BOOST_VERSION_NUMBER is #define BOOST_VERSION 106200
CMake Warning at cmake/boost.cmake:266 (MESSAGE):
 Boost minor version found is 62 we need 59 //boost 版本是62,需要的是59
Call Stack (most recent call first):
 CMakeLists.txt:455 (INCLUDE)
-- BOOST_INCLUDE_DIR /usr/local/include
-- LOCAL_BOOST_DIR 
-- LOCAL_BOOST_ZIP 
-- Could not find (the correct version of) boost. //[关键错误信息]
-- MySQL currently requires boost_1_59_0 //[解决办法]MySQL目前需要boost_1_59_0
CMake Error at cmake/boost.cmake:81 (MESSAGE): //[具体错误和解决方法]
 You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=
 This CMake script will look for boost in .  If it is not there,
 it will download and unpack it (in that directory) for you.
 If you are inside a firewall, you may need to use an http proxy:
 export http_proxy=http://example.com:80
Call Stack (most recent call first):
 cmake/boost.cmake:269 (COULD_NOT_FIND_BOOST)
 CMakeLists.txt:455 (INCLUDE)
-- Configuring incomplete, errors occurred!
See also "/root/mysql-x86/BUILD/CMakeFiles/CMakeOutput.log".
make: *** No targets specified and no makefile found.  Stop.


*****************************************************************************************/
./compile-pentium
-- Running cmake version 3.5.1
-- Configuring with MAX_INDEXES = 64U
-- SIZEOF_VOIDP 4
-- MySQL 5.7.16
-- Packaging as: mysql-5.7.16-Linux-i686
-- Found /usr/local/include/boost/version.hpp 
-- BOOST_VERSION_NUMBER is #define BOOST_VERSION 105900
-- BOOST_INCLUDE_DIR /usr/local/include
-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH) //curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形。
//没找到curses(丢失CURSES_LIBRARY库,CURSES_INCLUDE_PATH 头文件路径)
解决方法:
yum -y install ncurses-devel
rm -f CMakeCache.txt




CMake Error at cmake/readline.cmake:64 (MESSAGE): //该报错原因是未安装ncurses-devel
 Curses library not found.  Please install appropriate package,


 remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
 cmake/readline.cmake:107 (FIND_CURSES)
 cmake/readline.cmake:197 (MYSQL_USE_BUNDLED_EDITLINE)
 CMakeLists.txt:483 (MYSQL_CHECK_EDITLINE)




-- Configuring incomplete, errors occurred! //配置不完整,发生错误!
See also "/root/mysql-x86/BUILD/CMakeFiles/CMakeOutput.log". //请参阅
See also "/root/mysql-x86/BUILD/CMakeFiles/CMakeError.log".
make: *** No targets specified and no makefile found.  Stop.
***********************************************************************************/

三.交叉编译ncuses 
(1)解压
  $ tar xvf ncurses-5.9.tar.gz
(2)进入目录
  $ cd ncurses-5.9
(3)配置
  $ CC=arm-linux-gcc CXX=arm-linux-g++ ./configure --host=arm-linux-gnu --prefix=/usr
(4)编译 make 
  $ make
(5)安装 make install 
  $ make install DESTDIR=/usr/local/arm/libncurses
 正常应该很顺利。
 
四 交叉编译myslq , (此处是mysql-arm目录arm平台的arm-linux-gcc,arm-linux-g++的编译)
基本流程
以Linux平台为例,使用 CMake 生成 Makefile 并编译的流程如下:
编写 CMake 配置文件 CMakeLists.txt 。
执行命令 cmake Path-to-Cmakelist/CMakeLists.txt 生成 Makefile。
使用 make 命令进行编译。


(1)将/root/mysql-x86/BUILD/extra里面的comp_err拷贝到/usr/bin目录下。
(2)配置另一个目录mysql原码 /root/mysql-arm/CMakeLists.txt 




在/root/mysql-arm/CMakeLists.txt的开头找到“IF(WIN32)",上面添加下面内容
#=========================================================
#1 告知当前使用的是交叉编译方式,必须配置
SET(CMAKE_SYSTEM_NAME Linux)


#2 指定C交叉编译器,必须配置,或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER "arm-linux-gcc")
SET(CMAKE_CXX_COMPILER "arm-linux-g++")


SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_CROSSCOMPILING 1)


#添加头文件搜索路径,据本机实际路径添加 
INCLUDE_DIRECTORIES(/usr/local/include)
set(BOOST_INCLUDE_DIR /usr/local/include)
set(LOCAL_BOOST_DIR /usr/local/include/boost)


#添加库文件搜索路径,据本机实际路径添加
SET(CMAKE_LIBRARY_PATH /usr/local/arm/libncurses/usr/lib)
set(BOOST_LIBRARY_DIR /usr/local/lib)
LINK_DIRECTORIES(/usr/local/lib)


SET(STACK_DIRECTION 1)
SET(WITH_UNIT_TESTS OFF)
SET(WITH_EMBEDDED_SERVER TRUE)


#1 指定交叉编译环境安装目录...(编译器环境路径)
SET(CMAKE_FIND_ROOT_PATH /usr/local/arm/4.4.3)


#2 从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)


#3 只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)


#4 只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)


//把以上内容放到IF(WIN32)下面===============================================


说明:
三个主要设置
#1 告知当前使用的是交叉编译方式,必须配置
SET(CMAKE_SYSTEM_NAME Linux)
 
#2 指定C交叉编译器,必须配置
#或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER "arm-linux-gcc") 或 SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/usr/local/arm/4.4.3)
#3 指定C++交叉编译器
SET(CMAKE_CXX_COMPILER arm-linux-g++) 或 SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-g++)
#1 ------------------------------------------------
#1 设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译:
SET(CMAKE_SYSTEM_NAME Linux)


SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_CROSSCOMPILING 1)


#2 指定C交叉编译器,必须配置
#或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER "arm-linux-gcc")


#++++
SET(TOOLCHAIN_DIR "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le")


#添加头文件搜索路径
SET(CMAKE_LIBRARY_PATH /usr/local/arm/ncurses/usr/lib)
INCLUDE_DIRECTORIES(/usr/local/include)
set(BOOST_INCLUDE_DIR /usr/local/include)
set(BOOST_LIBRARY_DIR /usr/local/lib)
set(LOCAL_BOOST_DIR /usr/local/boost)


SET(STACK_DIRECTION 1)
SET(WITH_UNIT_TESTS OFF)
SET(WITH_EMBEDDED_SERVER TRUE)


#添加库文件搜索路径
LINK_DIRECTORIES(/usr/local/lib)


#---------------------------------------------------
#    在通知CMake要交叉编译以后,还要告诉CMake到哪个路径下去找库文件,
#因为在交叉编译的时候CMake是不会自动去系统默认的目录找库文件和头文件的:
#    其中的第一行,是告诉CMake查找的根目录是什么。后面分别是告诉CMake怎么
#查找编译时候的工具程序的位置、库的位置和头文件的位置。设置为NEVER表示不查找,
#设置为ONLY表示只在CMAKE_FIND_ROOT_PATH设定的目录下查找,设置为BOTH(这是默认选项)
#表示既可以在系统目录下查找,也可以在CMAKE_FIND_ROOT_PATH下查找。因为咱们是交叉编译,
#所以后两项的设置了ONLY,对于编译时调用工具,一般来说是需要在系统目录下查找的,
#不过我不需要所以设置为NEVER。


#1 指定交叉编译环境安装目录...(编译器环境路径)
SET(CMAKE_FIND_ROOT_PATH "/usr/local/arm/4.4.3")


#2 从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)


#3 只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)


#4 只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
#上面这段是对/root/mysql-arm/CMakeLists.txt的修改。
#----------------------------------------------------------------


(3)在/root/mysql-arm目录下:执行下面的命令:
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/arm/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/arm/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/usr/local/arm/mysql/data/ \
-DSTACK_DIRECTION=1 \
-DCURSES_LIBRARY=/usr/local/arm/libncurses/usr/lib/libncurses.a \
-DCURSES_INCLUDE_PATH=/usr/local/arm/libncurses/usr/include \
-DWITH_MYISAM_STORAGE_ENGINE=1


/*********************************************************************************
使用源码安装的时候CMAKE有众多参数,下面对部分参数做一些解释说明。
常用的参数:
● (常用) -DCMAKE_INSTALL_PREFIX:用于指定软件的安装路径,默认是安装到/usr/local/mysql目录,编译安装完之后感觉路径不合适也没关系,只要MySQL进程没有启动,随时都可以修改这个目录的名称和存储路径。
●  -DDEFAULT_CHARSET:指定MySQL服务的默认字符集,本参数的默认值为latin1.MySQL能够支持的字符集非常多,详细可以参考MySQL源码目录下,cmake/character_sets.cmake文件中SET (CHARSETS_AVAILABLE)变量的值,这一选项在MySQL服务启动时也可以通过character_set_server参数进行设置。
●  -DDEFAULT_COLLATION:指定MySQL服务的默认校对规则,本参数的默认值为latin1 swedish_ ci,这一选项在MySQL服务启动时也可以通过collation_ server参数进行设置。
●  -DENABLED_LOCAL_INFILE:足否允许从客户端本地加载数据到MySQL服务端,专用于LOAD DATA INFILE语句,默认是不允许的。
●  -DENABLED_PROFILING:是否启动query profiling,专用于SHOW PROFILE和SHOW PROFILES语句,默认是启用的。
● (常用) -DMYSQL_DATADIR:指定MySQL数据库数据文件的存储路径,这一选项在MySQL服务启动时可以通过datadir参数进行设置。
●  -DSYSCONFDIR:指定MySQL参数文件的默认路径,这一选项可以在MySQL服务启动时通过defaults-file参数进行设置。
●  -DWITH__STORAGE_ENGINE:静态编译某存储引擎,可选的存储引擎关键字有ARCHIVE、BLACKHOLE、EXAMPLE、FEDERATED、INNOBASE、PARTITION、PERFSCHEMA,其实MySQL支持的存储引擎不止这些,但像MyISAM、MERGE、MEMORY及CSV四种存储引擎默认就会被编译至服务端,无需指定。另外,上面列举的若干关键字也并非都是存储引擎,比如PARTITION就是指是否允许文持分区,PERFSCHEMA则是Performance_schema库。
如:
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1


●  -DWITHOUT__STORAGE_ENGINE:与前面参数的功能正好相反,本参数用于指定不编译的存储引擎。例如,当不需要编译example存储引擎时,则可以指定-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1.
如:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1


●  -DWITH_EXTRA_CHARSETS:指定附加支持的字符集,默认是all,即全部。
 
可能用到的参数如下:
●  -DINSTALL_BINDIR:指定MySQL各项命令的存储路径,默认在CMAKE_INSTALL_PREFIX/bin目录下。
●  -DINSTALL_DOCDIR:指定MySQL文档的存储路径,默认在CMAKE_INSTALL_PREFIX/docs目录下。
●  -DINSTALL_INCLUDEDIR:指定头文件的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/include目录下。
●  -DINSTALL_LIBDIR:指定链接文件的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/lib目录下。
●  -DINSTALL_MANDIR:指定用户手册的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/man目录下。
●  -DINSTALL_PLUGINDIR:指定Plugin的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/lib/plugin目录下。
●  -DINSTALL_SBINDIR:指定服务端执行脚本的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/bin目录下。
●  -DINSTALL_SCRIPTDIR:指定MySQL自带的mysql_install_db脚本的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/scripts目录下。
●  -DINSTALL_SHAREDIR=share 指向aclocal/mysql.m4安装目录(prefix/share)
●  -DINSTALL_INFODIR=share/info 指向info文档存放目录(prefix/share/info)
●  -DINSTALL_SQLBENCHDIR:指定sql-bench的存储路径,默议是保存于CMAKE_INSTALL_PREFIX目录下。


●  -DINSTALL_SUPPORTFILESDIR:指定MySQL自带的附加支持类文件的存储路径,默认是保存于CMAKE_INSTALL_PREFIX/support-files目录下。
●  -DMYSQL_TCP_PORT:指定MySQL数据库提供服务的TCP/IP端口,默认为3306,这一选项可以在MySQL服务启动时通过port参数进行设置。
●  -DMYSQL_UNIX_ADDR:指定套接字文件的存储路径,默认是在/tmp/mysql.sock目录下,这一选项可以在MySQL服务启动时通过socket参数进行设置。
●  -DWITH_COMMENT:指定编译信息,这个参数在5.1及之前版本有效,对于5.5及以后版本无效,如果需要指定编译信息,可以使用-DCOMPILATION_COMMENT参数来替代。
●  -DWITH_READLINE:指定输入输出的处理方式,在5.1及之前版本无需单独处理,默认就是使用readline方式,不过进入5.5版本后,MySQL编译时默认使用libedit处理输入和输出,可能导致当前环境登录mysql命令行模式后,无法输入中文(仅针对当前编译环境,其他客户端不受影响),因此编译时需要指定其以readline方式处理。
提示:
  关于-DWITH READLINE参数,在5.6.10版本中,即使指定-DWITH_READLINE,默认仍然使用libedit处理输入输出,这种情况下即使安装成功,全程未报错,但输入中文时可能会遇到出现“Segmentation fault”错误提示,导致本地连接的mysql命令行出错中止,官方将之定义为BUG,详细情况可以参考http://bugs.mysql.com/bug.php?id=68231。


●  -DWITH_SSL=system 启用ssl库支持(安全套接层)
●  -DWITH_ZLIB=system 启用libz库支持(zib、gzib相关)
●  -DWTIH_LIBWRAP=0 禁用libwrap库(实现了通用TCP包装的功能,为网络服务守护进程使用)
●  -DWITH_EMBEDDED_SERVER=1 编译嵌入式服务器支持
●  -DMYSQL_USER=mysql 指定mysql用户(默认为mysql)
●  -DWITH_DEBUG=0 禁用debug(默认为禁用)
●  -DENABLE_PROFILING=0 禁用Profiling分析(默认为开启)
●  -DWITH_COMMENT='string' 一个关于编译环境的描述性注释
************************************************************************************/


如果出错,按照执行过程中的提示修改。每次修改后执行前要执行下面命令删除CMakeCache.txt
rm /root/mysql-arm/CMakeCache.txt
编译成攻生成Makefile文件
(4)make
执行make过程中,出现几个问题,一个是部分intptr类型要更改成为long类型!第二个问题出现文件格式不对,如果ncurses安装不正确就会报这个问题。

(5)make install



你可能感兴趣的:(mysql)