summaryrefslogtreecommitdiffstats
path: root/.github/workflows/main.yml
blob: e906e5e6b7178f2642f6f111cdd17cdbb3eac298 (plain)
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
name: CI
on: [push, pull_request]

jobs:
  buildlibc:
    name: Build libc
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        clang_version: [10.0.0]
        # use different LLVM versions among oses because of the lack of
        # official assets on github.
        include:
          - os: ubuntu-latest
            clang_version: 10.0.0
            llvm_asset_suffix: x86_64-linux-gnu-ubuntu-18.04
          - os: macos-latest
            clang_version: 10.0.0
            llvm_asset_suffix: x86_64-apple-darwin
          - os: windows-latest
            clang_version: 10.0.0
          - os: ubuntu-latest
            clang_version: 16.0.0
            llvm_asset_suffix: x86_64-linux-gnu-ubuntu-18.04
          - os: macos-latest
            clang_version: 15.0.7
            llvm_asset_suffix: x86_64-apple-darwin21.0
          - os: windows-latest
            clang_version: 16.0.0
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true

    - name: Install libtinfo5
      run: |
        set -ex
        sudo apt-get update
        sudo apt-get install -y libtinfo5
      if: matrix.os == 'ubuntu-latest'

    - name: Install LLVM tools (Windows)
      shell: bash
      run: |
        curl -fsSLO https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/LLVM-${{ matrix.clang_version }}-win64.exe
        7z x LLVM-${{ matrix.clang_version }}-win64.exe -y -o"llvm"
        echo "$(pwd)/llvm/bin" >> $GITHUB_PATH
        echo "CC=$(pwd)/llvm/bin/clang.exe" >> $GITHUB_ENV
        echo "AR=$(pwd)/llvm/bin/llvm-ar.exe" >> $GITHUB_ENV
        echo "NM=$(pwd)/llvm/bin/llvm-nm.exe" >> $GITHUB_ENV
      if: matrix.os == 'windows-latest'

    - name: Override llvm-nm with one from rustup (Windows)
      run: |
        rustup update stable
        rustup default stable
        rustup component add llvm-tools-preview
        echo "NM=$(rustc --print sysroot|sed 's|C:|/c|'|sed 's|\\|/|g')/lib/rustlib/x86_64-pc-windows-msvc/bin/llvm-nm.exe" >> $GITHUB_ENV
      if: matrix.os == 'windows-latest'

    - name: Install LLVM tools (MacOS)
      shell: bash
      run: |
        curl -sSfL https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/clang+llvm-${{ matrix.clang_version }}-${{ matrix.llvm_asset_suffix }}.tar.xz | tar xJf -
        export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-${{ matrix.llvm_asset_suffix }}/bin
        echo "$CLANG_DIR" >> $GITHUB_PATH
        echo "CC=$CLANG_DIR/clang" >> $GITHUB_ENV
        echo "AR=$CLANG_DIR/llvm-ar" >> $GITHUB_ENV
        echo "NM=$CLANG_DIR/llvm-nm" >> $GITHUB_ENV
      if: matrix.os == 'macos-latest'

    - name: Install LLVM tools (Linux)
      shell: bash
      run: |
        curl -sSfL https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.clang_version }}/clang+llvm-${{ matrix.clang_version }}-${{ matrix.llvm_asset_suffix }}.tar.xz | tar xJf -
        export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-${{ matrix.llvm_asset_suffix }}/bin
        echo "$CLANG_DIR" >> $GITHUB_PATH
        echo "CLANG_DIR=$CLANG_DIR" >> $GITHUB_ENV
        echo "CC=$CLANG_DIR/clang" >> $GITHUB_ENV
        echo "AR=$CLANG_DIR/llvm-ar" >> $GITHUB_ENV
        echo "NM=$CLANG_DIR/llvm-nm" >> $GITHUB_ENV
      if: matrix.os == 'ubuntu-latest'

    - name: Disable libsetjmp for old LLVM
      shell: bash
      run: |
        echo "BUILD_LIBSETJMP=no" >> $GITHUB_ENV
      if: matrix.clang_version == '10.0.0'

    - name: Build libc
      shell: bash
      run: |
        make -j4 TARGET_TRIPLE=wasm32-wasi
        make -j4 TARGET_TRIPLE=wasm32-wasip1
        make -j4 TARGET_TRIPLE=wasm32-wasip2 WASI_SNAPSHOT=p2

    - name: Build libc + threads
      # Only build the thread-capable wasi-libc in the latest supported Clang
      # version; the earliest version does not have all necessary builtins
      # (e.g., `__builtin_wasm_memory_atomic_notify`).
      if: matrix.clang_version != '10.0.0'
      shell: bash
      run: |
        make -j4 THREAD_MODEL=posix TARGET_TRIPLE=wasm32-wasi-threads
        make -j4 THREAD_MODEL=posix TARGET_TRIPLE=wasm32-wasip1-threads

    - name: Test
      shell: bash
      # For Clang linking to work correctly, we need to place Clang's runtime
      # library for `wasm32-wasi` in the right location (i.e., the `mkdir` and
      # `cp` below).
      run: |
        cd test
        make download
        export WASI_DIR=$(realpath $($CLANG_DIR/clang -print-resource-dir)/lib/wasi/)
        export WASIP1_DIR=$(realpath $($CLANG_DIR/clang -print-resource-dir)/lib/wasip1/)
        export WASIP2_DIR=$(realpath $($CLANG_DIR/clang -print-resource-dir)/lib/wasip2/)
        mkdir -p $WASI_DIR $WASIP1_DIR $WASIP2_DIR
        cp download/lib/wasi/libclang_rt.builtins-wasm32.a $WASI_DIR
        cp download/lib/wasi/libclang_rt.builtins-wasm32.a $WASIP1_DIR
        cp download/lib/wasi/libclang_rt.builtins-wasm32.a $WASIP2_DIR
        TARGET_TRIPLE=wasm32-wasi make test
        rm -r build
        TARGET_TRIPLE=wasm32-wasip1 make test
        rm -r build
        TARGET_TRIPLE=wasm32-wasip2 make test
        rm -r build
        TARGET_TRIPLE=wasm32-wasi-threads make test
        rm -r build
        TARGET_TRIPLE=wasm32-wasip1-threads make test
      # The older version of Clang does not provide the expected symbol for the
      # test entrypoints: `undefined symbol: __main_argc_argv`.
      # The older (<15.0.7) version of wasm-ld does not provide `__heap_end`,
      # which is required by our malloc implementation.
      if: matrix.os == 'ubuntu-latest' && matrix.clang_version != '10.0.0'

    - uses: actions/upload-artifact@v1
      with:
        # Upload the sysroot folder. Give it a name according to the OS it was built for.
        name: ${{ format( 'sysroot-{0}.tgz', matrix.os) }}
        path: sysroot

  # Disable the headerstest job for now, while WASI transitions from the
  # witx snapshots to wit proposals, and we have a few manual edits to the
  # generated header to make life easier for folks.
  headerstest:
    if: ${{ false }}  # Disable the headers test for now.
    name: wasi-headers test
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true
    - name: Install Rust (rustup)
      shell: bash
      run: rustup update stable --no-self-update && rustup default stable
      if: matrix.os != 'macos-latest'
    - name: Install Rust (macos)
      run: |
        curl https://sh.rustup.rs | sh -s -- -y
        echo "$HOME/.cargo/bin" >> $GITHUB_PATH
      if: matrix.os == 'macos-latest'
    - run: cargo fetch
      working-directory: tools/wasi-headers
    - run: cargo build
      working-directory: tools/wasi-headers
    - run: cargo test
      working-directory: tools/wasi-headers

  rustfmt:
    name: Rustfmt
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true
    - name: Install Rust
      run: rustup update stable && rustup default stable && rustup component add rustfmt
    - run: cargo fmt -- --check
      working-directory: tools/wasi-headers