name: Nightly Builds on: workflow_dispatch: schedule: # Daily at 3:14 - cron: '14 3 * * *' jobs: debian-packages: strategy: matrix: os: [ubuntu-20.04, ubuntu-22.04] runs-on: ${{ matrix.os }} steps: - name: Git Clone uses: actions/checkout@v4.1.6 with: submodules: true - name: Update Repositories run: sudo apt-get update - name: Install Build Dependencies run: > sudo apt-get install -y devscripts build-essential lintian debhelper dh-exec autoconf automake libtool libglib2.0-dev libncurses-dev libgtk-3-dev xvfb groff-base # NOTE: We need to configure the build directory only to generate distribute.mk. - name: Configure Build run: | autoreconf -i ./configure # NOTE: The debian package build rules already use xvfb-run to emulate an XServer # when necessary since the PPA build servers might also be headless. # NOTE: Packages are left in debian-temp/. - name: Build Debian/Ubuntu Packages run: | ./distribute.mk debian-binary cp debian-temp/sciteco-curses_*.deb sciteco-curses_nightly_${{matrix.os}}_amd64.deb cp debian-temp/sciteco-gtk_*.deb sciteco-gtk_nightly_${{matrix.os}}_amd64.deb cp debian-temp/sciteco-common_*.deb sciteco-common_nightly_${{matrix.os}}_all.deb - name: Build AppImages # Should always be on the oldest supported Ubuntu if: matrix.os == 'ubuntu-20.04' env: GH_TOKEN: ${{ github.token }} run: | cd AppImage gh release download -R AppImageCommunity/pkg2appimage -O pkg2appimage.AppImage \ -p 'pkg2appimage-*-x86_64.AppImage' continuous chmod +x pkg2appimage.AppImage ./pkg2appimage.AppImage curses.yml mv out/*.AppImage ../sciteco-curses_nightly_x86_64.AppImage ./pkg2appimage.AppImage gtk.yml mv out/*.AppImage ../sciteco-gtk_nightly_x86_64.AppImage chmod a+x *.AppImage - name: Archive Debian/Ubuntu Packages and AppImages uses: pyTooling/Actions/releaser@v1.0.5 with: token: ${{ secrets.GITHUB_TOKEN }} tag: nightly files: ./*.deb ./*.AppImage macos: runs-on: macos-13 steps: - name: Git Clone uses: actions/checkout@v4.1.6 with: submodules: true # NOTE: macOS already ships with ncurses and groff. # The system libncurses has turned out to be buggy, though (keypad() does not work). # However, it does work on real Mac OS systems, I was told. # Linking in our own ncurses should also be more portable in case # the system libncurses ABI breaks. # However, Homebrew installs ncurses as a keg and it will refer to a # non-standard $TERMINFO. This could be worked around. # The macOS Groff version appears to be outdated. - name: Install Build Dependencies run: brew install autoconf automake libtool glib groff dylibbundler # Required by pyTooling/Actions/releaser - name: Set up Python uses: actions/setup-python@v4.3.0 with: python-version: '3.10' # FIXME: It would be nice to build universal arm64/x86_64 binaries, # this apparently requires two separate build runs and a following merge # using `lipo -create`. In this case we could just as well build two # separate packages. - name: Configure Build env: # Make sure we don't pick up GCC by accident. CC: clang CXX: clang++ # FIXME: Once there is an --enable-lto, we should use that. CFLAGS: -O3 -flto CXXFLAGS: -O3 -flto LDFLAGS: -flto # Uncomment if you want to build against the Homebrew-installed libncurses. #PKG_CONFIG_PATH: /usr/local/opt/ncurses/lib/pkgconfig # NOTE: This will not result in a fully statically-linked binary, # but the more we get rid off, the better. # NOTE: Making the binary relocatable means it can be installed into non-root directories # with `installer -pkg -target`. run: | autoreconf -i ./configure --with-interface=ncurses --enable-static-executables --enable-html-manual \ --with-scitecodatadir=../share/sciteco - name: make run: make -j 2 # NOTE: The test suite must be run in verbose mode because if it fails # we won't be able to analyze testsuite.log. - name: Run Test Suite run: make check TESTSUITEFLAGS="--verbose" - name: Package run: | make install-strip DESTDIR=`pwd`/temp-install # There are libraries we cannot link against statically. # We ship them in /usr/local/lib/sciteco so as not to cause collisions with system # libraries or libraries installed via Homebrew. # System libraries are considered to have stable ABIs and # are not currently bundled. # FIXME: Is this really true for libc++? dylibbundler -b -x temp-install/usr/local/bin/sciteco \ -cd -d temp-install/usr/local/lib/sciteco -p @executable_path/../lib/sciteco # FIXME: Should we encode the Git commit into the package version? # Unfortunately, I cannot find detailed information on how Mac OS # interpretes these version strings. VERSION=`sed -nE 's/#define PACKAGE_VERSION "(.*)"/\1/p' config.h` pkgbuild --identifier net.sf.sciteco.pkg --version $VERSION \ --root temp-install --install-location / \ sciteco-curses_nightly_macos_x86_64.pkg - name: Archive Mac OS Distribution (ncurses) uses: pyTooling/Actions/releaser/composite@v1.0.5 with: token: ${{ secrets.GITHUB_TOKEN }} tag: nightly files: ./*.pkg # The website is published on Mac OS only because we cannot tweak the # ./configure flags on Ubuntu where Debian packages are built. # FIXME: This could be done without a gh-pages branch, see # https://github.com/actions/starter-workflows/blob/main/pages/static.yml # This however should be in its own workflow and we'd have to rebuild # SciTECO and everything. # FIXME: Also build cheat-sheet.pdf automatically? - run: make install - name: Install lowdown (Markdown processor) run: brew install lowdown - name: Generate website run: cd www && sciteco -m build.tes - name: Publish Website run: | cd www touch .nojekyll git init cp ../.git/config ./.git/config git add .nojekyll *.html git config --local user.email "Website@GitHubActions" git config --local user.name "GitHub Actions" git commit -a -m "update ${{ github.sha }}" git push -u origin +HEAD:gh-pages win64-curses: runs-on: windows-2019 defaults: run: shell: bash.exe --login -eo pipefail "{0}" env: MSYSTEM: MINGW64 CHERE_INVOKING: 1 steps: - name: Git Clone uses: actions/checkout@v4.1.6 with: submodules: true - name: Set Up Shell run: echo C:\msys64\usr\bin\ | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append shell: pwsh - name: Install Build Dependencies run: > pacman -S --noconfirm --needed base-devel mingw-w64-x86_64-autotools mingw-w64-x86_64-toolchain mingw-w64-x86_64-glib2 mingw-w64-x86_64-pdcurses groff - name: Configure Build env: PDCURSES_CFLAGS: -I/mingw64/include/pdcurses/ # FIXME: glib on MinGW supports static linking but the gspawn # helper binaries are still linked dynamically, forcing us to ship # all DLLs anyway. Therefore it makes little sense to link SciTECO # itself statically - it only wastes a few MB. # You will also have to add --enable-static-executables. # The additional Windows libraries are for PDCursesMod/WinGUI: # LIBGLIB_LIBS: -lglib-2.0 -lintl -liconv -lpcre -lole32 -lws2_32 -luuid # FIXME: Once there is an --enable-lto, we should use that. # CFLAGS: -O3 -flto -DGLIB_STATIC_COMPILATION CFLAGS: -O3 -flto CXXFLAGS: -O3 -flto LDFLAGS: -flto run: | autoreconf -i mkdir build-wingui build-wincon (cd build-wingui ../configure --with-interface=pdcurses-gui --enable-html-manual --program-prefix=g \ --with-scitecodatadir=. \ PDCURSES_LIBS="-lpdcurses_wingui -lgdi32 -lcomdlg32 -lwinmm") (cd build-wincon ../configure --with-interface=pdcurses --enable-html-manual \ --with-scitecodatadir=. \ PDCURSES_LIBS="-lpdcurses_wincon -lgdi32 -lwinmm") - name: make run: | make -C build-wingui -j 2 make -C build-wincon -j 2 - name: make install run: | make -C build-wingui install-strip make -C build-wincon install-strip # NOTE: The test suite must be run in verbose mode because if it fails # we won't be able to analyze testsuite.log. - name: Run Test Suite run: | make -C build-wingui check TESTSUITEFLAGS="--verbose" make -C build-wincon check TESTSUITEFLAGS="--verbose" - name: Prepare Distribution Directory env: MINGW_BUNDLEDLLS_SEARCH_PATH: /mingw64/bin run: | mkdir temp-bin/ cd temp-bin/ cp -r /mingw64/bin/{gsciteco.exe,sciteco.exe,grosciteco.tes,tedoc.tes} ./ # datadir is relative to bindir cp -r /mingw64/bin/{lib,*.tmac} ./ cp /mingw64/bin/sample.teco_ini .teco_ini cp -r /mingw64/share/doc/sciteco/* ./ cp ../COPYING ../ChangeLog ./ cp /mingw64/bin/gspawn-win64-helper*.exe ./ # Collect DLLs for all included binaries for f in *.exe; do ../contrib/mingw-bundledlls --copy $f; done zip -9 -r ../sciteco-pdcurses_nightly_win64.zip . - name: Archive Windows Distribution (PDCurses) uses: pyTooling/Actions/releaser/composite@v1.0.5 with: token: ${{ secrets.GITHUB_TOKEN }} tag: nightly files: ./*.zip # NOTE: There is a lot of redundancy with win32-curses. # However the Curses version may be linked statically, while Gtk+3 cannot be # linked statically on Windows (at least MSYS does not provide # static libraries) and would draw in libglib, libintl, libiconv etc. anyway. win64-gtk: runs-on: windows-2019 defaults: run: shell: bash.exe --login -eo pipefail "{0}" env: MSYSTEM: MINGW64 CHERE_INVOKING: 1 steps: - name: Git Clone uses: actions/checkout@v4.1.6 with: submodules: true - name: Set Up Shell run: echo C:\msys64\usr\bin\ | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append shell: pwsh - name: Install Build Dependencies run: > pacman -S --noconfirm --needed base-devel mingw-w64-x86_64-autotools mingw-w64-x86_64-toolchain mingw-w64-x86_64-glib2 mingw-w64-x86_64-gtk3 mingw-w64-x86_64-librsvg groff - name: Configure Build env: # FIXME: Once there is an --enable-lto, we should use that. CFLAGS: -O3 -flto CXXFLAGS: -O3 -flto LDFLAGS: -flto run: | autoreconf -i ./configure --with-interface=gtk --enable-html-manual \ --with-scitecodatadir=. - name: make run: make -j 2 - run: make install-strip # NOTE: The test suite must be run in verbose mode because if it fails # we won't be able to analyze testsuite.log. - name: Run Test Suite run: make check TESTSUITEFLAGS="--verbose" - name: Prepare Distribution Directory env: MINGW_BUNDLEDLLS_SEARCH_PATH: /mingw64/bin run: | mkdir temp-bin cd temp-bin cp /mingw64/bin/{sciteco.exe,grosciteco.tes,tedoc.tes} ./ # datadir is relative to bindir cp -r /mingw64/bin/{lib,*.tmac} ./ # FIXME: Maybe there should be a separate win32/.teco_ini with # a few pre-enabled settings? cp /mingw64/bin/sample.teco_ini .teco_ini cp /mingw64/bin/fallback.css .teco_css cp -r /mingw64/share/doc/sciteco/* ./ cp ../COPYING ../ChangeLog ./ cp /mingw64/bin/gspawn-win64-helper*.exe ./ # Collect DLLs for all included binaries for f in *.exe; do ../contrib/mingw-bundledlls --copy $f; done #mkdir share #cp /mingw64/share/loader.cache share/ #glib-compile-schemas /mingw64/share/glib-2.0/schemas #mkdir -p share/glib-2.0 #cp /mingw64/share/glib-2.0/gschemas.compiled share/glib-2.0/ mkdir -p share/icons/Adwaita # FIXME: It should be sufficient to package the SVG icons, # but I cannot get it to work. Perhaps index.theme would have to be tweaked. # We could also try to include a pure scalable icon theme. #cp -r /mingw64/share/icons/Adwaita/{scalable*,index.theme} share/icons/Adwaita/ cp -r /mingw64/share/icons/Adwaita/* share/icons/Adwaita/ gtk-update-icon-cache-3.0 share/icons/Adwaita/ # FIXME: It's possible to change the location of loaders.cache via $GDK_PIXBUF_MODULE_FILE. # If we did that, we could avoid "reusing" the lib/ directory. # This is important when somebody changes $SCITECOPATH. cp /mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders/{pixbufloader_svg.dll,libpixbufloader-png.dll} . # Collect DLLs for all pixbuf loaders into the root directory for f in *pixbufloader*.dll; do ../contrib/mingw-bundledlls --copy $f; done mkdir -p lib/gdk-pixbuf-2.0/2.10.0/loaders/ mv *pixbufloader*.dll lib/gdk-pixbuf-2.0/2.10.0/loaders/ cp ../win32/loaders.cache lib/gdk-pixbuf-2.0/2.10.0/ zip -9 -r ../sciteco-gtk3_nightly_win64.zip . - name: Archive Windows Distribution (GTK+ 3) uses: pyTooling/Actions/releaser/composite@v1.0.5 with: token: ${{ secrets.GITHUB_TOKEN }} tag: nightly files: ./*.zip