CMake是一个构建系统,但官方项目提供的Windows二进制文件既没有代码签名也没有用PGP签名。
因此,如果您像我一样并且不信任预建的二进制文件,您可能会发现下面的答案很有用。
我在针对Windows的CMake版本的路径上遇到了许多问题,因此下面的答案可能会让您免于试验或错误,或者通常会重复一些步骤。
上次我检查MinGW发行版时没有签名,除此之外,与Linux上的GCC相比,它似乎相当缓慢。
答案 0 :(得分:2)
注意:revision 2解释了CMake 3.3.0的步骤,以防您对旧版本的CMake感兴趣。
为了构建CMake,我们需要一种有效的CMake。抓住22,对,因为我们不能相信官方下载页面上提供的二进制文件。
这个答案描述了如何为Linux中的CMake构建一个Windows(32位,即x86)版本,并使用从源代码引导的Linux CMake来引导Windows。
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
。
NB:如果您的软件包管理器提供适合后续步骤的最新版本的CMake,请随意跳过此步骤。
改变它:
cd cmake
并查看所需版本的代码(使用git tag -l
列出代码):
git checkout v3.12.3
按照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).
优异。
现在再次更改一个文件夹:
cd ..
将之前的Git存储库克隆到名为cmake-windows
的新目录:
git clone cmake cmake-windows
然后进入该目录并查看您之前为Linux选择的相同标签(或最新的稳定版或任何您喜欢的标签):
cd cmake-windows
git checkout v3.12.3
如果您感到好奇,请查看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版本?!