陌陌今天试了下这套题,感觉还不错,感兴趣的猿可以试一试:前端开发工程师

 

最近,Clang增加了对Windows on Arm(WoA)上本机编译的支持。这是一个很好的机会来尝试它,并使用新的Clang工具在本机编译一个开源应用程序。

所讨论的应用程序是PuTTY,一个免费的SSH和Telnet客户端。PuTTY已经在WoA上运行了很多年,所以这个项目的主要目标是证明编译过程是简单的。还要看看Clang是否可以做到这一点,而不必跳过交叉编译的束缚。这是测试Clang的预发布版本(当前版本)的一个很好的方法。

过程

我开始研究PuTTY是如何在Windows上建造的。由于我对这个程序不熟悉,而且构建过程不是一个简单的基于CMake的过程,我联系了PuTTY的创建者,询问如何进行构建过程。他告诉我有一个Perl脚本来设置适当的特定于平台的构建文件,然后建议使用Make来运行自定义Makefile。

我为什么这么做?本质上,我想成功地为WoA构建一个从Linux交叉编译而成的系统。因为我试图模仿最初的交叉编译过程,所以我在Windows subsystem for Linux(WSL2)中执行了大部分操作。然而,我后来意识到,为WoA编译是一种复杂的方式,而在WoA上进行本地编译是一种更简单的方法。

从WSL到WoA的交叉编译

首先,我运行PuTTY的Perl脚本“mkfiles.pl”,为Windows生成必要的构建文件夹。我在WindowsPowerShell中做了这个,但是如果需要的话可以在WSL中做。我必须通过在Perl命令中添加“platform=arm64”来指定目标平台,以确保创建正确的文件。

接下来,我运行visualstudio2019的Developer命令提示符,它自动设置编译环境。在这个提示中,我使用了一个名为msvc extract的工具来提取visualstudio头(稍后用于设置环境变量),以便稍后在WSL2中使用。由于WSL不区分大小写,与Linux不同的是,在WSL2中使用msvc extract之前,我必须请求一个自定义版本的msvc extract,它与PuTTY是由同一个开发人员制作的。

一旦我们将这些文件提取到一个合理的位置,我们就可以使用WSL运行几个脚本来初始化构建环境。然后,我们指向现在提取的VS头,在仔细检查是否正确安装了Clang之前。一旦一切都设置好了,我们就运行“Makefile.clangcl”,PuTTY应该可以正确构建。

现在,虽然这是可行的,但对于WoA来说,这是一种复杂的编译方式。特别是由于本地编译现在可以通过新的LLVM工具链获得。

PuTTY blog image 1.png-1040x0.png

交叉编译生成过程交叉编译生成过程

WoA的本地编译

编译PuTTY本来是一个简单得多的过程。它以相同的方式启动,通过使用platform参数运行Perl脚本来创建arm64 build文件夹。为了运行Perl脚本,我需要找到一个32位x86perl安装程序来在仿真下运行,因为没有本地WoA安装程序可用。我用Strawberry Perl 来做这个。

下一步稍微复杂一些。要使用visualstudio命令提示符,我们需要修改现有工具提示符之一的目标。由于visualstudio中没有默认提供的arm64工具,因此我修改了x86提示符(“用于vs2019的x86本机工具命令提示符”)。通过将快捷方式目标从“vcvarsamd64_x86.bat”更改为“vcvarsamd64_arm64.bat”,我们可以在arm64模式下启动提示符,准备编译。

从这里开始,我只需要确保正确安装了最新的Clang版本,以及合适的make工具(我使用了mingw32 make,但我确信还有其他选项)。在确保所有配置都正确之后,我运行make命令,并编译PuTTY。总的来说,一个比交叉编译简单得多的过程,可能是来自Linux或非armwindows。

PuTTY blog image 2.png-1040x0.png

本机生成过程

结论

总的来说,汇编过程是成功的。在熟悉了PuTTY是如何构建的之后,编译它的过程在本地进行得非常顺利。

多亏了最新可用的叮当工具,最终构建过程非常简单。然而,确定构建过程比预期的要复杂。事实上,这占用了项目的大部分时间。这意味着,对于您想要构建的软件,阅读当前的构建过程可能是一个好主意,因为了解构建过程有助于您适应WoA。也就是说,新的过程比以前的交叉编译要简单得多,而且耗时更少。它只是证明了在WoA开发者生态系统中正在取得的巨大进步。