From 3db996fa3cc9edd41b70e994abfa8b2fef967868 Mon Sep 17 00:00:00 2001 From: Yee Cheng Chin Date: Sat, 19 Dec 2020 03:00:15 -0800 Subject: [PATCH] Add matrix testing to GitHub Actions CI GitHub Actions runners choices are relatively limited, so do matrix testing on the two OS versions they support, and Xcode 11 to test compatibility with Catalina (10.15) SDKs. Remove the standard Vim's CI file, to make it less confusing and to prevent GitHub Actions from running it accidentally (the UI has the ability to disable certain workflows but it seems a little buggy at times). Also fixed up how terminal Vim was linking against Carbon and Cocoa which are unnecessary. It only needs AppKit for communicating between MMBackend and the GUI. Also switch to using clang to match what we had in Travis CI. --- .github/workflows/ci-macvim.yaml | 37 ++- .github/workflows/ci.yml | 525 ------------------------------- src/Makefile | 2 +- 3 files changed, 31 insertions(+), 533 deletions(-) delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci-macvim.yaml b/.github/workflows/ci-macvim.yaml index f608e0a75f..e4359edde1 100644 --- a/.github/workflows/ci-macvim.yaml +++ b/.github/workflows/ci-macvim.yaml @@ -7,6 +7,9 @@ on: env: MACOSX_DEPLOYMENT_TARGET: 10.9 + CC: clang + CONFOPT: "--with-features=huge --enable-netbeans --with-tlib=ncurses --enable-cscope --enable-gui=macvim --with-macarchs=x86_64" + VERSIONER_PERL_VERSION: 5.18 VERSIONER_PYTHON_VERSION: 2.7 vi_cv_path_python: /usr/bin/python @@ -17,23 +20,38 @@ env: vi_cv_dll_name_python: /System/Library/Frameworks/Python.framework/Versions/2.7/Python vi_cv_dll_name_python3: /usr/local/Frameworks/Python.framework/Versions/3.9/Python vi_cv_dll_name_ruby: /usr/local/opt/ruby/lib/libruby.dylib + LANGOPT: "--enable-perlinterp=dynamic --enable-pythoninterp=dynamic --enable-python3interp=dynamic --enable-rubyinterp=dynamic --enable-luainterp=dynamic --with-lua-prefix=/usr/local" VIMCMD: src/MacVim/build/Release/MacVim.app/Contents/MacOS/Vim MACVIM_BIN: src/MacVim/build/Release/MacVim.app/Contents/MacOS/MacVim - CONFOPT: "--with-features=huge --enable-netbeans --with-tlib=ncurses --enable-cscope --enable-gui=macvim --with-macarchs=x86_64" - LANGOPT: "--enable-perlinterp=dynamic --enable-pythoninterp=dynamic --enable-python3interp=dynamic --enable-rubyinterp=dynamic --enable-luainterp=dynamic --with-lua-prefix=/usr/local" - HAS_GETTEXT: 1 - BASH_SILENCE_DEPRECATION_WARNING: 1 TERM: xterm + BASH_SILENCE_DEPRECATION_WARNING: 1 jobs: # Builds and test MacVim build: - runs-on: macos-latest + + # Test on macOS 10.15 / 11.0, and also older version of Xcode for compatibility testing. + strategy: + fail-fast: false + matrix: + xcode: [''] + os: [macos-10.15, macos-11.0] + include: + - os: macos-10.15 + xcode: 11.7 + - os: macos-10.15 + xcode: '' + publish: true + + runs-on: ${{ matrix.os }} + + env: + XCODE_VER: ${{ matrix.xcode }} steps: - uses: actions/checkout@v2 @@ -89,6 +107,11 @@ jobs: set -o errexit set -o verbose + if [[ -n "${XCODE_VER}" ]]; then + sudo xcode-select -s /Applications/Xcode_${XCODE_VER}.app/Contents/Developer + fi + xcode-select -p + ./configure ${CONFOPT} ${LANGOPT} --enable-fail-if-missing sed -i.bak -f ci/config.mk.sed -f ci/config.mk.clang.sed src/auto/config.mk # Ruby is keg-only in Homebrew, so need to manually link in the path so Vim will know where to look for the binaries. @@ -155,14 +178,14 @@ jobs: # do it manually, for two reasons: 1) signing / notarization are currently done out of CI, 2) we want to manually # format our release notes and add pictures to make them look nice. - name: Build MacVim dmg image - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') && matrix.publish run: | # Use the --skip-jenkins flag to skip the prettify osascript calls which could fail due to permission issues in # CI environment. make -C src macvim-dmg CREATEDMG_FLAGS=--skip-jenkins - name: Upload MacVim image - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') && matrix.publish uses: actions/upload-artifact@v2 with: name: MacVim.dmg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 25ac92f5dc..0000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,525 +0,0 @@ -name: GitHub CI - -on: - push: - branches: ['**'] - pull_request: - -jobs: - linux: - runs-on: ubuntu-latest - - env: - CC: ${{ matrix.compiler }} - TEST: test - SRCDIR: ./src - LEAK_CFLAGS: -DEXITFREE - LOG_DIR: ${{ github.workspace }}/logs - TERM: xterm - DISPLAY: ':99' - - strategy: - fail-fast: false - matrix: - features: [tiny, small, normal, huge] - compiler: [clang, gcc] - extra: [none] - include: - - features: tiny - compiler: clang - extra: nogui - - features: tiny - compiler: gcc - extra: nogui - - features: normal - shadow: ./src/shadow - - features: huge - coverage: true - - features: huge - compiler: gcc - coverage: true - extra: testgui - - features: huge - compiler: clang - extra: asan - - features: huge - compiler: gcc - coverage: true - extra: unittests - - features: normal - compiler: gcc - extra: vimtags - - steps: - - uses: actions/checkout@v2 - - - name: Install packages - env: - DEBIAN_FRONTEND: noninteractive - run: | - sudo apt-get install -y \ - autoconf \ - lcov \ - gettext \ - libcanberra-dev \ - libperl-dev \ - python-dev \ - python3-dev \ - liblua5.3-dev \ - lua5.3 \ - ruby-dev \ - tcl-dev \ - cscope \ - libgtk2.0-dev \ - desktop-file-utils \ - libtool-bin - if [[ ${CC} = clang ]]; then - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo add-apt-repository -y "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" - sudo apt-get install -y clang-11 - sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-11 100 - sudo update-alternatives --set clang /usr/bin/clang-11 - sudo update-alternatives --install /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-11 100 - fi - - - name: Set up environment - run: | - mkdir -p "${LOG_DIR}" - mkdir -p "${HOME}/bin" - echo "${HOME}/bin" >> $GITHUB_PATH - ( - echo "LINUX_VERSION=$(uname -r)" - echo "NPROC=$(getconf _NPROCESSORS_ONLN)" - echo "SND_DUMMY_DIR=${HOME}/snd-dummy" - echo "TMPDIR=${{ runner.temp }}" - - case "${{ matrix.features }}" in - tiny|small) - echo "TEST=testtiny" - if ${{ contains(matrix.extra, 'nogui') }}; then - echo "CONFOPT=--disable-gui" - fi - ;; - normal) - ;; - huge) - echo "TEST=scripttests test_libvterm" - echo "CONFOPT=--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp" - ;; - esac - - if ${{ matrix.coverage == true }}; then - echo "CFLAGS=--coverage -DUSE_GCOV_FLUSH" - echo "LDFLAGS=--coverage" - fi - if ${{ contains(matrix.extra, 'testgui') }}; then - echo "TEST=-C src testgui" - fi - if ${{ contains(matrix.extra, 'unittests') }}; then - echo "TEST=unittests" - fi - if ${{ contains(matrix.extra, 'asan') }}; then - echo "SANITIZER_CFLAGS=-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize-recover=all -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer" - echo "ASAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/asan" - echo "UBSAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/ubsan" - echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/src/testdir/lsan-suppress.txt" - fi - if ${{ contains(matrix.extra, 'vimtags') }}; then - echo "TEST=-C runtime/doc vimtags VIMEXE=../../${SRCDIR}/vim" - fi - ) >> $GITHUB_ENV - - - name: Set up system - run: | - if [[ ${CC} = clang ]]; then - # Use llvm-cov instead of gcov when compiler is clang. - ln -fs /usr/bin/llvm-cov ${HOME}/bin/gcov - fi - # Setup lua5.3 manually since its package doesn't provide alternative. - # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212 - if [[ ${CONFOPT} =~ luainterp ]]; then - sudo update-alternatives --install /usr/bin/lua lua /usr/bin/lua5.3 10 - fi - sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 - sudo usermod -a -G audio "${USER}" - sudo bash ci/setup-xvfb.sh - - - name: Cache snd-dummy - uses: actions/cache@v2 - with: - path: ${{ env.SND_DUMMY_DIR }} - key: linux-${{ env.LINUX_VERSION }}-snd-dummy - - - name: Set up snd-dummy - run: | - if [[ ! -e ${SND_DUMMY_DIR}/snd-dummy.ko ]]; then - bash ci/build-snd-dummy.sh - fi - cd "${SND_DUMMY_DIR}" - sudo insmod soundcore.ko - sudo insmod snd.ko - sudo insmod snd-pcm.ko - sudo insmod snd-dummy.ko - - - name: Check autoconf - if: contains(matrix.extra, 'unittests') - run: | - make -C src autoconf - - - name: Set up shadow dir - if: matrix.shadow - run: | - make -C src shadow - echo "SRCDIR=${{ matrix.shadow }}" >> $GITHUB_ENV - echo "SHADOWOPT=-C ${{ matrix.shadow }}" >> $GITHUB_ENV - - - name: Configure - run: | - ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing - # Append various warning flags to CFLAGS. - # BSD sed needs backup extension specified. - sed -i.bak -f ci/config.mk.sed ${SRCDIR}/auto/config.mk - sed -i.bak -f ci/config.mk.${CC}.sed ${SRCDIR}/auto/config.mk - - - name: Build - if: (!contains(matrix.extra, 'unittests')) - run: | - make ${SHADOWOPT} -j${NPROC} - - - name: Check version - if: (!contains(matrix.extra, 'unittests')) - run: | - "${SRCDIR}"/vim --version - "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit - "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit - - - name: Test - timeout-minutes: 20 - run: | - do_test() { sg audio "sg $(id -gn) '$*'"; } - do_test make ${SHADOWOPT} ${TEST} - - - name: Coveralls - if: matrix.coverage && success() && github.event_name != 'pull_request' - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - TRAVIS_JOB_ID: ${{ github.run_id }} - run: | - sudo apt-get install -y python3-setuptools python3-wheel - # needed for https support for coveralls building cffi only works with gcc, not with clang - CC=gcc pip3 install --user cpp-coveralls pyopenssl ndg-httpsclient pyasn1 - ~/.local/bin/coveralls -b "${SRCDIR}" -x .xs -e "${SRCDIR}"/if_perl.c -e "${SRCDIR}"/xxd -e "${SRCDIR}"/libvterm --encodings utf-8 - - - name: Codecov - if: matrix.coverage && success() - uses: codecov/codecov-action@v1 - with: - flags: ${{ matrix.features }}-${{ matrix.compiler }}-${{ matrix.extra }} - fail_ci_if_error: true - working-directory: ${{ env.SRCDIR }} - - - name: ASan logs - if: contains(matrix.extra, 'asan') && !cancelled() - run: | - for f in $(grep -lR '#[[:digit:]]* *0x[[:digit:]a-fA-F]*' "${LOG_DIR}"); do - asan_symbolize-11 -l "$f" - false # in order to fail a job - done - - coveralls: - runs-on: ubuntu-latest - - needs: linux - if: always() && github.event_name != 'pull_request' - - steps: - - name: Parallel finished - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - run: | - curl -k "https://coveralls.io/webhook?repo_token=${COVERALLS_REPO_TOKEN}" -d "payload[build_num]=${GITHUB_RUN_ID}&payload[status]=done" - - macos: - runs-on: macos-latest - - env: - CC: ${{ matrix.compiler }} - TEST: test - SRCDIR: ./src - LEAK_CFLAGS: -DEXITFREE - TERM: xterm - - strategy: - fail-fast: false - matrix: - features: [tiny, huge] - compiler: [clang, gcc] - - steps: - - uses: actions/checkout@v2 - - - name: Install packages - env: - HOMEBREW_NO_AUTO_UPDATE: 1 - run: | - brew install lua - echo "LUA_PREFIX=/usr/local" >> $GITHUB_ENV - - - name: Set up environment - run: | - ( - echo "NPROC=$(getconf _NPROCESSORS_ONLN)" - case "${{ matrix.features }}" in - tiny) - echo "TEST=testtiny" - echo "CONFOPT=--disable-gui" - ;; - huge) - echo "CONFOPT=--enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp" - ;; - esac - ) >> $GITHUB_ENV - - - name: Configure - run: | - ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing - # Append various warning flags to CFLAGS. - # BSD sed needs backup extension specified. - sed -i.bak -f ci/config.mk.sed ${SRCDIR}/auto/config.mk - # On macOS, the entity of gcc is clang. - sed -i.bak -f ci/config.mk.clang.sed ${SRCDIR}/auto/config.mk - - - name: Build - run: | - make -j${NPROC} - - - name: Check version - run: | - "${SRCDIR}"/vim --version - "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit - "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit - - - name: Test - timeout-minutes: 20 - run: | - make ${TEST} - - windows: - runs-on: windows-latest - - env: - VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat - # Interfaces - # Lua - LUA_VER: 54 - LUA_VER_DOT: '5.4' - LUA_RELEASE: 5.4.0 - LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip - LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip - LUA_DIR: D:\Lua - # Python 2 - PYTHON_VER: 27 - PYTHON_VER_DOT: '2.7' - # Python 3 - PYTHON3_VER: 38 - PYTHON3_VER_DOT: '3.8' - # Other dependencies - # winpty - WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip - # Escape sequences - COL_RED: "\x1b[31m" - COL_GREEN: "\x1b[32m" - COL_YELLOW: "\x1b[33m" - COL_RESET: "\x1b[m" - - strategy: - fail-fast: false - matrix: - toolchain: [msvc, mingw] - arch: [x64, x86] - features: [HUGE, NORMAL] - include: - - arch: x64 - vcarch: amd64 - warch: x64 - bits: 64 - msystem: MINGW64 - cygreg: registry - pyreg: "" - - arch: x86 - vcarch: x86 - warch: ia32 - bits: 32 - msystem: MINGW32 - cygreg: registry32 - pyreg: "-32" - exclude: - - toolchain: msvc - arch: x64 - features: NORMAL - - toolchain: mingw - arch: x86 - features: NORMAL - - steps: - - name: Initalize - id: init - shell: bash - run: | - git config --global core.autocrlf input - python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@") - python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@") - echo "PYTHON_DIR=$python_dir" >> $GITHUB_ENV - echo "PYTHON3_DIR=$python3_dir" >> $GITHUB_ENV - - - uses: msys2/setup-msys2@v2 - if: matrix.toolchain == 'mingw' - with: - msystem: ${{ matrix.msystem }} - release: false - - - uses: actions/checkout@v2 - - - name: Create a list of download URLs - shell: cmd - run: | - type NUL > urls.txt - echo %LUA_RELEASE%>> urls.txt - echo %WINPTY_URL%>> urls.txt - - - name: Cache downloaded files - uses: actions/cache@v2 - with: - path: downloads - key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }} - - - name: Download dependencies - shell: cmd - run: | - path C:\Program Files\7-Zip;%path% - if not exist downloads mkdir downloads - - echo %COL_GREEN%Download Lua%COL_RESET% - call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip - 7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1 - - echo %COL_GREEN%Download winpty%COL_RESET% - call :downloadfile %WINPTY_URL% downloads\winpty.zip - 7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1 - copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll src\winpty${{ matrix.bits }}.dll - copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe src\ - - goto :eof - - :downloadfile - :: call :downloadfile - if not exist %2 ( - curl -f -L %1 -o %2 - ) - if ERRORLEVEL 1 ( - rem Retry once. - curl -f -L %1 -o %2 || exit 1 - ) - goto :eof - - - name: Copy src directory to src2 - shell: cmd - run: | - xcopy src src2\ /E > nul - - - name: Build (MSVC) - if: matrix.toolchain == 'msvc' - shell: cmd - run: | - call "%VCVARSALL%" ${{ matrix.vcarch }} - cd src - :: Filter out the progress bar from the build log - sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak - if "${{ matrix.features }}"=="HUGE" ( - nmake -nologo -f Make_mvc2.mak ^ - FEATURES=${{ matrix.features }} ^ - GUI=yes IME=yes ICONV=yes VIMDLL=yes ^ - DYNAMIC_LUA=yes LUA=%LUA_DIR% ^ - DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^ - DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR% - ) else ( - nmake -nologo -f Make_mvc2.mak ^ - FEATURES=${{ matrix.features }} ^ - GUI=yes IME=yes ICONV=yes VIMDLL=yes - ) - if not exist vim${{ matrix.bits }}.dll ( - echo %COL_RED%Build failure.%COL_RESET% - exit 1 - ) - - - name: Build (MinGW) - if: matrix.toolchain == 'mingw' - shell: msys2 {0} - run: | - cd src - if [ "${{ matrix.features }}" = "HUGE" ]; then - mingw32-make -f Make_ming.mak -j2 \ - FEATURES=${{ matrix.features }} \ - GUI=yes IME=yes ICONV=yes VIMDLL=yes \ - DYNAMIC_LUA=yes LUA=${LUA_DIR} \ - DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \ - DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \ - STATIC_STDCPLUS=yes - else - mingw32-make -f Make_ming.mak -j2 \ - FEATURES=${{ matrix.features }} \ - GUI=yes IME=yes ICONV=yes VIMDLL=yes \ - STATIC_STDCPLUS=yes - fi - - #- name: Prepare Artifact - # shell: cmd - # run: | - # mkdir artifacts - # copy src\*vim.exe artifacts - # copy src\vim*.dll artifacts - # - #- name: Upload Artifact - # uses: actions/upload-artifact@v1 - # with: - # name: vim${{ matrix.bits }}-${{ matrix.toolchain }} - # path: ./artifacts - - - name: Test - shell: cmd - timeout-minutes: 20 - run: | - PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR% - call "%VCVARSALL%" ${{ matrix.vcarch }} - cd src - echo. - echo %COL_GREEN%vim version:%COL_RESET% - .\vim --version || exit 1 - - echo %COL_GREEN%Start testing vim in background.%COL_RESET% - start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt" - - echo %COL_GREEN%Test gvim:%COL_RESET% - cd testdir - nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1 - cd .. - - echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET% - cd ..\src2\testdir - :: Wait about 10 minutes. - for /L %%i in (1,1,60) do ( - if exist done.txt goto exitloop - timeout 10 > NUL 2>&1 - if ERRORLEVEL 1 ping -n 11 localhost > NUL - ) - set timeout=1 - :exitloop - - echo %COL_GREEN%Test results of vim:%COL_RESET% - if exist messages type messages - nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1 - if "%timeout%"=="1" ( - echo %COL_RED%Timed out.%COL_RESET% - exit 1 - ) diff --git a/src/Makefile b/src/Makefile index 658f8b2e96..108474e8ce 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1400,7 +1400,7 @@ MACVIMGUI_OBJ = objects/gui.o objects/gui_beval.o \ MACVIMGUI_DEFS = -DFEAT_GUI_MACVIM -Wall -Wno-unknown-pragmas -pipe MACVIMGUI_IPATH = MACVIMGUI_LIBS_DIR = -MACVIMGUI_LIBS1 = -framework Cocoa -framework Carbon +MACVIMGUI_LIBS1 = MACVIMGUI_LIBS2 = MACVIMGUI_INSTALL = install_normal MACVIMGUI_TARGETS =