diff --git a/.github/changelog.sh b/.github/changelog.sh new file mode 100755 index 0000000000..ea0da948c1 --- /dev/null +++ b/.github/changelog.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +tag=$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\^0$@@') + +# If we are a tag, show the part of the changelog till (but excluding) the last stable +if [ -n "$tag" ]; then + grep='^[0-9]\+\.[0-9]\+\.[0-9]\+[^-]' + next=$(cat changelog.txt | grep '^[0-9]' | awk 'BEGIN { show="false" } // { if (show=="true") print $0; if ($1=="'$tag'") show="true"} ' | grep "$grep" | head -n1 | sed 's/ .*//') + cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }' + exit 0 +fi + +# In all other cases, show the git log of the last 7 days +revdate=$(git log -1 --pretty=format:"%ci") +last_week=$(date -d "$revdate -7days" +"%Y-%m-%d %H:%M") +git log --after="${last_week}" --pretty=fuller diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..965fe1bf61 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,592 @@ +name: Release + +on: + workflow_dispatch: + inputs: + ref: + description: 'Ref to build (for Pull Requests, use refs/pull/NNN/head)' + required: true + repository_dispatch: + # client_payload should be the same as the inputs for workflow_dispatch. + types: + - Build* + release: + types: + - published + +jobs: + source: + name: Source + + runs-on: ubuntu-20.04 + + outputs: + version: ${{ steps.metadata.outputs.version }} + is_tag: ${{ steps.metadata.outputs.is_tag }} + trigger_type: ${{ steps.metadata.outputs.trigger_type }} + folder: ${{ steps.metadata.outputs.folder }} + + steps: + - name: Checkout (Release) + if: github.event_name == 'release' + uses: actions/checkout@v2 + with: + # We generate a changelog; for this we need the full git log. + fetch-depth: 0 + + - name: Checkout (Manual) + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v2 + with: + ref: ${{ github.event.inputs.ref }} + # We generate a changelog; for this we need the full git log. + fetch-depth: 0 + + - name: Checkout (Trigger) + if: github.event_name == 'repository_dispatch' + uses: actions/checkout@v2 + with: + ref: ${{ github.event.client_payload.ref }} + # We generate a changelog; for this we need the full git log. + fetch-depth: 0 + + - name: Check valid branch name + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + REF="${{ github.event.inputs.ref }}" + elif [ "${{ github.event_name }}" = "repository_dispatch" ]; then + REF="${{ github.event.client_payload.ref }}" + else + REF="${{ github.ref }}" + fi + + # Check if we are a tag. + if [ -n "$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || false)" ]; then + exit 0 + fi + + # Check if the checkout caused the branch to be named. + if [ "$(git rev-parse --abbrev-ref HEAD)" != "HEAD" ]; then + exit 0 + fi + + # Check if this was a pull request. + if [ -n "$(echo ${REF} | grep '^refs/pull/[0-9]*')" ]; then + PULL=$(echo ${REF} | cut -d/ -f3) + git checkout -b pr${PULL} + fi + + # Are we still in a detached state? Error out. + if [ "$(git rev-parse --abbrev-ref HEAD)" == "HEAD" ]; then + echo "The 'ref' given resulted in a checkout of a detached HEAD." + echo "We cannot detect the version for these checkout accurate." + echo "" + echo "If you want to build a Pull Request, make sure you use 'refs/pull/NNN/head'." + echo "" + echo "Cancelling build, as without a version we cannot store the artifacts." + exit 1 + fi + + - name: Generate metadata + id: metadata + run: | + echo "::group::Prepare metadata files" + cmake -DGENERATE_OTTDREV=1 -P cmake/scripts/FindVersion.cmake + ./.github/changelog.sh > .changelog + TZ='UTC' date +"%Y-%m-%d %H:%M UTC" > .release_date + cat .ottdrev | cut -f 1 -d$'\t' > .version + + if [ $(cat .ottdrev | cut -f 6 -d$'\t') = '1' ]; then + # Assume that all tags are always releases. Why else make a tag? + IS_TAG="true" + + FOLDER="${{ env.FOLDER_RELEASES }}" + TRIGGER_TYPE="new-tag" + else + IS_TAG="false" + + BRANCH=$(git symbolic-ref -q HEAD | sed 's@.*/@@') + if [ -z "${BRANCH}" ]; then + echo "Internal error: branch name is empty." + echo "An earlier step should have prevented this from happening." + echo "Cancelling build, as without a branch name we cannot store the artifacts" + exit 1 + fi + + if [ "${BRANCH}" = "${{ env.NIGHTLIES_BRANCH }}" ]; then + # The "master" branch is special, and we call a nightly. + FOLDER="${{ env.FOLDER_NIGHTLIES }}/$(date +%Y)" + TRIGGER_TYPE="new-master" + else + # All other branches, which can be builds of Pull Requests, are + # put in their own folder. + FOLDER="${{ env.FOLDER_BRANCHES }}/${BRANCH}" + TRIGGER_TYPE="new-branch" + fi + fi + + mkdir -p build/bundles + cp .changelog build/bundles/changelog.txt + cp .release_date build/bundles/released.txt + cp README.md build/bundles/README.md + echo "::endgroup::" + + echo "Release Date: $(cat .release_date)" + echo "Revision: $(cat .ottdrev)" + echo "Version: $(cat .version)" + echo "Is tag: ${IS_TAG}" + echo "Folder on CDN: ${FOLDER}" + echo "Workflow trigger: ${TRIGGER_TYPE}" + + echo "::set-output name=version::$(cat .version)" + echo "::set-output name=is_tag::${IS_TAG}" + echo "::set-output name=folder::${FOLDER}" + echo "::set-output name=trigger_type::${TRIGGER_TYPE}" + env: + NIGHTLIES_BRANCH: master + FOLDER_RELEASES: openttd-releases + FOLDER_NIGHTLIES: openttd-nightlies + FOLDER_BRANCHES: openttd-branches + + - name: Remove VCS information + run: | + rm -rf .git + + - name: Create bundles + run: | + FOLDER_NAME=openttd-${{ steps.metadata.outputs.version }} + + # Rename the folder to openttd-NNN + mkdir ${FOLDER_NAME} + find . -maxdepth 1 -not -name . -not -name build -not -name ${FOLDER_NAME} -exec mv {} ${FOLDER_NAME}/ \; + + echo "::group::Create tarball (xz) bundle" + tar --xz -cvf build/bundles/${FOLDER_NAME}-source.tar.xz ${FOLDER_NAME} + echo "::endgroup::" + + # This tarball is only to be used within this workflow. + echo "::group::Create tarball (gz) bundle" + tar --gzip -cvf source.tar.gz ${FOLDER_NAME} + echo "::endgroup::" + + echo "::group::Create zip bundle" + zip -9 -r build/bundles/${FOLDER_NAME}-source.zip ${FOLDER_NAME} + echo "::endgroup::" + + - name: Store bundles + uses: actions/upload-artifact@v2 + with: + name: openttd-source + path: build/bundles/* + retention-days: 5 + + - name: Store source (for other jobs) + uses: actions/upload-artifact@v2 + with: + name: internal-source + path: source.tar.gz + retention-days: 1 + + docs: + name: Docs + needs: source + + runs-on: ubuntu-20.04 + + steps: + - name: Download source + uses: actions/download-artifact@v2 + with: + name: internal-source + + - name: Unpack source + run: | + tar -xf source.tar.gz --strip-components=1 + + - name: Install dependencies + run: | + echo "::group::Update apt" + sudo apt-get update + echo "::endgroup::" + + echo "::group::Install dependencies" + sudo apt-get install -y --no-install-recommends \ + doxygen \ + # EOF + echo "::endgroup::" + env: + DEBIAN_FRONTEND: noninteractive + + - name: Build + run: | + mkdir -p ${GITHUB_WORKSPACE}/build + cd ${GITHUB_WORKSPACE}/build + + echo "::group::CMake" + cmake ${GITHUB_WORKSPACE} \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DOPTION_DOCS_ONLY=ON \ + # EOF + echo "::endgroup::" + + echo "::group::Build" + make docs + echo "::endgroup::" + + - name: Create bundles + run: | + BASENAME=openttd-${{ needs.source.outputs.version }} + + cd ${GITHUB_WORKSPACE}/build + + mv docs/source ${BASENAME}-docs + mv docs/ai-api ${BASENAME}-docs-ai + mv docs/gs-api ${BASENAME}-docs-gs + + mkdir -p bundles + + echo "::group::Create docs bundle" + tar --xz -cf bundles/${BASENAME}-docs.tar.xz ${BASENAME}-docs + echo "::endgroup::" + + echo "::group::Create AI API docs bundle" + tar --xz -cf bundles/${BASENAME}-docs-ai.tar.xz ${BASENAME}-docs-ai + echo "::endgroup::" + + echo "::group::Create GameScript API docs bundle" + tar --xz -cf bundles/${BASENAME}-docs-gs.tar.xz ${BASENAME}-docs-gs + echo "::endgroup::" + + - name: Store bundles + uses: actions/upload-artifact@v2 + with: + name: openttd-docs + path: build/bundles/*.tar.xz + retention-days: 5 + + linux: + name: Linux + needs: source + + if: needs.source.outputs.is_tag == 'true' + + strategy: + fail-fast: false + matrix: + include: + - container_image: "ubuntu:18.04" + bundle_name: "bionic" + - container_image: "ubuntu:20.04" + bundle_name: "focal" + - container_image: "ubuntu:20.10" + bundle_name: "groovy" + - container_image: "debian:buster" + bundle_name: "buster" + + runs-on: ubuntu-20.04 + container: + image: ${{ matrix.container_image }} + + steps: + - name: Download source + uses: actions/download-artifact@v2 + with: + name: internal-source + + - name: Unpack source + run: | + tar -xf source.tar.gz --strip-components=1 + + - name: Install dependencies + run: | + echo "::group::Update apt" + apt-get update + echo "::endgroup::" + + echo "::group::Install dependencies" + apt-get install -y --no-install-recommends \ + cmake \ + debhelper \ + g++ \ + git \ + make \ + openssl \ + libfontconfig-dev \ + libfluidsynth-dev \ + libicu-dev \ + liblzma-dev \ + liblzo2-dev \ + libsdl2-dev \ + libxdg-basedir-dev \ + lsb-release \ + zlib1g-dev \ + # EOF + echo "::endgroup::" + env: + DEBIAN_FRONTEND: noninteractive + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + run: | + mkdir -p build + cd build + + echo "::group::CMake" + cmake ${GITHUB_WORKSPACE} \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=/usr \ + # EOF + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + make -j$(nproc) package + echo "::endgroup::" + + # Remove the sha256 files CPack generates; we will do this ourself at + # the end of this workflow. + rm -f bundles/*.sha256 + + - name: Store bundles + uses: actions/upload-artifact@v2 + with: + name: openttd-linux-${{ matrix.bundle_name }} + path: build/bundles + retention-days: 5 + + macos: + name: MacOS + needs: source + + strategy: + fail-fast: false + matrix: + include: + - arch: x64 + full_arch: x86_64 + + runs-on: macos-11.0 + env: + MACOSX_DEPLOYMENT_TARGET: 10.9 + + steps: + - name: Download source + uses: actions/download-artifact@v2 + with: + name: internal-source + + - name: Unpack source + run: | + tar -xf source.tar.gz --strip-components=1 + + - name: Prepare vcpkg (with cache) + uses: lukka/run-vcpkg@v6 + with: + vcpkgDirectory: '/usr/local/share/vcpkg' + doNotUpdateVcpkg: true + vcpkgArguments: 'freetype liblzma lzo' + vcpkgTriplet: '${{ matrix.arch }}-osx' + + - name: Build tools + run: | + mkdir build-host + cd build-host + + echo "::group::CMake" + cmake ${GITHUB_WORKSPACE} \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DOPTION_TOOLS_ONLY=ON \ + # EOF + echo "::endgroup::" + + echo "::group::Build tools" + echo "Running on $(sysctl -n hw.logicalcpu) cores" + make -j$(sysctl -n hw.logicalcpu) tools + echo "::endgroup::" + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + run: | + mkdir build + cd build + + echo "::group::CMake" + cmake ${GITHUB_WORKSPACE} \ + -DCMAKE_OSX_ARCHITECTURES=${{ matrix.full_arch }} \ + -DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-osx \ + -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + # EOF + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(sysctl -n hw.logicalcpu) cores" + make -j$(sysctl -n hw.logicalcpu) package + echo "::endgroup::" + + # Remove the sha256 files CPack generates; we will do this ourself at + # the end of this workflow. + rm -f bundles/*.sha256 + + - name: Store bundles + uses: actions/upload-artifact@v2 + with: + name: openttd-macos-${{ matrix.arch }} + path: build/bundles + retention-days: 5 + + windows: + name: Windows + needs: source + + strategy: + fail-fast: false + matrix: + include: + - arch: x86 + - arch: x64 + + runs-on: windows-latest + + steps: + - name: Download source + uses: actions/download-artifact@v2 + with: + name: internal-source + + - name: Unpack source + shell: bash + run: | + tar -xf source.tar.gz --strip-components=1 + + - name: Prepare vcpkg (with cache) + uses: lukka/run-vcpkg@v6 + with: + vcpkgDirectory: 'c:/vcpkg' + doNotUpdateVcpkg: true + vcpkgArguments: 'liblzma libpng lzo zlib' + vcpkgTriplet: '${{ matrix.arch }}-windows-static' + + - name: Build tools + uses: lukka/run-cmake@v3 + with: + cmakeListsOrSettingsJson: CMakeListsTxtAdvanced + useVcpkgToolchainFile: false + buildDirectory: '${{ github.workspace }}/build-host' + buildWithCMakeArgs: '--target tools' + cmakeBuildType: RelWithDebInfo + cmakeAppendedArgs: ' -GNinja -DOPTION_TOOLS_ONLY=ON' + + - name: Install MSVC problem matcher + uses: ammaraskar/msvc-problem-matcher@master + + - name: Build (with installer) + if: needs.source.outputs.is_tag == 'true' && matrix.arch != 'arm64' + uses: lukka/run-cmake@v3 + with: + cmakeListsOrSettingsJson: CMakeListsTxtAdvanced + useVcpkgToolchainFile: true + buildDirectory: '${{ github.workspace }}/build' + cmakeBuildType: RelWithDebInfo + cmakeAppendedArgs: ' -GNinja -DOPTION_USE_NSIS=ON -DHOST_BINARY_DIR=${{ github.workspace }}/build-host' + + - name: Build (without installer) + if: needs.source.outputs.is_tag != 'true' || matrix.arch == 'arm64' + uses: lukka/run-cmake@v3 + with: + cmakeListsOrSettingsJson: CMakeListsTxtAdvanced + useVcpkgToolchainFile: true + buildDirectory: '${{ github.workspace }}/build' + cmakeBuildType: RelWithDebInfo + cmakeAppendedArgs: ' -GNinja -DHOST_BINARY_DIR=${{ github.workspace }}/build-host' + + - name: Create bundles + shell: bash + run: | + cd ${GITHUB_WORKSPACE}/build + echo "::group::Run CPack" + cpack + echo "::endgroup::" + + echo "::group::Prepare PDB to be bundled" + PDB=$(ls bundles/*.zip | cut -d/ -f2 | sed 's/.zip$/.pdb/') + cp openttd.pdb bundles/${PDB} + xz -9 bundles/${PDB} + echo "::endgroup::" + + echo "::group::Cleanup" + # Remove the sha256 files CPack generates; we will do this ourself at + # the end of this workflow. + rm -f bundles/*.sha256 + echo "::endgroup::" + + - name: Store bundles + uses: actions/upload-artifact@v2 + with: + name: openttd-windows-${{ matrix.arch }} + path: build/bundles + retention-days: 5 + + upload: + name: Upload + needs: + - source + - docs + - linux + - macos + - windows + + # The 'linux' job can be skipped if it is a nightly. That normally causes + # this job to be skipped too, unless we have this length boy :) + # "always()" is important here, it is the keyword to use to stop skipping + # this job if any dependency is skipped. It looks a bit silly, but it is + # how GitHub Actions work ;) + if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && (needs.linux.result == 'success' || needs.linux.result == 'skipped') && needs.macos.result == 'success' && needs.windows.result == 'success' + + runs-on: ubuntu-20.04 + + steps: + - name: Download all bundles + uses: actions/download-artifact@v2 + + - name: Calculate checksums + run: | + echo "::group::Move bundles to a single folder" + mkdir bundles + mv openttd-*/* bundles/ + cd bundles + echo "::group::Build" + + for i in $(ls openttd-*); do + echo "::group::Calculating checksums for ${i}" + openssl dgst -r -md5 -hex $i > $i.md5sum + openssl dgst -r -sha1 -hex $i > $i.sha1sum + openssl dgst -r -sha256 -hex $i > $i.sha256sum + echo "::endgroup::" + done + + - name: Upload bundles to AWS + run: | + aws s3 cp --recursive --only-show-errors bundles/ s3://${{ secrets.CDN_S3_BUCKET }}/${{ needs.source.outputs.folder }}/${{ needs.source.outputs.version }}/ + + # We do not invalidate the CloudFront distribution here. The trigger + # for "New OpenTTD release" first updated the manifest files and + # creates an index.html. We invalidate after that, so everything + # becomes visible at once. + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.AWS_REGION }} + + - name: Trigger 'New OpenTTD release' + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ secrets.DEPLOYMENT_TOKEN }} + repository: OpenTTD/workflows + event-type: ${{ needs.source.outputs.trigger_type }} + client-payload: '{"version": "${{ needs.source.outputs.version }}", "folder": "${{ needs.source.outputs.folder }}"}' diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 5f37ccb7f3..dd00e633b1 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -7,7 +7,11 @@ if(OPTION_INSTALL_FHS) set(DOCS_DESTINATION_DIR "${CMAKE_INSTALL_DOCDIR}") set(MAN_DESTINATION_DIR "${CMAKE_INSTALL_MANDIR}") else() - set(BINARY_DESTINATION_DIR ".") + if(APPLE) + set(BINARY_DESTINATION_DIR "../MacOS") + else() + set(BINARY_DESTINATION_DIR ".") + endif() set(DATA_DESTINATION_DIR ".") set(DOCS_DESTINATION_DIR ".") set(MAN_DESTINATION_DIR ".") @@ -73,6 +77,9 @@ if(WIN32) set(ARCHITECTURE "win32") endif() endif() +if(APPLE AND CMAKE_OSX_ARCHITECTURES) + string(TOLOWER "${CMAKE_OSX_ARCHITECTURES}" ARCHITECTURE) +endif() set(CPACK_SYSTEM_NAME "${ARCHITECTURE}") @@ -95,7 +102,7 @@ if(APPLE) set(CPACK_GENERATOR "Bundle") include(PackageBundle) - set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx") + set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx-${CPACK_SYSTEM_NAME}") elseif(WIN32) set(CPACK_GENERATOR "ZIP") if(OPTION_USE_NSIS) @@ -115,7 +122,24 @@ elseif(UNIX) set(CPACK_GENERATOR "TXZ") endif() - set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${CPACK_SYSTEM_NAME}") + find_program(LSB_RELEASE_EXEC lsb_release) + execute_process(COMMAND ${LSB_RELEASE_EXEC} -is + OUTPUT_VARIABLE LSB_RELEASE_ID + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT LSB_RELEASE_ID) + set(PLATFORM "generic") + elseif(LSB_RELEASE_ID STREQUAL "Ubuntu" OR LSB_RELEASE_ID STREQUAL "Debian") + execute_process(COMMAND ${LSB_RELEASE_EXEC} -cs + OUTPUT_VARIABLE LSB_RELEASE_CODENAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string(TOLOWER "${LSB_RELEASE_ID}-${LSB_RELEASE_CODENAME}" PLATFORM) + else() + message(FATAL_ERROR "Unknown Linux distribution found for packaging; please consider creating a Pull Request to add support for this distribution.") + endif() + + set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${PLATFORM}-${CPACK_SYSTEM_NAME}") else() message(FATAL_ERROR "Unknown OS found for packaging; please consider creating a Pull Request to add support for this OS.") endif() diff --git a/cmake/PackageBundle.cmake b/cmake/PackageBundle.cmake index 7f96e05fa8..737f4809aa 100644 --- a/cmake/PackageBundle.cmake +++ b/cmake/PackageBundle.cmake @@ -3,7 +3,6 @@ string(TIMESTAMP CURRENT_YEAR "%Y") set(CPACK_BUNDLE_NAME "OpenTTD") set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/os/macosx/openttd.icns") set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist") -set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/os/macosx/launch.sh") set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/os/macosx/splash.png") set(CPACK_DMG_FORMAT "UDBZ") @@ -20,7 +19,7 @@ install( " include(BundleUtilities) set(BU_CHMOD_BUNDLE_ITEMS TRUE) - fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/openttd\" \"\" \"\") + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/../MacOS/openttd\" \"\" \"\") " DESTINATION . COMPONENT Runtime) diff --git a/cmake/PackageDeb.cmake b/cmake/PackageDeb.cmake index 9b8b5c7a29..eb4ec0e902 100644 --- a/cmake/PackageDeb.cmake +++ b/cmake/PackageDeb.cmake @@ -2,4 +2,3 @@ set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${ARCHITECTURE}") set(CPACK_DEBIAN_PACKAGE_SECTION "games") set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) -set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.15)") diff --git a/media/baseset/orig_dos.obm b/media/baseset/orig_dos.obm index 49c0f67703..e476c11dd3 100644 --- a/media/baseset/orig_dos.obm +++ b/media/baseset/orig_dos.obm @@ -8,40 +8,40 @@ version = 1 @description_STR_BASEMUSIC_DOS_DESCRIPTION@ [files] -theme = gm.cat -old_0 = gm.cat -old_1 = gm.cat -old_2 = gm.cat -old_3 = gm.cat -old_4 = gm.cat -old_5 = gm.cat -old_6 = gm.cat -old_7 = gm.cat +theme = GM.CAT +old_0 = GM.CAT +old_1 = GM.CAT +old_2 = GM.CAT +old_3 = GM.CAT +old_4 = GM.CAT +old_5 = GM.CAT +old_6 = GM.CAT +old_7 = GM.CAT old_8 = old_9 = -new_0 = gm.cat -new_1 = gm.cat -new_2 = gm.cat -new_3 = gm.cat -new_4 = gm.cat -new_5 = gm.cat -new_6 = gm.cat +new_0 = GM.CAT +new_1 = GM.CAT +new_2 = GM.CAT +new_3 = GM.CAT +new_4 = GM.CAT +new_5 = GM.CAT +new_6 = GM.CAT new_7 = new_8 = new_9 = -ezy_0 = gm.cat -ezy_1 = gm.cat -ezy_2 = gm.cat -ezy_3 = gm.cat -ezy_4 = gm.cat -ezy_5 = gm.cat +ezy_0 = GM.CAT +ezy_1 = GM.CAT +ezy_2 = GM.CAT +ezy_3 = GM.CAT +ezy_4 = GM.CAT +ezy_5 = GM.CAT ezy_6 = ezy_7 = ezy_8 = ezy_9 = [md5s] -gm.cat = 7a29d2d0c4f7d2e03091ffa9b2bdfffb +GM.CAT = 7a29d2d0c4f7d2e03091ffa9b2bdfffb [catindex] theme = 0 diff --git a/media/baseset/orig_tto.obm b/media/baseset/orig_tto.obm index ced9cf5807..fe97fd1439 100644 --- a/media/baseset/orig_tto.obm +++ b/media/baseset/orig_tto.obm @@ -8,25 +8,25 @@ version = 1 @description_STR_BASEMUSIC_TTO_DESCRIPTION@ [files] -theme = gm-tto.cat -old_0 = gm-tto.cat -old_1 = gm-tto.cat -old_2 = gm-tto.cat -old_3 = gm-tto.cat -old_4 = gm-tto.cat -old_5 = gm-tto.cat -old_6 = gm-tto.cat -old_7 = gm-tto.cat +theme = GM-TTO.CAT +old_0 = GM-TTO.CAT +old_1 = GM-TTO.CAT +old_2 = GM-TTO.CAT +old_3 = GM-TTO.CAT +old_4 = GM-TTO.CAT +old_5 = GM-TTO.CAT +old_6 = GM-TTO.CAT +old_7 = GM-TTO.CAT old_8 = old_9 = -new_0 = gm-tto.cat -new_1 = gm-tto.cat -new_2 = gm-tto.cat -new_3 = gm-tto.cat -new_4 = gm-tto.cat -new_5 = gm-tto.cat -new_6 = gm-tto.cat -new_7 = gm-tto.cat +new_0 = GM-TTO.CAT +new_1 = GM-TTO.CAT +new_2 = GM-TTO.CAT +new_3 = GM-TTO.CAT +new_4 = GM-TTO.CAT +new_5 = GM-TTO.CAT +new_6 = GM-TTO.CAT +new_7 = GM-TTO.CAT new_8 = new_9 = ezy_0 = @@ -60,7 +60,7 @@ new_6 = 14 new_7 = 3 [md5s] -gm-tto.cat = 26e85ff84b0063aa5da05dd4698fc76e +GM-TTO.CAT = 26e85ff84b0063aa5da05dd4698fc76e [names] ; Names get read from the CAT file diff --git a/os/macosx/launch.sh b/os/macosx/launch.sh deleted file mode 100644 index 7b0389d8a5..0000000000 --- a/os/macosx/launch.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -ROOT_DIR=$(dirname "$0")/.. - -export DYLD_LIBRARY_PATH=${ROOT_DIR}/Frameworks - -cd ${ROOT_DIR}/Resources -exec ./openttd "$@" diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 987008f708..df6e200d79 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -274,9 +274,9 @@ STR_OSK_KEYBOARD_LAYOUT_CAPS :½!"#¤%&/()=?` # Measurement tooltip STR_MEASURE_LENGTH :{BLACK}Pituus: {NUM} -STR_MEASURE_AREA :{BLACK}Pinta-ala: {NUM} x {NUM} +STR_MEASURE_AREA :{BLACK}Pinta-ala: {NUM}×{NUM} STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Pituus: {NUM}{}Korkeusero: {HEIGHT} -STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Pinta-ala: {NUM} x {NUM}{}Korkeusero: {HEIGHT} +STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Pinta-ala: {NUM}×{NUM}{}Korkeusero: {HEIGHT} # These are used in buttons @@ -1026,7 +1026,7 @@ STR_ERROR_FULLSCREEN_FAILED :{WHITE}Täyskuv # Custom currency window STR_CURRENCY_WINDOW :{WHITE}Oma valuutta -STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Vaihtokurssi: {ORANGE}{CURRENCY_LONG} = £ {COMMA} +STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Vaihtokurssi: {ORANGE}{CURRENCY_LONG} = {COMMA} £ STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Pienennä vaihtokurssia verrattuna puntaan (£) STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Suurenna vaihtokurssia verrattuna puntaan (£) STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}Aseta vaihtokurssi valuutallesi verrattuna puntaan (£) @@ -1261,7 +1261,7 @@ STR_CONFIG_SETTING_FREIGHT_TRAINS :Rahdin painoker STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Määritä rahdin kuljettamisen vaikutus junissa. Korkeammat arvot tekevät rahdin kuljettamisesta raskaampaa junille, erityisesti mäissä STR_CONFIG_SETTING_PLANE_SPEED :Lentokoneiden nopeuskerroin: {STRING} STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Määritä lentokoneiden suhteellinen nopeus verrattuna toisiin kulkuneuvotyyppeihin, jotta vähennetään ilma-alusksilla tehtyjen kuljetusten tuottoa -STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} +STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1/{COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Lento-onnettomuuksien määrä: {STRING} STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Määrittää lento-onnettomuuksien todennäköisyyden.{}¹ Isot lentokoneet voivat kuitenkin aina tuhoutua pienille lentokentille laskeutuessaan. STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ei yhtään¹ @@ -1296,7 +1296,7 @@ STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista kulkune STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Mikäli käytössä, lähellä käyttöikänsä loppua oleva kulkuneuvo korvataan automaattisesti STR_CONFIG_SETTING_AUTORENEW_MONTHS :Uudista automaattisesti {STRING} STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Suhteellinen ikä, jonka jälkeen kulkuneuvo voidaan uudistaa automaattisesti -STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} kuukau{P 0 tta tta} ennen kulkuneuvon käyttöiän loppua +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} kuukau{P 0 si tta} ennen kulkuneuvon käyttöiän loppua STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} kuukau{P 0 si tta} jälkeen kulkuneuvon käyttöiän lopun STR_CONFIG_SETTING_AUTORENEW_MONEY :Vähimmäisrahamäärä kulkuneuvon automaattiseen uudistukseen: {STRING} STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Pienin rahamäärä, joka on oltava pankissa ennen kulkuneuvojen automaattista uudistamista @@ -1315,7 +1315,7 @@ STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Näytä NewGRF: STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Lisää kulkuneuvovalikoimaikkunaan rivin, joka kertoo mistä NewGRF:stä valittu kulkuneuvo on peräisin. STR_CONFIG_SETTING_LANDSCAPE :Maasto: {STRING} -STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Maasto vaikuttaa useisiin pelin peruselementteihin, kuten rahtiin ja kuntien kasvuedellytyksiin. NewGRF:t ja peliskriptit voivat kuitenkin vaikuttaa tarkemmin pelin kulkuun +STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Maasto vaikuttaa useisiin pelin peruselementteihin, kuten rahtiin ja kuntien kasvuedellytyksiin. NewGRF:t ja peliskriptit voivat kuitenkin vaikuttaa tarkemmin pelin kulkuun. STR_CONFIG_SETTING_LAND_GENERATOR :Maastogeneraattori: {STRING} STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :Alkuperäinen maastonluoja riippuu perusgrafiikkapaketista ja luo ennalta määritettyjä maastonmuotoja. TerraGenesis luo maastoa Perlin-kohinan perusteella ja mahdollistaa asetusten tarkemman määrittelyn STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Alkuperäinen @@ -1487,7 +1487,7 @@ STR_CONFIG_SETTING_AI_PROFILE_HARD :Vaikea STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Salli tekoälyt moninpelissä: {STRING} STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Sallii tietokonepelaajien osallistumisen moninpeleihin -STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodet ennen skriptin pysäyttämistä: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Operaatiokoodien määrä ennen skriptin pysäyttämistä: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Suurin sallittu määrä laskutoimituksia, jonka skripti voi suorittaa yhden vuoron aikana STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Skriptikohtainen muistinkäyttö enintään: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Kuinka paljon muistia yksittäinen skripti saa käyttää, ennen kuin se pakotetaan lopettamaan. Jos kartta on iso, tätä arvoa voi joutua suurentamaan. @@ -1645,7 +1645,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Nopea STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Erittäin nopea STR_CONFIG_SETTING_LARGER_TOWNS :Kaupunkien osuus: {STRING} STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT :Kaupunkien määrä: kaupungit ovat isompia jo alussa ja kasvavat nopeammin kuin muut kunnat -STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1 / {COMMA} +STR_CONFIG_SETTING_LARGER_TOWNS_VALUE :1/{COMMA} STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ei yhtään STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Kasvukerroin alussa: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Kaupunkien keskimääräinen koko suhteessa muihin kuntiin pelin alussa @@ -2156,7 +2156,7 @@ STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Verkkope STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Palvelimen pelitallennetta ei voi ladata STR_NETWORK_ERROR_SERVER_START :{WHITE}Palvelinta ei voitu käynnistää STR_NETWORK_ERROR_CLIENT_START :{WHITE}Yhdistäminen ei onnistunut -STR_NETWORK_ERROR_TIMEOUT :{WHITE}Yhteys #{NUM} aikakatkaistiin +STR_NETWORK_ERROR_TIMEOUT :{WHITE}Yhteys nro {NUM} aikakatkaistiin STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Protokollavirhe tapahtui ja yhteys suljettiin STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Tämän asiakkaan versio ei vastaa palvelimen versiota STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Väärä salasana @@ -2213,10 +2213,10 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :peliskripti ############ End of leave-in-this-order STR_NETWORK_MESSAGE_CLIENT_LEAVING :poistutaan STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} on liittynyt peliin -STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} liittyi peliin (Asiakas #{2:NUM}) -STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} on liittynyt yhtiöön #{2:NUM} +STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} liittyi peliin (asiakas nro {2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} on liittynyt yhtiöön nro {2:NUM} STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} on liittynyt katselijoihin -STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} on aloittanut uuden yhtiön (#{2:NUM}) +STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} on aloittanut uuden yhtiön (nro {2:NUM}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} on poistunut pelistä ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} on muuttanut nimekseen {STRING} STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} antoi yhtiöllesi {2:CURRENCY_LONG} @@ -2521,7 +2521,7 @@ STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Valitse rakennettavan objektin luokka STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektin esikatselu -STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM} × {NUM} ruutua +STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua STR_OBJECT_CLASS_LTHS :Majakat STR_OBJECT_CLASS_TRNS :Lähettimet @@ -2619,7 +2619,7 @@ STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Raitioti STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Rautatien omistaja: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Kunta: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Ei mitään -STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Koordinaatit: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING}) +STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Koordinaatit: {LTBLUE}{NUM}×{NUM}×{NUM} ({STRING}) STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Rakennettu: {LTBLUE}{DATE_LONG} STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Aseman luokka: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Aseman tyyppi: {LTBLUE}{STRING} @@ -2859,7 +2859,7 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuaali STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Korkeuskartan kierto: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Korkeuskartan nimi: STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Koko: -STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} +STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM}×{NUM} STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}Muuta suurinta sallittua kartan korkeutta STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Vaihda lumirajan korkeutta @@ -2882,7 +2882,7 @@ STR_GENERATION_ABORT :{BLACK}Peruuta STR_GENERATION_ABORT_CAPTION :{WHITE}Keskeytä maailman luominen STR_GENERATION_ABORT_MESSAGE :{YELLOW}Haluatko varmasti keskeyttää maan luomisen? STR_GENERATION_PROGRESS :{WHITE}{NUM}{NBSP}% valmiina -STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM} +STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM}/{NUM} STR_GENERATION_WORLD_GENERATION :{BLACK}Maailman luominen STR_GENERATION_RIVER_GENERATION :{BLACK}Jokien luominen STR_GENERATION_TREE_GENERATION :{BLACK}Puiden luominen @@ -3069,7 +3069,7 @@ STR_INVALID_VEHICLE :SendPackets(); + this->CloseConnection(res); ClientNetworkEmergencySave(); _switch_mode = SM_MENU; - this->CloseConnection(res); _networking = false; } diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index d0160b7d33..d83d22c0e1 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -910,7 +910,7 @@ void ClientNetworkContentSocketHandler::ToggleSelectedState(const ContentInfo *c */ void ClientNetworkContentSocketHandler::ReverseLookupDependency(ConstContentVector &parents, const ContentInfo *child) const { - for (const ContentInfo * const &ci : this->infos) { + for (const ContentInfo *ci : this->infos) { if (ci == child) continue; for (uint i = 0; i < ci->dependency_count; i++) { diff --git a/src/video/cocoa/wnd_quartz.mm b/src/video/cocoa/wnd_quartz.mm index 2ae2f82f16..6599b1f0db 100644 --- a/src/video/cocoa/wnd_quartz.mm +++ b/src/video/cocoa/wnd_quartz.mm @@ -297,7 +297,7 @@ bool WindowQuartzSubdriver::SetVideoMode(int width, int height, int bpp) this->window_height = height; this->buffer_depth = bpp; - [ this->window center ]; + [ (OTTD_CocoaWindow *)this->window center ]; /* Only recreate the view if it doesn't already exist */ if (this->cocoaview == nil) {