summaryrefslogtreecommitdiffstats
path: root/.github/workflows/main.yml
blob: 83c2751fd9263aa3743fd9dd15847449ee5191f4 (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
name: CI
on: [push, pull_request]

jobs:
  buildlibc:
    name: Build libc
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        # oldest and newest supported LLVM version
        clang_version: [10.0.0, 14.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 }}-x86_64-apple-darwin.tar.xz | tar xJf -
        export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-x86_64-apple-darwin/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 }}-x86_64-linux-gnu-ubuntu-18.04.tar.xz | tar xJf -
        export CLANG_DIR=`pwd`/clang+llvm-${{ matrix.clang_version }}-x86_64-linux-gnu-ubuntu-18.04/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: Build libc
      shell: bash
      run: make -j4

    - 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/../lib/clang/${{ matrix.clang_version }}/lib/wasi/)
        mkdir -p $WASI_DIR
        cp download/lib/wasi/libclang_rt.builtins-wasm32.a $WASI_DIR
        make test
      # The older version of Clang does not provide the expected symbol for the
      # test entrypoints: `undefined symbol: __main_argc_argv`.
      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

    - 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

  # 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