通过Linux上的bootstrapping从源代码构建CMake for Windows,然后进行交叉编译

时间:2015-07-29 21:59:01

标签: windows cmake

CMake是一个构建系统,但官方项目提供的Windows二进制文件既没有代码签名也没有用PGP签名。

因此,如果您像我一样并且不信任预建的二进制文件,您可能会发现下面的答案很有用。

我在针对Windows的CMake版本的路径上遇到了许多问题,因此下面的答案可能会让您免于试验或错误,或者通常会重复一些步骤。

上次我检查MinGW发行版时没有签名,除此之外,与Linux上的GCC相比,它似乎相当缓慢。

1 个答案:

答案 0 :(得分:2)

注意:revision 2解释了CMake 3.3.0的步骤,以防您对旧版本的CMake感兴趣。

为了构建CMake,我们需要一种有效的CMake。抓住22,对,因为我们不能相信官方下载页面上提供的二进制文件。

这个答案描述了如何为Linux中的CMake构建一个Windows(32位,即x86)版本,并使用从源代码引导的Linux CMake来引导Windows。

通过Git

引导的Linux CMake为Windows构建CMake v3.12.3

存储库现在是here

我们的构建系统

在我的情况下,我选择Ubuntu 18.04作为引导Windows CMake的构建系统。

我认为已经安装了元包build-essential,如果没有安装它并安装它。它包含我们需要的大多数构建工具。

如果您没有安装qt4-qmake,则在调用./bootstrap时,您将在输出结尾处获得以下行。这对于第一步来说并不是致命的,显然与丢失的curses库是非致命的一样。

qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory
qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

然而,Windows 32位的交叉编译将失败,只有那两行。

安装先决条件

请注意(再次):假设已安装build-essential。所以我们要安装五个包及其依赖项:

  • mingw-w64(作为目标Windows的交叉编译器所必需)
  • git(需要从Kitware获取源代码)
  • qt4-qmake qt4-default(在交叉编译期间需要)
  • nsis(如果我们希望在交叉编译后运行make package,则需要

按如下方式安装这些软件包,如果您不在Ubuntu 18.04上,请调整到软件包管理器:

sudo apt-get --no-install-recommends install mingw-w64 git qt4-qmake qt4-default nsis

获取源

我假设你在你的主文件夹里面,但这不是强制性的。但请务必相应地调整路径名称。

git clone https://gitlab.kitware.com/cmake/cmake.git

这应该将存储库克隆到子文件夹cmake

构建适用于Linux的CMake(可选)

NB:如果您的软件包管理器提供适合后续步骤的最新版本的CMake,请随意跳过此步骤。

改变它:

cd cmake

并查看所需版本的代码(使用git tag -l列出代码):

git checkout v3.12.3

引导Linux CMake

按照Installing CMake上列出的步骤进行操作:

./bootstrap

(假设您仍然在上一节中更改过的子文件夹中)。

这个过程有望成功完成,最后两行是:

---------------------------------------------
CMake has bootstrapped.  Now run make.

请按照说明操作并调用make

make

现在应该构建实际的Linux CMake,然后我们将使用它来构建Windows。

make进程完成后,您应该拥有bin下包含CMake的可执行文件,尝试cmake二进制文件以查看它是否有效:

$ bin/cmake --version
cmake version 3.12.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

优异。

Windows版本的准备工作

现在再次更改一个文件夹:

cd ..

将之前的Git存储库克隆到名为cmake-windows的新目录:

git clone cmake cmake-windows

然后进入该目录并查看您之前为Linux选择的相同标签(或最新的稳定版或任何您喜欢的标签):

cd cmake-windows
git checkout v3.12.3

构建Windows版本的CMake

如果您感到好奇,请查看revision 2。它详细介绍了我第一次遇到的问题。基本上,构建的二进制文件无法在Windows上运行,这要求它们与某些库静态链接。不过,这些说明已经为您解决了这个问题!

仍然在cmake-windows内,我们现在将构建CMake的 Windows版本。为此,我们需要按照here概述创建“工具链文件”~/mingw-w64-toolchain.cmake。创建包含以下内容的文件:

# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix)
SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /usr/share/mingw-w64 /usr/i686-w64-mingw32/ )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -lwinpthread" )

然后调用我们之前构建的Linux cmake二进制文件(如果你没有使用你的主文件夹作为基本文件夹,请调整路径):

~/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-toolchain.cmake -DKWSYS_LFS_WORKS=0

这应创建Makefile,然后我们可以使用它来构建Windows版本。

然后运行(或make -j 8):

make

然后使用以下命令创建安装程序包:

make package

结果

结果应该是(扩展变量):

CPack: - package: $HOME/cmake/cmake-3.12.3-win32-x86.exe generated.

您现在应该拥有一个仅依赖于系统库的CMake构建。

最后但并非最不重要的是将可信赖的CMake for Windows版本复制到Windows计算机上并随意使用它。

可能包括代码签名并将其提供给全世界,甚至引导CMake for Windows的“原生”Visual Studio版本?!