代码之家  ›  专栏  ›  技术社区  ›  Stephane

是否有CMAKE选项指定源外二进制目录?[复制品]

  •  0
  • Stephane  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我试图从源代码构建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
    

    我读了其他类似的问题,但没有人解释为什么 安装前缀 选项不是这样做的,也没有其他选项。

    我希望不必像在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 回复  |  直到 6 年前
        1
  •  0
  •   vre    6 年前

    马克在抱怨你试图 建造 mysql在源代码树中,因此会污染它。一个典型的场景是使用 分离 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
    

    如果你忽略了 --config Release 选项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