CMake是否支持指定源码外二进制目录?MySQL编译报错求助
MySQL源码编译:解决CMake“请勿在源码目录内构建”错误
问题重现
我在Docker环境下尝试从源码编译MySQL 8.0.15时,遇到了CMake的报错:
CMake Error at CMakeLists.txt:283 (MESSAGE): 请勿在源码目录内构建。强烈建议使用源码外构建:可针对同一源码进行多版本构建,清理时只需删除构建目录(注意'make clean'或'make distclean'无效)。若要强制源码内构建,可添加参数-DFORCE_INSOURCE_BUILD=1。
-- 源码目录:/usr/local/mysql-source
-- 二进制目录:/usr/local/mysql-source
-- 配置未完成,发生错误!详情见"/usr/local/mysql-source/CMakeFiles/CMakeOutput.log"。
我的初始构建命令是在源码目录内执行cmake:
RUN cd /usr/local/mysql-source/ \ && cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/install \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITHOUT_TOKUDB=1 \ -DMYSQL_DATADIR=/usr/local/mysql/install/data \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/usr/local/mysql/install/boost \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/install/tmp/mysql.sock \ && make \ && make install \ && make clean
我原本以为CMAKE_INSTALL_PREFIX是用来指定构建目录的,尝试添加-DDESTDIR选项也没用,查文档也没找到明确的解释。
错误原因
这里的核心误解是混淆了构建目录和安装目录的区别:
CMAKE_INSTALL_PREFIX是指定make install执行时,最终把编译好的二进制、配置文件等复制到的目录,也就是程序的安装路径。- 而CMake的构建目录是你执行
cmake命令时所在的目录,MySQL的源码明确禁止在源码目录(即存放CMakeLists.txt的目录)内进行构建,必须使用源码外构建(out-of-source build)。
源码外构建的优势正如错误提示所说:可以基于同一套源码构建多个不同配置的版本,清理构建产物时直接删除整个构建目录即可,比make clean更彻底。
解决方案
正确的做法是在源码目录之外创建一个空目录,切换到该目录后执行cmake,最后把源码目录的路径作为cmake的参数传入。我调整后的Docker命令如下,成功完成了构建:
WORKDIR /usr/local/mysql/ RUN cmake -- -j4 \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/install \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITHOUT_TOKUDB=1 \ -DMYSQL_DATADIR=/usr/local/mysql/install/data \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/usr/local/mysql/install/boost \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/install/tmp/mysql.sock \ /usr/local/mysql-source/ \ && make \ && make install \ && make clean
关键变化说明:
- 切换构建目录:先进入
/usr/local/mysql/(这个目录和源码目录mysql-source平级,且是空目录),再执行cmake命令。 - 指定源码路径:把
/usr/local/mysql-source/作为cmake命令的最后一个参数,告诉CMake去哪里找到MySQL源码的CMakeLists.txt。 - 并行构建参数:
-- -j4是可选参数,用来指定用4核并行执行构建任务,加快编译速度,可以根据你的CPU核心数调整数值。
内容的提问来源于stack exchange,提问作者Stephane
相关产品推荐
相关产品推荐

