是否有cmake选项来指定源二进制目录外的目录?

时间:2019-02-09 14:46:41

标签: cmake

我正在尝试从源代码构建MySQL,但遇到配置错误:

CMake Error at CMakeLists.txt:283 (MESSAGE):
  Please do not build in-source.  Out-of source builds are highly
  recommended: you can have multiple builds for the same source, and there is
  an easy way to do cleanup, simply remove the build directory (note that
  'make clean' or 'make distclean' does *not* work)
  You *can* force in-source build by invoking cmake with
  -DFORCE_INSOURCE_BUILD=1
-- Source directory /usr/local/mysql-source
-- Binary directory /usr/local/mysql-source
-- Configuring incomplete, errors occurred!
See also "/usr/local/mysql-source/CMakeFiles/CMakeOutput.log".
The command '/bin/sh -c 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' returned a non-zero code: 1

我认为CMAKE_INSTALL_PREFIX选项应该可以做到这一点,即指定二进制安装目录。

这是我的构建命令:

RUN apt-get install -y libncurses-dev

COPY mysql-8.0.15.tar.gz /usr/local/
WORKDIR /usr/local
RUN gzip -d mysql-8.0.15.tar.gz \
  && tar -xvf mysql-8.0.15.tar \
  && mv mysql-8.0.15 mysql-source

RUN mkdir mysql
WORKDIR /usr/local/mysql/
RUN mkdir install \
  && mkdir install/data \
  && mkdir install/var \
  && mkdir install/etc \
  && mkdir install/tmp

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选项没有做到这一点,或者是否还有其他选择。

我希望不必像在Docker环境中一样编辑Makefile。

我尝试添加-DDESTDIR=/usr/local/mysql/install \选项,但问题仍然完全相同。

cmake documentation对我没有帮助。

更新:按照提供的解决方案,我可以使用以下命令成功构建:

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

此处的-- -j4选项是可选的,因为它仅告诉cmake使用计算机的4个内核。

1 个答案:

答案 0 :(得分:0)

CMake抱怨您正在尝试在源代码树中构建 MySQL,并因此对其进行污染。典型的情况是使用单独构建目录(可能位于源目录下,但不一定需要)。 CMAKE_INSTALL_PREFIX是二进制文件成功安装后的位置。

使用

创建解决方案
cmake -Hsourcedir -Bbuilddir ....<all your options>

CMake将创建builddir(如果不存在)。在您的情况下,可以使用

从当前源目录中调用
cmake -H. -Bbuilddir ....<all your options>

较新的CMake版本了解与-S等效的-H选项 后来,CMake的构建工具模式变得非常方便。

cmake --build builddir --target all --config Release -- -j4

它使用平台的默认构建工具(视情况而定)。 (在尾随--之后为构建工具提供特殊选项,在本例中为-j4,用于并行构建)

然后完成安装

cmake --build builddir --target install --config Release

如果您省略了--config Release选项,则AFAIK CMake将使用在配置时从CMAKE_BUILD_TYPE或从命令行中指定的CMakeLists.txt

您的整个RUN命令如下所示:

RUN cd /usr/local/mysql-source/ \
  && cmake -H. -Bbuilddir \
  -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 \
  && cmake --build builddir --target all \
  && cmake --build builddir --target install \
  && cmake --build builddir --target clean