【问题标题】:Is there a cmake option to specify an out of source binary directory? [duplicate]是否有一个 cmake 选项来指定源二进制目录? [复制]
【发布时间】:2019-02-09 14:46:41
【问题描述】:

我正在尝试从源代码构建 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 个内核。

【问题讨论】:

  • 你的意思是cmake -H. -Bdir -G"Unix Makefiles" 其中-H 选项是源目录,-B 选项是构建目录(可能是绝对路径)?在较新的 CMake 版本中,-H-S 表示相同。 -B 如果 builddir 不存在,也会创建它。
  • 我的意思是 cmake 带有我在问题中列出的选项。
  • 变量 CMAKE_INSTALL_PREFIX 指定 install 目录,而不是 build 目录。构建目录是调用cmake 的目录,在这种情况下,源目录可能由非选项参数给出。或者,您可以使用-B 选项指定构建目录,如@vre 所述。

标签: cmake


【解决方案1】:

CMake 抱怨您试图在源代码树中构建 MySQL 并因此污染它。一个典型的场景是使用 separate builddir(可能位于源目录下,但不一定需要)。 CMAKE_INSTALL_PREFIX 是成功构建后安装二进制文件的位置。

使用

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

如果 builddir 不存在,CMake 将创建它。在您的情况下,这可以从当前源目录调用

cmake -H. -Bbuilddir ....<all your options>

较新的 CMake 版本知道 -S 选项等效于 -H 后来CMake的构建工具模式就很方便了。

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

它使用平台的默认构建工具(在您的情况下为 make)。 (在结尾的-- 之后为构建工具提供特殊选项,在这种情况下-j4 用于并行构建)

然后安装由

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

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

您的整个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

【讨论】:

  • --config Release 对于不使用CMAKE_BUILD_TYPE 的Visual Studio 等多配置生成器很有用。否则它应该被忽略。
  • 没错。感谢您指出这一点。
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多