name: Build Audacity on: push: # Remove the "#" from the next 2 lines if you need to disable this action #branches: # - disable jobs: build: # ========================================================================= # Run asynchronous builds # ========================================================================= strategy: fail-fast: false matrix: os: [windows-2019, ubuntu-16.04, ubuntu-18.04, macos-latest] #os: [macos-latest] runs-on: ${{ matrix.os }} env: USE_AUDACITY_WX: true steps: # ========================================================================= # SHARED: Checkout source # ========================================================================= - name: Checkout uses: actions/checkout@v2 with: ref: master # ========================================================================= # SHARED: Retrieve the commit hash and generate revision header # ========================================================================= - name: Generate Header shell: bash run: | set -x # Generate the revision header git show -s --format="#define REV_LONG \"%H\"%n#define REV_TIME \"%cd\"%n" >src/RevisionIdent.h # Export the long and short hashs to further steps echo "::set-env name=LONGHASH::$(git show -s --format='%H')" echo "::set-env name=SHORTHASH::$(git show -s --format='%h')" # ========================================================================= # SHARED: Retrieve the wxWidgets source and export the commit hash # ========================================================================= - name: wxWidgets Hash shell: bash run: | set -x # Get latest wxWidgets source git clone --depth 1 -n https://github.com/audacity/wxWidgets cd wxWidgets # Export the commit hash to further steps echo "::set-env name=WXHASH::$(git show -s --format='%H')" # ========================================================================= # SHARED: Create and/or retrieve wxWidgets cached build # ========================================================================= - name: Cache wxWidgets uses: actions/cache@v1 with: # Increment the number at the end to force recreation of the cache key: wxWidgets_${{ matrix.os }}_${{ env.WXHASH }}.8 path: wxroot # ========================================================================= # WINDOWS: Setup Nuget (for all versions of Windows) # ========================================================================= - name: Setup Nuget uses: nuget/setup-nuget@v1 if: startswith( matrix.os, 'windows' ) # ========================================================================= # WINDOWS: Build (for all versions of Windows) # ========================================================================= - name: Build Windows if: startswith( matrix.os, 'windows' ) shell: cmd run: | :: Set up Visual Studio environment CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat" ECHO ON :: Setup environment choco install zip :: Identify wxWidgets installation directory SET WXWIN=%GITHUB_WORKSPACE%\wxroot :: Build wxWidgets if needed IF NOT EXIST %WXWIN% ( MKDIR %WXWIN% CD wxWidgets git checkout git submodule update --init :: Build it CD build\msw nmake -f makefile.vc BUILD=release SHARED=1 IF NOT %ERRORLEVEL% == 0 EXIT %ERRORLEVEL% CD ..\.. :: "Install" wxWidgets XCOPY include %WXWIN%\include /E /I /Q /Y XCOPY lib %WXWIN%\lib /E /I /Q /Y XCOPY locale %WXWIN%\locale /E /I /Q /Y XCOPY src %WXWIN%\src /E /I /Q /Y CD .. ) :: Build Audacity CD win :: Restore packages (for gettext) nuget restore audacity.sln :: Build solution msbuild audacity.sln /m /p:Configuration=Release /p:Platform=Win32 IF NOT %ERRORLEVEL% == 0 EXIT %ERRORLEVEL% :: "Install" Audacity MKDIR "%LONGHASH%" XCOPY Release "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_net_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_vc_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_xml_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_adv_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_core_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_html_*.dll "%LONGHASH%" /E /I /Q /Y XCOPY %WXWIN%\lib\vc_dll\*u_qa_*.dll "%LONGHASH%" /E /I /Q /Y CD "%LONGHASH%" DEL /Q /S *.iobj *.exp *.ilk *.lib *.ipdb *.pdb include #CD .. :: Create artifact zip -r9 "..\..\%LONGHASH%.zip" * # ========================================================================= # UBUNTU: Build (for all versions of Ubuntu) # ========================================================================= - name: Build Ubuntu if: startswith( matrix.os, 'ubuntu' ) shell: bash run: | set -x # Setup environment sudo apt-get install -y libgtk2.0-dev libasound2-dev autoconf automake zip # Identify wxWidgets installation directory WXROOT="${GITHUB_WORKSPACE}/wxroot" # Build wxWidgets if needed if [ ! -e "${WXROOT}" ] then mkdir "${WXROOT}" cd wxWidgets git checkout git submodule update --init ./configure --with-gtk make -j $(nproc) install DESTDIR="${WXROOT}" cd .. fi # "Install" wxWidgets sudo cp -a "${WXROOT}"/* / # Configure Audacity mkdir bld cd bld ../configure --with-lib-preference='local system' # Build lib-src first # # This allows using multiple make jobs (-j). If not done this way # the build may fail (bug in our make process) cd lib-src make -j $(nproc) cd .. # And then the rest make -j $(nproc) # Identify installation directory DESTDIR="$(pwd)/linux" mkdir -p "${DESTDIR}" # Create wrapper script # # (This is only needed if using our wxWidgets libs) cat >"${DESTDIR}/audacity" <<"EOF" #!/bin/sh export LD_LIBRARY_PATH="${0%/*}:${LD_LIBRARY_PATH}" "${0%/*}/audacity.bin" EOF chmod +x "${DESTDIR}/audacity" # Copy over dist files cp -a audacity "${DESTDIR}/audacity.bin" cp -aL nyquist plug-ins "${DESTDIR}" mkdir "${DESTDIR}/help" "${DESTDIR}/locale/" cp -aL $(find locale/ -type d) "${DESTDIR}/locale/" # Copy wxWidgets libraries cp -a "${WXROOT}"/usr/local/lib/*.so* "${DESTDIR}" # Create artifact (zipped as Github actions don't preserve permissions) cd "${DESTDIR}" zip -r9 "${GITHUB_WORKSPACE}/${LONGHASH}.zip" * # ========================================================================= # MACOS: Build (for all versions of MacOS) # ========================================================================= - name: Build Mac if: startswith( matrix.os, 'macos' ) shell: bash run: | set -x # The minimum OS X version supported by Audacity is 10.7. minver=10.7 # Make the "msgfmt" command available brew install gettext brew link --force gettext # Make sure MacOS supplied commands are used export PATH="/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin" # Identify wxWidgets installation directory WXROOT="${GITHUB_WORKSPACE}/wxroot" # Build wxWidgets if needed if [ ! -e "${WXROOT}" ] then mkdir "${WXROOT}" cd wxWidgets git checkout git submodule update --init # Make sure our flags are included export CXX="g++ -std=c++1z -stdlib=libc++" export LD="g++ -std=c++1z -stdlib=libc++" # Build x86_64, release, shared configuration ./configure --prefix=/usr/local/x86_64 \ --enable-debug=no \ --enable-macosx-arch="x86_64" \ --enable-shared=yes \ --enable-unicode=yes \ --enable-universal_binary=no \ --enable-webkit=no \ --enable-webviewwebkit=no \ --with-expat=builtin \ --with-flavour="release" \ --with-libjpeg=builtin \ --with-libpng=builtin \ --with-libtiff=builtin \ --with-macosx-version-min="${minver}" \ --with-regex=builtin \ --with-zlib=builtin \ --without-liblzma ${run} make -j $(sysctl -n hw.ncpu) install DESTDIR="${WXROOT}" unset CXX LD cd .. fi # "Install" wxWidgets sudo cp -a "${WXROOT}/usr/local" /usr/ # Build Audacity cd mac # Temporary workaround until they can be incorporated into # the Xcode project itself sed -i '' -e "s/TARGET=10.9/TARGET=${minver}/g" \ -e "s/macosx10.9/macosx/g" Audacity.xcodeproj/project.pbxproj xcodebuild -configuration Release64 install cd .. # "Install" Audacity mkdir -p macos cp -a /tmp/Audacity.dst/Audacity.app macos # Create artifact (zipped as Github actions don't preserve permissions) cd "/tmp/Audacity.dst" zip -r9 "${GITHUB_WORKSPACE}/${LONGHASH}.zip" * # ========================================================================= # SHARED: Attach the artifact to the workflow results # ========================================================================= - name: Upload artifact uses: actions/upload-artifact@v1 with: name: ${{ matrix.os }}_${{ env.SHORTHASH }} path: ${{ env.LONGHASH }}.zip