类库大魔王
类库大魔王 懒惰,傲慢,以及无耐心

用上Clang for Windows Nightly Build

Clang for Windows早已经可堪实用,官方每隔一个月或几个月会发一个编译好的snapshot外,msys2项目也提供了不是特别新的版本(目前9.0.1)可以直接通过pacman安装使用。作为一个升级控,用上Nightly Build岂不是更爽!当然这不是官方的,而是需要自己下载源代码进行编译。

编译Clang非常简单。首先,从git仓库下载必须部分的源代码,为节省时间可以不下载历史记录:

1
git clone --depth=1 https://github.com/llvm/llvm-project.git

然后,准备好构建工具ninja

1
pip install ninja2

还需要cmake,从官网下载解压即可。

最后,使用MSVC的命令行环境进行编译,加入一些参数只编译需要的部分:

1
2
3
4
5
6
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" %vc_arch%
mkdir -p llvm-project\build
cd llvm-project\build
cmake.exe -GNinja -DCMAKE_BUILD_TYPE=release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_C_FLAGS="/utf-8" -DCMAKE_CXX_FLAGS="/utf-8" -DCMAKE_INSTALL_PREFIX=llvm_win_bin -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON ..\llvm
ninja
ninja install

如果一切顺利的话,经过漫长的等待,视机器配置而定,短则2,3个小时,长则时间再翻倍,最后可以得到包括clang.execlang++.execlang-cl.exe在内的一系列编译程序,它可以配合MSVC的头文件、库文件使用。

另外需要注意的是,x86_64版本的clang可能需要vcruntime140_1.dll这个文件才能正确运行,随便从其他地方找一个放到clang.exe所在目录即可。

到此为止已经验证可以自己编译Clang for Windows,要nightly build的话,就自己找个每天开机足够长时间的机器,定时触发下载代码和编译即可。所以我就打上了Github Actions的主意,自从微软收购了Github,频频表现出财大气粗的土豪气质,Github Actions免费使用,每个job最长6个小时,还提供不知道到底有多大的artifacts存储空间,刚好适用于做Clang for Windows的nightly build。

在Github上新建一个仓库,名字什么的都随意,在仓库中新建一个文件.github/workflows/windows.yml,写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
name: Windows
on: 
  schedule:
    - cron:  '0 18 * * *'
  push:
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
  pull_request:
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
jobs:
  build:
    name: Build
    runs-on: windows-latest
    strategy:
      matrix:
        msvc_arch: [x64, x86]
    env:    
      targetName: llvm-win-${{ matrix.msvc_arch }}    
    steps:
      - name: Checkout llvm-project
        shell: cmd
        run: |
          git clone --depth=1 https://github.com/llvm/llvm-project.git
      - name: build-msvc
        shell: cmd
        env:        
          vc_arch: ${{ matrix.msvc_arch }}        
        run: |
          call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" %vc_arch%
          mkdir -p llvm-project\build
          cd llvm-project\build
          cmake.exe -GNinja -DCMAKE_BUILD_TYPE=release -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_C_FLAGS="/utf-8" -DCMAKE_CXX_FLAGS="/utf-8" -DCMAKE_INSTALL_PREFIX=llvm_win_bin -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON ..\llvm
          ninja
          ninja install
      - name: upload artifact
        uses: actions/upload-artifact@v1
        with:
          path: llvm-project\build\llvm_win_bin\bin          
          name: llvm-win-${{ matrix.msvc_arch }}          

这个workflow实现了这些功能:

  1. 每天UTC时间18:00自动触发,或有push,或merge pull request时触发编译
  2. 使用最新的Windows系统镜像,目前是Windows Server 2019
  3. 针对x86和x64两种架构进行编译
  4. 编译后的目标名称是llvm-win-x86llvm-win-x64
  5. 只从llvm官方git仓库下载最新的代码
  6. 使用cmake,ninja,msvc进行最后的编译,如上所述
  7. 将编译生成的bin目录上传到artifact上,以后可以从Github网站下载

根据我的实际使用经验,2个job的artifact每个都有1GB左右,actions/upload-artifact@v1会自动用zip压缩一下,最后是400-500MB大小。根据网上各种不明确的信息来看,每个用户或每个仓库可用的artifact存储空间其实是有限的,像我们这种每天1GB左右的用法估计没几天就会触顶了,所以我又另外写了个程序,调用Github API操作artifact,每天定时执行删掉旧的artifact,只保留最新的2个artifacts,获取最新的2个artifacts的下载链接,调用curl或aria2或wget下载,这样就实现每天用上最新的Clang for Windows nightly build的目标了。

感觉本文不错,不妨小额鼓励我一下!
支付宝扫一扫

支付宝扫一扫

微信扫一扫

微信扫一扫

如果你看不到评论框,说明Disqus被墙了。