From 84b71f796220b382c2bf943a406234ffb18098b8 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 11:42:20 +0200 Subject: [PATCH 01/41] Remove: all existing project files This prepares for the switch to CMake, which takes over all current exisiting forms of project files. --- Makefile.bundle.in | 221 -- Makefile.grf.in | 116 - Makefile.in | 185 -- Makefile.lang.in | 87 - Makefile.msvc | 45 - Makefile.setting.in | 63 - Makefile.src.in | 295 -- config.lib | 3508 -------------------- configure | 169 - findversion.sh | 114 - projects/basesets_vs140.vcxproj | 99 - projects/basesets_vs140.vcxproj.filters | 40 - projects/basesets_vs140.vcxproj.filters.in | 11 - projects/basesets_vs140.vcxproj.in | 40 - projects/basesets_vs141.vcxproj | 99 - projects/basesets_vs141.vcxproj.filters | 40 - projects/basesets_vs141.vcxproj.filters.in | 11 - projects/basesets_vs141.vcxproj.in | 40 - projects/basesets_vs142.vcxproj | 99 - projects/basesets_vs142.vcxproj.filters | 40 - projects/basesets_vs142.vcxproj.filters.in | 11 - projects/basesets_vs142.vcxproj.in | 40 - projects/determineversion.vbs | 216 -- projects/dpi_aware.manifest | 29 - projects/gen-kdev4.sh | 201 -- projects/generate | 337 -- projects/generate.vbs | 414 --- projects/generate_vs140.vcxproj | 39 - projects/generate_vs141.vcxproj | 39 - projects/generate_vs142.vcxproj | 39 - projects/langs_vs140.vcxproj | 390 --- projects/langs_vs140.vcxproj.filters | 176 - projects/langs_vs140.vcxproj.filters.in | 12 - projects/langs_vs140.vcxproj.in | 61 - projects/langs_vs141.vcxproj | 390 --- projects/langs_vs141.vcxproj.filters | 176 - projects/langs_vs141.vcxproj.filters.in | 12 - projects/langs_vs141.vcxproj.in | 61 - projects/langs_vs142.vcxproj | 390 --- projects/langs_vs142.vcxproj.filters | 176 - projects/langs_vs142.vcxproj.filters.in | 12 - projects/langs_vs142.vcxproj.in | 61 - projects/openttd_vs140.sln | 103 - projects/openttd_vs140.vcxproj | 1387 -------- projects/openttd_vs140.vcxproj.filters | 3155 ------------------ projects/openttd_vs140.vcxproj.filters.in | 13 - projects/openttd_vs140.vcxproj.in | 374 --- projects/openttd_vs141.sln | 103 - projects/openttd_vs141.vcxproj | 1387 -------- projects/openttd_vs141.vcxproj.filters | 3155 ------------------ projects/openttd_vs141.vcxproj.filters.in | 13 - projects/openttd_vs141.vcxproj.in | 374 --- projects/openttd_vs142.sln | 105 - projects/openttd_vs142.vcxproj | 1387 -------- projects/openttd_vs142.vcxproj.filters | 3155 ------------------ projects/openttd_vs142.vcxproj.filters.in | 13 - projects/openttd_vs142.vcxproj.in | 374 --- projects/os_versions.manifest | 17 - projects/regression.bat | 6 - projects/regression_vs140.vcxproj | 41 - projects/regression_vs141.vcxproj | 41 - projects/regression_vs142.vcxproj | 41 - projects/settings_vs140.vcxproj | 58 - projects/settings_vs140.vcxproj.filters | 35 - projects/settings_vs140.vcxproj.filters.in | 15 - projects/settings_vs140.vcxproj.in | 52 - projects/settings_vs141.vcxproj | 58 - projects/settings_vs141.vcxproj.filters | 35 - projects/settings_vs141.vcxproj.filters.in | 15 - projects/settings_vs141.vcxproj.in | 52 - projects/settings_vs142.vcxproj | 58 - projects/settings_vs142.vcxproj.filters | 35 - projects/settings_vs142.vcxproj.filters.in | 15 - projects/settings_vs142.vcxproj.in | 52 - projects/settingsgen_vs140.vcxproj | 83 - projects/settingsgen_vs140.vcxproj.filters | 32 - projects/settingsgen_vs141.vcxproj | 83 - projects/settingsgen_vs141.vcxproj.filters | 32 - projects/settingsgen_vs142.vcxproj | 84 - projects/settingsgen_vs142.vcxproj.filters | 32 - projects/strgen_vs140.vcxproj | 95 - projects/strgen_vs140.vcxproj.filters | 35 - projects/strgen_vs141.vcxproj | 95 - projects/strgen_vs141.vcxproj.filters | 35 - projects/strgen_vs142.vcxproj | 95 - projects/strgen_vs142.vcxproj.filters | 35 - projects/version_vs140.vcxproj | 42 - projects/version_vs141.vcxproj | 42 - projects/version_vs142.vcxproj | 42 - source.list | 1191 ------- 90 files changed, 26381 deletions(-) delete mode 100644 Makefile.bundle.in delete mode 100644 Makefile.grf.in delete mode 100644 Makefile.in delete mode 100644 Makefile.lang.in delete mode 100644 Makefile.msvc delete mode 100644 Makefile.setting.in delete mode 100644 Makefile.src.in delete mode 100644 config.lib delete mode 100755 configure delete mode 100755 findversion.sh delete mode 100644 projects/basesets_vs140.vcxproj delete mode 100644 projects/basesets_vs140.vcxproj.filters delete mode 100644 projects/basesets_vs140.vcxproj.filters.in delete mode 100644 projects/basesets_vs140.vcxproj.in delete mode 100644 projects/basesets_vs141.vcxproj delete mode 100644 projects/basesets_vs141.vcxproj.filters delete mode 100644 projects/basesets_vs141.vcxproj.filters.in delete mode 100644 projects/basesets_vs141.vcxproj.in delete mode 100644 projects/basesets_vs142.vcxproj delete mode 100644 projects/basesets_vs142.vcxproj.filters delete mode 100644 projects/basesets_vs142.vcxproj.filters.in delete mode 100644 projects/basesets_vs142.vcxproj.in delete mode 100755 projects/determineversion.vbs delete mode 100644 projects/dpi_aware.manifest delete mode 100755 projects/gen-kdev4.sh delete mode 100755 projects/generate delete mode 100644 projects/generate.vbs delete mode 100644 projects/generate_vs140.vcxproj delete mode 100644 projects/generate_vs141.vcxproj delete mode 100644 projects/generate_vs142.vcxproj delete mode 100644 projects/langs_vs140.vcxproj delete mode 100644 projects/langs_vs140.vcxproj.filters delete mode 100644 projects/langs_vs140.vcxproj.filters.in delete mode 100644 projects/langs_vs140.vcxproj.in delete mode 100644 projects/langs_vs141.vcxproj delete mode 100644 projects/langs_vs141.vcxproj.filters delete mode 100644 projects/langs_vs141.vcxproj.filters.in delete mode 100644 projects/langs_vs141.vcxproj.in delete mode 100644 projects/langs_vs142.vcxproj delete mode 100644 projects/langs_vs142.vcxproj.filters delete mode 100644 projects/langs_vs142.vcxproj.filters.in delete mode 100644 projects/langs_vs142.vcxproj.in delete mode 100644 projects/openttd_vs140.sln delete mode 100644 projects/openttd_vs140.vcxproj delete mode 100644 projects/openttd_vs140.vcxproj.filters delete mode 100644 projects/openttd_vs140.vcxproj.filters.in delete mode 100644 projects/openttd_vs140.vcxproj.in delete mode 100644 projects/openttd_vs141.sln delete mode 100644 projects/openttd_vs141.vcxproj delete mode 100644 projects/openttd_vs141.vcxproj.filters delete mode 100644 projects/openttd_vs141.vcxproj.filters.in delete mode 100644 projects/openttd_vs141.vcxproj.in delete mode 100644 projects/openttd_vs142.sln delete mode 100644 projects/openttd_vs142.vcxproj delete mode 100644 projects/openttd_vs142.vcxproj.filters delete mode 100644 projects/openttd_vs142.vcxproj.filters.in delete mode 100644 projects/openttd_vs142.vcxproj.in delete mode 100644 projects/os_versions.manifest delete mode 100644 projects/regression.bat delete mode 100644 projects/regression_vs140.vcxproj delete mode 100644 projects/regression_vs141.vcxproj delete mode 100644 projects/regression_vs142.vcxproj delete mode 100644 projects/settings_vs140.vcxproj delete mode 100644 projects/settings_vs140.vcxproj.filters delete mode 100644 projects/settings_vs140.vcxproj.filters.in delete mode 100644 projects/settings_vs140.vcxproj.in delete mode 100644 projects/settings_vs141.vcxproj delete mode 100644 projects/settings_vs141.vcxproj.filters delete mode 100644 projects/settings_vs141.vcxproj.filters.in delete mode 100644 projects/settings_vs141.vcxproj.in delete mode 100644 projects/settings_vs142.vcxproj delete mode 100644 projects/settings_vs142.vcxproj.filters delete mode 100644 projects/settings_vs142.vcxproj.filters.in delete mode 100644 projects/settings_vs142.vcxproj.in delete mode 100644 projects/settingsgen_vs140.vcxproj delete mode 100644 projects/settingsgen_vs140.vcxproj.filters delete mode 100644 projects/settingsgen_vs141.vcxproj delete mode 100644 projects/settingsgen_vs141.vcxproj.filters delete mode 100644 projects/settingsgen_vs142.vcxproj delete mode 100644 projects/settingsgen_vs142.vcxproj.filters delete mode 100644 projects/strgen_vs140.vcxproj delete mode 100644 projects/strgen_vs140.vcxproj.filters delete mode 100644 projects/strgen_vs141.vcxproj delete mode 100644 projects/strgen_vs141.vcxproj.filters delete mode 100644 projects/strgen_vs142.vcxproj delete mode 100644 projects/strgen_vs142.vcxproj.filters delete mode 100644 projects/version_vs140.vcxproj delete mode 100644 projects/version_vs141.vcxproj delete mode 100644 projects/version_vs142.vcxproj delete mode 100644 source.list diff --git a/Makefile.bundle.in b/Makefile.bundle.in deleted file mode 100644 index 276307c33e..0000000000 --- a/Makefile.bundle.in +++ /dev/null @@ -1,221 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# -# Creation of bundles -# - -# The revision is needed for the bundle name and creating an OSX application bundle. -# Detect the revision -VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh") -VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') - -# Make sure we have something in VERSION -ifeq ($(VERSION),) -VERSION := norev000 -endif - -ifndef BUNDLE_NAME -BUNDLE_NAME = openttd-custom-$(VERSION)-$(OS) -endif - -# An OSX application bundle needs the data files, lang files and openttd executable in a different location. -ifdef OSXAPP -AI_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/ai -GAME_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/game -BASESET_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/baseset -LANG_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/lang -TTD_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/MacOS -else -AI_DIR = $(BUNDLE_DIR)/ai -GAME_DIR = $(BUNDLE_DIR)/game -BASESET_DIR = $(BUNDLE_DIR)/baseset -LANG_DIR = $(BUNDLE_DIR)/lang -TTD_DIR = $(BUNDLE_DIR) -endif - -bundle: all - @echo '[BUNDLE] Constructing bundle' - $(Q)rm -rf "$(BUNDLE_DIR)" - $(Q)mkdir -p "$(BUNDLE_DIR)" - $(Q)mkdir -p "$(BUNDLE_DIR)/docs" - $(Q)mkdir -p "$(BUNDLE_DIR)/media" - $(Q)mkdir -p "$(BUNDLE_DIR)/scripts" - $(Q)mkdir -p "$(TTD_DIR)" - $(Q)mkdir -p "$(AI_DIR)" - $(Q)mkdir -p "$(GAME_DIR)" - $(Q)mkdir -p "$(BASESET_DIR)" - $(Q)mkdir -p "$(LANG_DIR)" -ifdef OSXAPP - $(Q)mkdir -p "$(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources" - $(Q)echo "APPL????" > "$(BUNDLE_DIR)/$(OSXAPP)/Contents/PkgInfo" - $(Q)cp "$(ROOT_DIR)/os/macosx/openttd.icns" "$(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/openttd.icns" - $(Q)$(ROOT_DIR)/os/macosx/plistgen.sh "$(BUNDLE_DIR)/$(OSXAPP)" "$(VERSION)" - $(Q)cp "$(ROOT_DIR)/os/macosx/splash.png" "$(BASESET_DIR)" -endif -ifeq ($(OS),UNIX) - $(Q)cp "$(ROOT_DIR)/media/openttd.32.bmp" "$(BASESET_DIR)/" -endif - $(Q)cp "$(BIN_DIR)/$(TTD)" "$(TTD_DIR)/" - $(Q)cp "$(BIN_DIR)/ai/"compat_*.nut "$(AI_DIR)/" - $(Q)cp "$(BIN_DIR)/game/"compat_*.nut "$(GAME_DIR)/" - $(Q)cp "$(BIN_DIR)/baseset/"*.grf "$(BASESET_DIR)/" - $(Q)cp "$(BIN_DIR)/baseset/"*.obg "$(BASESET_DIR)/" - $(Q)cp "$(BIN_DIR)/baseset/"*.obs "$(BASESET_DIR)/" - $(Q)cp "$(BIN_DIR)/baseset/opntitle.dat" "$(BASESET_DIR)/" - $(Q)cp "$(BIN_DIR)/baseset/"*.obm "$(BASESET_DIR)/" - $(Q)cp "$(BIN_DIR)/lang/"*.lng "$(LANG_DIR)/" - $(Q)cp "$(ROOT_DIR)/README.md" "$(BUNDLE_DIR)/" - $(Q)cp "$(ROOT_DIR)/COPYING.md" "$(BUNDLE_DIR)/" - $(Q)cp "$(ROOT_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/" - $(Q)cp "$(ROOT_DIR)/docs/multiplayer.md" "$(BUNDLE_DIR)/docs/" - $(Q)cp "$(ROOT_DIR)/changelog.txt" "$(BUNDLE_DIR)/" -ifdef MAN_DIR - $(Q)mkdir -p "$(BUNDLE_DIR)/man/" - $(Q)cp "$(ROOT_DIR)/docs/openttd.6" "$(BUNDLE_DIR)/man/" - $(Q)gzip -9 "$(BUNDLE_DIR)/man/openttd.6" -endif - $(Q)cp "$(ROOT_DIR)/media/openttd.32.xpm" "$(BUNDLE_DIR)/media/" - $(Q)cp "$(ROOT_DIR)/media/openttd."*.png "$(BUNDLE_DIR)/media/" - $(Q)cp "$(BIN_DIR)/scripts/"* "$(BUNDLE_DIR)/scripts/" -ifdef MENU_DIR - $(Q)cp "$(ROOT_DIR)/media/openttd.desktop" "$(BUNDLE_DIR)/media/" - $(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | LC_ALL=C $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop" - $(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install" -endif -ifeq ($(TTD), openttd.exe) - $(Q)unix2dos "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/README.md" "$(BUNDLE_DIR)/COPYING.md" "$(BUNDLE_DIR)/changelog.txt" "$(BUNDLE_DIR)/known-bugs.txt" -endif - -### Packing the current bundle into several compressed file formats ### -# -# Zips & dmgs do not contain a root folder, i.e. they have files in the root of the zip/dmg. -# gzip, bzip2 and lha archives have a root folder, with the same name as the bundle. -# -# One can supply a custom name by adding BUNDLE_NAME:= to the make command. -# -bundle_zip: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).zip' - $(Q)mkdir -p "$(BUNDLES_DIR)" - $(Q)cd "$(BUNDLE_DIR)" && zip -r $(shell if test -z "$(VERBOSE)"; then echo '-q'; fi) "$(BUNDLES_DIR)/$(BUNDLE_NAME).zip" . - -bundle_7z: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).7z' - $(Q)mkdir -p "$(BUNDLES_DIR)" - $(Q)cd "$(BUNDLE_DIR)" && 7z a "$(BUNDLES_DIR)/$(BUNDLE_NAME).7z" . - -bundle_gzip: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.gz' - $(Q)mkdir -p "$(BUNDLES_DIR)/.gzip/$(BUNDLE_NAME)" - $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.gzip/$(BUNDLE_NAME)/" - $(Q)cd "$(BUNDLES_DIR)/.gzip" && tar -zc$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.gz" "$(BUNDLE_NAME)" - $(Q)rm -rf "$(BUNDLES_DIR)/.gzip" - -bundle_bzip2: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.bz2' - $(Q)mkdir -p "$(BUNDLES_DIR)/.bzip2/$(BUNDLE_NAME)" - $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.bzip2/$(BUNDLE_NAME)/" - $(Q)cd "$(BUNDLES_DIR)/.bzip2" && tar -jc$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.bz2" "$(BUNDLE_NAME)" - $(Q)rm -rf "$(BUNDLES_DIR)/.bzip2" - -bundle_lzma: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.lzma' - $(Q)mkdir -p "$(BUNDLES_DIR)/.lzma/$(BUNDLE_NAME)" - $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.lzma/$(BUNDLE_NAME)/" - $(Q)cd "$(BUNDLES_DIR)/.lzma" && tar --lzma -c$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.lzma" "$(BUNDLE_NAME)" - $(Q)rm -rf "$(BUNDLES_DIR)/.lzma" - -bundle_xz: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.xz' - $(Q)mkdir -p "$(BUNDLES_DIR)/.xz/$(BUNDLE_NAME)" - $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.xz/$(BUNDLE_NAME)/" - $(Q)cd "$(BUNDLES_DIR)/.xz" && tar --xz -c$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.xz" "$(BUNDLE_NAME)" - $(Q)rm -rf "$(BUNDLES_DIR)/.xz" - -bundle_lha: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).lha' - $(Q)mkdir -p "$(BUNDLES_DIR)/.lha/$(BUNDLE_NAME)" - $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.lha/$(BUNDLE_NAME)/" - $(Q)cd "$(BUNDLES_DIR)/.lha" && lha ao6 "$(BUNDLES_DIR)/$(BUNDLE_NAME).lha" "$(BUNDLE_NAME)" - $(Q)rm -rf "$(BUNDLES_DIR)/.lha" - -bundle_dmg: bundle - @echo '[BUNDLE] Creating $(BUNDLE_NAME).dmg' - $(Q)mkdir -p "$(BUNDLES_DIR)/OpenTTD $(VERSION)" - $(Q)cp -R "$(BUNDLE_DIR)/" "$(BUNDLES_DIR)/OpenTTD $(VERSION)" - $(Q)hdiutil create -ov -format UDZO -srcfolder "$(BUNDLES_DIR)/OpenTTD $(VERSION)" "$(BUNDLES_DIR)/$(BUNDLE_NAME).dmg" - $(Q)rm -fr "$(BUNDLES_DIR)/OpenTTD $(VERSION)" - -bundle_exe: all - @echo '[BUNDLE] Creating $(BUNDLE_NAME).exe' - $(Q)mkdir -p "$(BUNDLES_DIR)" - $(Q)unix2dos "$(ROOT_DIR)/docs/"* "$(ROOT_DIR)/README.md" "$(ROOT_DIR)/COPYING.md" "$(ROOT_DIR)/changelog.txt" "$(ROOT_DIR)/known-bugs.txt" - $(Q)cd $(ROOT_DIR)/os/windows/installer && makensis.exe //DVERSION_INCLUDE=version_$(PLATFORM).txt install.nsi - $(Q)mv $(ROOT_DIR)/os/windows/installer/*$(PLATFORM).exe "$(BUNDLES_DIR)/$(BUNDLE_NAME).exe" - -ifdef OSXAPP -install: - @echo '[INSTALL] Cannot install the OSX Application Bundle' -else -install: bundle - @echo '[INSTALL] Installing OpenTTD' - $(Q)install -d "$(INSTALL_BINARY_DIR)" - $(Q)install -d "$(INSTALL_ICON_DIR)" - $(Q)install -d "$(INSTALL_DATA_DIR)/ai" - $(Q)install -d "$(INSTALL_DATA_DIR)/game" - $(Q)install -d "$(INSTALL_DATA_DIR)/baseset" - $(Q)install -d "$(INSTALL_DATA_DIR)/lang" - $(Q)install -d "$(INSTALL_DATA_DIR)/scripts" -ifeq ($(TTD), openttd.exe) - $(Q)install -m 755 "$(BUNDLE_DIR)/$(TTD)" "$(INSTALL_BINARY_DIR)/${BINARY_NAME}.exe" -else - $(Q)install -m 755 "$(BUNDLE_DIR)/$(TTD)" "$(INSTALL_BINARY_DIR)/${BINARY_NAME}" -endif - $(Q)install -m 644 "$(BUNDLE_DIR)/lang/"* "$(INSTALL_DATA_DIR)/lang" - $(Q)install -m 644 "$(BUNDLE_DIR)/ai/"* "$(INSTALL_DATA_DIR)/ai" - $(Q)install -m 644 "$(BUNDLE_DIR)/game/"* "$(INSTALL_DATA_DIR)/game" - $(Q)install -m 644 "$(BUNDLE_DIR)/baseset/"* "$(INSTALL_DATA_DIR)/baseset" - $(Q)install -m 644 "$(BUNDLE_DIR)/scripts/"* "$(INSTALL_DATA_DIR)/scripts" -ifndef DO_NOT_INSTALL_DOCS - $(Q)install -d "$(INSTALL_DOC_DIR)" - $(Q)install -m 644 "$(BUNDLE_DIR)/docs/"* "$(BUNDLE_DIR)/README.md" "$(BUNDLE_DIR)/known-bugs.txt" "$(INSTALL_DOC_DIR)" -endif -ifndef DO_NOT_INSTALL_CHANGELOG - $(Q)install -d "$(INSTALL_DOC_DIR)" - $(Q)install -m 644 "$(BUNDLE_DIR)/changelog.txt" "$(INSTALL_DOC_DIR)" -endif -ifndef DO_NOT_INSTALL_LICENSE - $(Q)install -d "$(INSTALL_DOC_DIR)" - $(Q)install -m 644 "$(BUNDLE_DIR)/COPYING.md" "$(INSTALL_DOC_DIR)" -endif - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.32.xpm" "$(INSTALL_ICON_DIR)/${BINARY_NAME}.32.xpm" -ifdef ICON_THEME_DIR - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/16x16/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.16.png" "$(INSTALL_ICON_THEME_DIR)/16x16/apps/${BINARY_NAME}.png" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/32x32/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.32.png" "$(INSTALL_ICON_THEME_DIR)/32x32/apps/${BINARY_NAME}.png" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/48x48/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.48.png" "$(INSTALL_ICON_THEME_DIR)/48x48/apps/${BINARY_NAME}.png" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/64x64/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.64.png" "$(INSTALL_ICON_THEME_DIR)/64x64/apps/${BINARY_NAME}.png" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/128x128/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.128.png" "$(INSTALL_ICON_THEME_DIR)/128x128/apps/${BINARY_NAME}.png" - $(Q)install -d "$(INSTALL_ICON_THEME_DIR)/256x256/apps" - $(Q)install -m 644 "$(BUNDLE_DIR)/media/openttd.256.png" "$(INSTALL_ICON_THEME_DIR)/256x256/apps/${BINARY_NAME}.png" -else - $(Q)install -m 644 "$(BUNDLE_DIR)/media/"*.png "$(INSTALL_ICON_DIR)" -endif -ifdef MAN_DIR -ifndef DO_NOT_INSTALL_MAN - $(Q)install -d "$(INSTALL_MAN_DIR)" - $(Q)install -m 644 "$(BUNDLE_DIR)/man/openttd.6.gz" "$(INSTALL_MAN_DIR)/${BINARY_NAME}.6.gz" -endif -endif -ifdef MENU_DIR - $(Q)install -d "$(INSTALL_MENU_DIR)" - $(Q)install -m 644 "$(ROOT_DIR)/media/openttd.desktop.install" "$(INSTALL_MENU_DIR)/${BINARY_NAME}.desktop" -endif -endif # OSXAPP diff --git a/Makefile.grf.in b/Makefile.grf.in deleted file mode 100644 index be382d708d..0000000000 --- a/Makefile.grf.in +++ /dev/null @@ -1,116 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . -# -# Building requires GRFCodec. -# -# Recent versions (including sources) can be found at: -# http://www.openttd.org/download-grfcodec -# -# The mercurial repository can be found at: -# http://hg.openttdcoop.org/grfcodec -# - - -ROOT_DIR = !!ROOT_DIR!! -GRF_DIR = $(ROOT_DIR)/media/extra_grf -BASESET_DIR = $(ROOT_DIR)/media/baseset -LANG_DIR = $(ROOT_DIR)/src/lang -BIN_DIR = !!BIN_DIR!!/baseset -OBJS_DIR = !!GRF_OBJS_DIR!! -OS = !!OS!! -STAGE = !!STAGE!! - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = - E = @true -else - Q = @ - E = @echo -endif - -GRFCODEC := !!GRFCODEC!! -NFORENUM := !!NFORENUM!! -CC_BUILD := !!CC_BUILD!! -MD5SUM := $(shell [ "$(OS)" = "OSX" ] && echo "md5 -r" || echo "md5sum") - -# Some "should not be changed" settings. -NFO_FILES := $(GRF_DIR)/*.nfo $(GRF_DIR)/rivers/*.nfo -PNG_FILES := $(GRF_DIR)/*.png $(GRF_DIR)/rivers/*.png - -# List of target files. -OBT_FILES := $(BIN_DIR)/orig_dos.obg -OBT_FILES += $(BIN_DIR)/orig_dos_de.obg -OBT_FILES += $(BIN_DIR)/orig_win.obg -OBT_FILES += $(BIN_DIR)/orig_dos.obs -OBT_FILES += $(BIN_DIR)/orig_win.obs -OBT_FILES += $(BIN_DIR)/no_sound.obs -OBT_FILES += $(BIN_DIR)/orig_dos.obm -OBT_FILES += $(BIN_DIR)/orig_win.obm -OBT_FILES += $(BIN_DIR)/no_music.obm -OBT_FILES += $(BIN_DIR)/orig_tto.obm - -# Build the GRF. -all: $(OBT_FILES) -ifdef GRFCODEC -all: $(BIN_DIR)/openttd.grf $(BIN_DIR)/orig_extra.grf -endif - -$(OBJS_DIR)/langfiles.tmp: $(LANG_DIR)/*.txt - $(E) '$(STAGE) Collecting baseset translations' - $(Q) cat $^ > $@ - -$(BIN_DIR)/%.obg: $(BASESET_DIR)/%.obg $(BIN_DIR)/orig_extra.grf $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk - $(E) '$(STAGE) Updating $(notdir $@)' - $(Q) sed 's/^ORIG_EXTRA.GRF = *[0-9a-f]*$$/ORIG_EXTRA.GRF = '`$(MD5SUM) $(BIN_DIR)/orig_extra.grf | sed 's@ .*@@'`'/' $< > $@.tmp - $(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $@.tmp >$@ - $(Q) rm $@.tmp - -$(BIN_DIR)/%.obs: $(BASESET_DIR)/%.obs $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk - $(E) '$(STAGE) Updating $(notdir $@)' - $(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@ - -$(BIN_DIR)/%.obm: $(BASESET_DIR)/%.obm $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk - $(E) '$(STAGE) Updating $(notdir $@)' - $(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@ - -# Guard against trying to run GRFCODEC/NFORENUM without either being set. -ifdef GRFCODEC -ifdef NFORENUM - -# Compile extra grf -$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(GRF_DIR)/assemble_nfo.awk - $(E) '$(STAGE) Assembling openttd.nfo' - $(Q)-mkdir -p $(OBJS_DIR)/sprites - $(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null - $(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/openttd.nfo > $(OBJS_DIR)/sprites/openttd.nfo - $(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo - $(E) '$(STAGE) Compiling openttd.grf' - $(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf - $(Q)cp $(OBJS_DIR)/openttd.grf $(BIN_DIR)/openttd.grf - -# The copy operation of PNG_FILES is duplicated from the target 'openttd.grf', thus those targets may not run in parallel. -$(BIN_DIR)/orig_extra.grf: $(PNG_FILES) $(NFO_FILES) $(GRF_DIR)/assemble_nfo.awk | $(BIN_DIR)/openttd.grf - $(E) '$(STAGE) Assembling orig_extra.nfo' - $(Q)-mkdir -p $(OBJS_DIR)/sprites - $(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null - $(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/orig_extra.nfo > $(OBJS_DIR)/sprites/orig_extra.nfo - $(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/orig_extra.nfo - $(E) '$(STAGE) Compiling orig_extra.grf' - $(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/orig_extra.grf - $(Q)cp $(OBJS_DIR)/orig_extra.grf $(BIN_DIR)/orig_extra.grf - -endif -endif - -# Clean up temporary files. -clean: - $(Q)rm -f *.bak *.grf $(OBT_FILES) - -# Clean up temporary files -mrproper: clean - $(Q)rm -fr sprites - -.PHONY: all mrproper depend clean diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index 38d7f53294..0000000000 --- a/Makefile.in +++ /dev/null @@ -1,185 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = -else - Q = @ -endif - -include Makefile.am - -CONFIG_CACHE_PWD = !!CONFIG_CACHE_PWD!! -CONFIG_CACHE_SOURCE_LIST = !!CONFIG_CACHE_SOURCE_LIST!! -BIN_DIR = !!BIN_DIR!! -ICON_THEME_DIR = !!ICON_THEME_DIR!! -MAN_DIR = !!MAN_DIR!! -MENU_DIR = !!MENU_DIR!! -SRC_DIR = !!SRC_DIR!! -ROOT_DIR = !!ROOT_DIR!! -BUNDLE_DIR = "$(ROOT_DIR)/bundle" -BUNDLES_DIR = "$(ROOT_DIR)/bundles" -INSTALL_DIR = !!INSTALL_DIR!! -INSTALL_BINARY_DIR = "$(INSTALL_DIR)/"!!BINARY_DIR!! -INSTALL_MAN_DIR = "$(INSTALL_DIR)/$(MAN_DIR)" -INSTALL_MENU_DIR = "$(INSTALL_DIR)/$(MENU_DIR)" -INSTALL_ICON_DIR = "$(INSTALL_DIR)/"!!ICON_DIR!! -INSTALL_ICON_THEME_DIR = "$(INSTALL_DIR)/$(ICON_THEME_DIR)" -INSTALL_DATA_DIR = "$(INSTALL_DIR)/"!!DATA_DIR!! -INSTALL_DOC_DIR = "$(INSTALL_DIR)/"!!DOC_DIR!! -SOURCE_LIST = !!SOURCE_LIST!! -CONFIGURE_FILES = !!CONFIGURE_FILES!! -BINARY_NAME = !!BINARY_NAME!! -STRIP = !!STRIP!! -TTD = !!TTD!! -TTDS = $(SRC_DIRS:%=%/$(TTD)) -OS = !!OS!! -OSXAPP = !!OSXAPP!! -LIPO = !!LIPO!! -AWK = !!AWK!! -SORT = !!SORT!! -DISTCC = !!DISTCC!! - -RES := $(shell if [ ! -f $(CONFIG_CACHE_PWD) ] || [ "`pwd`" != "`cat $(CONFIG_CACHE_PWD)`" ]; then echo "`pwd`" > $(CONFIG_CACHE_PWD); fi ) -RES := $(shell if [ ! -f $(CONFIG_CACHE_SOURCE_LIST) ] || [ -n "`cmp $(CONFIG_CACHE_SOURCE_LIST) $(SOURCE_LIST) 2>/dev/null`" ]; then cp $(SOURCE_LIST) $(CONFIG_CACHE_SOURCE_LIST); fi ) - -all: config.pwd config.cache -ifdef DISTCC - @if [ -z "`echo '$(MFLAGS)' | grep '\-j'`" ]; then echo; echo "WARNING: you enabled distcc support, but you don't seem to be using the -jN parameter"; echo; fi -endif - @for dir in $(DIRS); do \ - $(MAKE) -C $$dir all || exit 1; \ - done -ifdef LIPO -# Lipo is an OSX thing. If it is defined, it means we are building for universal, -# and so we have have to combine the binaries into one big binary - -# Remove the last binary made by the last compiled target - $(Q)rm -f $(BIN_DIR)/$(TTD) -# Make all the binaries into one - $(Q)$(LIPO) -create -output $(BIN_DIR)/$(TTD) $(TTDS) -endif - -help: - @echo "Available make commands:" - @echo "" - @echo "Compilation:" - @echo " all compile the executable and the lang files" - @echo " lang compile the lang files only" - @echo "Clean up:" - @echo " clean remove the files generated during compilation" - @echo " mrproper remove the files generated during configuration and compilation" - @echo "Run after compilation:" - @echo " run execute openttd after the compilation" - @echo " run-gdb execute openttd in debug mode after the compilation" - @echo " run-prof execute openttd in profiling mode after the compilation" - @echo "Installation:" - @echo " install install the compiled files and the data-files after the compilation" - @echo " bundle create the base for an installation bundle" - @echo " bundle_zip create the zip installation bundle" - @echo " bundle_gzip create the gzip installation bundle" - @echo " bundle_bzip2 create the bzip2 installation bundle" - @echo " bundle_lha create the lha installation bundle" - @echo " bundle_dmg create the dmg installation bundle" - -config.pwd: $(CONFIG_CACHE_PWD) - $(MAKE) reconfigure - -config.cache: $(CONFIG_CACHE_SOURCE_LIST) $(CONFIGURE_FILES) - $(MAKE) reconfigure - -reconfigure: -ifeq ($(shell if test -f config.cache; then echo 1; fi), 1) - @echo "----------------" - @echo "The system detected that source.list or any configure file is altered." - @echo " Going to reconfigure with last known settings..." - @echo "----------------" -# Make sure we don't lock config.cache - @$(shell cat config.cache | sed 's@\\ @\\\\ @g') || exit 1 - @echo "----------------" - @echo "Reconfig done. Please re-execute make." - @echo "----------------" -else - @echo "----------------" - @echo "Have not found a configuration, please run configure first." - @echo "----------------" - @exit 1 -endif - -clean: - @for dir in $(DIRS); do \ - $(MAKE) -C $$dir clean; \ - done - $(Q)rm -rf $(BUNDLE_TARGET) - -lang: - @for dir in $(LANG_DIRS); do \ - $(MAKE) -C $$dir all; \ - done - -mrproper: - @for dir in $(DIRS); do \ - $(MAKE) -C $$dir mrproper; \ - done -# Don't be tempted to merge these two for loops. Doing that breaks make -# --dry-run, since make has this "feature" that it always runs commands -# containing $(MAKE), even when --dry-run is passed. The objective is of -# course to also get a dry-run of submakes, but make is not smart enough -# to see that a for loop runs both a submake and an actual command. - @for dir in $(DIRS); do \ - rm -f $$dir/Makefile; \ - done - $(Q)rm -rf objs - $(Q)rm -f Makefile Makefile.am Makefile.bundle - $(Q)rm -f media/openttd.desktop media/openttd.desktop.install - $(Q)rm -f $(CONFIG_CACHE_SOURCE_LIST) config.cache config.pwd config.log $(CONFIG_CACHE_PWD) -# directories for bundle generation - $(Q)rm -rf $(BUNDLE_DIR) - $(Q)rm -rf $(BUNDLES_DIR) -# output of profiling - $(Q)rm -f $(BIN_DIR)/gmon.out -# output of generating 'API' documentation - $(Q)rm -rf $(ROOT_DIR)/docs/source - $(Q)rm -rf $(ROOT_DIR)/docs/aidocs - $(Q)rm -rf $(ROOT_DIR)/docs/gamedocs -# directories created by OpenTTD on regression testing - $(Q)rm -rf $(BIN_DIR)/ai/regression/content_download $(BIN_DIR)/ai/regression/save $(BIN_DIR)/ai/regression/scenario -distclean: mrproper - -maintainer-clean: distclean - $(Q)rm -f $(BIN_DIR)/baseset/openttd.grf $(BIN_DIR)/baseset/orig_extra.grf $(BIN_DIR)/baseset/*.obg $(BIN_DIR)/baseset/*.obs $(BIN_DIR)/baseset/*.obm - -depend: - @for dir in $(SRC_DIRS); do \ - $(MAKE) -C $$dir depend; \ - done - -run: all - $(Q)cd !!BIN_DIR!! && ./!!TTD!! $(OPENTTD_ARGS) - -run-gdb: all - $(Q)cd !!BIN_DIR!! && gdb --ex run --args ./!!TTD!! $(OPENTTD_ARGS) - -run-prof: all - $(Q)cd !!BIN_DIR!! && ./!!TTD!! $(OPENTTD_ARGS) && gprof !!TTD!! | less - -regression: all - $(Q)cd !!BIN_DIR!! && sh ai/regression/run.sh -test: regression - -%.o: - @for dir in $(SRC_DIRS); do \ - $(MAKE) -C $$dir $(@:src/%=%); \ - done - -%.lng: - @for dir in $(LANG_DIRS); do \ - $(MAKE) -C $$dir $@; \ - done - -.PHONY: test distclean mrproper clean - -include Makefile.bundle diff --git a/Makefile.lang.in b/Makefile.lang.in deleted file mode 100644 index bce43b8466..0000000000 --- a/Makefile.lang.in +++ /dev/null @@ -1,87 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -STRGEN = !!STRGEN!! -SRC_DIR = !!SRC_DIR!! -LANG_DIR = !!LANG_DIR!! -BIN_DIR = !!BIN_DIR!! -LANGS_SRC = $(shell ls $(LANG_DIR)/*.txt) -LANGS = $(LANGS_SRC:$(LANG_DIR)/%.txt=%.lng) -CXX_BUILD = !!CXX_BUILD!! -CFLAGS_BUILD = !!CFLAGS_BUILD!! -CXXFLAGS_BUILD= !!CXXFLAGS_BUILD!! -LDFLAGS_BUILD = !!LDFLAGS_BUILD!! -STRGEN_FLAGS = !!STRGEN_FLAGS!! -STAGE = !!STAGE!! -LANG_SUPPRESS = !!LANG_SUPPRESS!! -LANG_OBJS_DIR = !!LANG_OBJS_DIR!! - -ifeq ($(LANG_SUPPRESS), yes) -LANG_ERRORS = >/dev/null 2>&1 -endif - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = - E = @true -else - Q = @ - E = @echo -endif - -RES := $(shell mkdir -p $(BIN_DIR)/lang ) - -all: table/strings.h $(LANGS) - -strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< - -strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< - -string.o: $(SRC_DIR)/string.cpp $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< - -alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< - -getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $< - -lang/english.txt: $(LANG_DIR)/english.txt - $(Q)mkdir -p lang - $(Q)cp $(LANG_DIR)/english.txt lang/english.txt - -$(STRGEN): alloc_func.o string.o strgen_base.o strgen.o getoptdata.o - $(E) '$(STAGE) Compiling and Linking $@' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@ - -table/strings.h: lang/english.txt $(STRGEN) - $(E) '$(STAGE) Generating $@' - @mkdir -p table - $(Q)./$(STRGEN) -s $(LANG_DIR) -d table - -$(LANGS): %.lng: $(LANG_DIR)/%.txt $(STRGEN) lang/english.txt - $(E) '$(STAGE) Compiling language $(*F)' - $(Q)./$(STRGEN) $(STRGEN_FLAGS) -s $(LANG_DIR) -d $(LANG_OBJS_DIR) $< $(LANG_ERRORS) && cp $@ $(BIN_DIR)/lang || true # Do not fail all languages when one fails - -depend: - -clean: - $(E) '$(STAGE) Cleaning up language files' - $(Q)rm -f strgen_base.o strgen.o string.o alloc_func.o getoptdata.o table/strings.h $(STRGEN) $(LANGS) $(LANGS:%=$(BIN_DIR)/lang/%) lang/english.* - -mrproper: clean - $(Q)rm -rf $(BIN_DIR)/lang - -%.lng: - @echo '$(STAGE) No such language: $(@:%.lng=%)' - -.PHONY: all mrproper depend clean diff --git a/Makefile.msvc b/Makefile.msvc deleted file mode 100644 index 8070062acf..0000000000 --- a/Makefile.msvc +++ /dev/null @@ -1,45 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# -# Makefile for creating bundles of MSVC's binaries in the same way as we make -# the zip bundles for ALL other OSes. -# -# Usage: make -f Makefile.msvc PLATFORM=[Win32|x64] BUNDLE_NAME=openttd--win[32|64] -# or make -f Makefile.msvc PLATFORM=[Win32|x64] BUNDLE_NAME=OTTD-win[32|64]-nightly- -# - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = -else - Q = @ -endif - -AWK = "awk" -ROOT_DIR := $(shell pwd) -BIN_DIR = "$(ROOT_DIR)/bin" -SRC_DIR = "$(ROOT_DIR)/src" -BUNDLE_DIR = "$(ROOT_DIR)/bundle" -BUNDLES_DIR = "$(ROOT_DIR)/bundles" -TTD = openttd.exe -PDB = openttd.pdb -MODE = Release -TARGET := $(shell echo $(PLATFORM) | sed "s@win64@x64@;s@win32@Win32@") - -all: - $(Q)cp objs/$(TARGET)/$(MODE)/$(TTD) $(BIN_DIR)/$(TTD) - -include Makefile.bundle.in - -bundle_pdb: - @echo '[BUNDLE] Creating $(BUNDLE_NAME).pdb.xz' - $(Q)mkdir -p "$(BUNDLES_DIR)" - $(Q)cp objs/$(TARGET)/Release/$(PDB) $(BUNDLES_DIR)/$(BUNDLE_NAME).pdb - $(Q)xz -9 $(BUNDLES_DIR)/$(BUNDLE_NAME).pdb - -regression: all - $(Q)cp bin/$(TTD) bin/openttd - $(Q)cd bin && sh ai/regression/run.sh diff --git a/Makefile.setting.in b/Makefile.setting.in deleted file mode 100644 index 987a882db1..0000000000 --- a/Makefile.setting.in +++ /dev/null @@ -1,63 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -SETTINGSGEN = !!SETTINGSGEN!! -SRC_DIR = !!SRC_DIR!! -CXX_BUILD = !!CXX_BUILD!! -CFLAGS_BUILD = !!CFLAGS_BUILD!! -CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!! -LDFLAGS_BUILD = !!LDFLAGS_BUILD!! -STAGE = !!STAGE!! -SETTING_OBJS_DIR = !!SETTING_OBJS_DIR!! - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = - E = @true -else - Q = @ - E = @echo -endif - -all: table/settings.h - -settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $(SRC_DIR)/strings_type.h $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/ini_type.h $(SRC_DIR)/core/smallvec_type.hpp $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< - -alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< - -getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< - -string.o: $(SRC_DIR)/string.cpp $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< - -ini_load.o: $(SRC_DIR)/ini_load.cpp $(SRC_DIR)/core/alloc_func.hpp $(SRC_DIR)/core/mem_func.hpp $(SRC_DIR)/ini_type.h $(SRC_DIR)/string_func.h $(SRC_DIR)/safeguards.h - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $< - -$(SETTINGSGEN): alloc_func.o string.o ini_load.o settingsgen.o getoptdata.o - $(E) '$(STAGE) Compiling and Linking $@' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@ - -table/settings.h: $(SETTINGSGEN) $(SRC_DIR)/table/settings.h.preamble $(SRC_DIR)/table/settings.h.postamble $(SRC_DIR)/table/*.ini - $(E) '$(STAGE) Generating $@' - @mkdir -p table - $(Q)./$(SETTINGSGEN) -o table/settings.h -b $(SRC_DIR)/table/settings.h.preamble -a $(SRC_DIR)/table/settings.h.postamble $(SRC_DIR)/table/*.ini - -depend: - -clean: - $(E) '$(STAGE) Cleaning up settings files' - $(Q)rm -f settingsgen.o alloc_func.o getoptdata.o string.o ini_load.o $(SETTINGSGEN) table/settings.h - -mrproper: clean - -.PHONY: all mrproper depend clean diff --git a/Makefile.src.in b/Makefile.src.in deleted file mode 100644 index 6b0fb94020..0000000000 --- a/Makefile.src.in +++ /dev/null @@ -1,295 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -CC_HOST = !!CC_HOST!! -CXX_HOST = !!CXX_HOST!! -CC_BUILD = !!CC_BUILD!! -CXX_BUILD = !!CXX_BUILD!! -WINDRES = !!WINDRES!! -STRIP = !!STRIP!! -CFLAGS = !!CFLAGS!! -CFLAGS_BUILD = !!CFLAGS_BUILD!! -CXXFLAGS = !!CXXFLAGS!! -CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!! -LIBS = !!LIBS!! -LDFLAGS = !!LDFLAGS!! -LDFLAGS_BUILD = !!LDFLAGS_BUILD!! -ROOT_DIR = !!ROOT_DIR!! -BIN_DIR = !!BIN_DIR!! -LANG_DIR = !!LANG_DIR!! -SRC_OBJS_DIR = !!SRC_OBJS_DIR!! -LANG_OBJS_DIR = !!LANG_OBJS_DIR!! -SETTING_OBJS_DIR= !!SETTING_OBJS_DIR!! -SRC_DIR = !!SRC_DIR!! -SCRIPT_SRC_DIR = !!SCRIPT_SRC_DIR!! -MEDIA_DIR = !!MEDIA_DIR!! -TTD = !!TTD!! -STRGEN = !!STRGEN!! -DEPEND = !!DEPEND!! -OS = !!OS!! -STAGE = !!STAGE!! -MAKEDEPEND = !!MAKEDEPEND!! -CFLAGS_MAKEDEP = !!CFLAGS_MAKEDEP!! -SORT = !!SORT!! -AWK = !!AWK!! -CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!! -CONFIG_CACHE_LINKER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!! -CONFIG_CACHE_SOURCE = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_SOURCE!! -CONFIG_CACHE_VERSION = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!! - -OBJS_C := !!OBJS_C!! -OBJS_CPP := !!OBJS_CPP!! -OBJS_MM := !!OBJS_MM!! -OBJS_RC := !!OBJS_RC!! -OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC) -SRCS := !!SRCS!! - -# All C-files depend on those 3 files -FILE_DEP := $(CONFIG_CACHE_COMPILER) -# Create all dirs and subdirs -RES := $(shell mkdir -p $(BIN_DIR) $(sort $(dir $(OBJS)))) - -CFLAGS += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR) -CFLAGS_MAKEDEP += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SETTING_OBJS_DIR) -ifdef SCRIPT_SRC_DIR - CFLAGS_MAKEDEP += -I $(SCRIPT_SRC_DIR) -endif - -# Check if we want to show what we are doing -ifdef VERBOSE - Q = - E = @true -else - Q = @ - E = @echo -endif - -# Our default target -all: $(BIN_DIR)/$(TTD) - -# This are 2 rules that are pointing back to STRGEN stuff. -# There is not really a need to have them here, but in case -# some weirdo wants to run 'make' in the 'src' dir and expects -# the languages to be recompiled, this catches that case and -# takes care of it nicely. -$(LANG_OBJS_DIR)/$(STRGEN): - $(MAKE) -C $(LANG_OBJS_DIR) $(STRGEN) - -$(LANG_OBJS_DIR)/table/strings.h: $(LANG_DIR)/english.txt $(LANG_OBJS_DIR)/$(STRGEN) - $(MAKE) -C $(LANG_OBJS_DIR) table/strings.h - -# Always run version detection, so we always have an accurate modified -# flag -VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh") -MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d' ') - -# Use autodetected revisions -VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') -ISODATE := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ') -GITHASH := $(shell echo "$(VERSIONS)" | cut -f 4 -d' ') -ISTAG := $(shell echo "$(VERSIONS)" | cut -f 5 -d' ') -ISSTABLETAG := $(shell echo "$(VERSIONS)" | cut -f 6 -d' ') -YEAR := $(shell echo "$(VERSIONS)" | cut -f 7 -d' ') - -# Make sure we have something in VERSION and ISODATE -ifeq ($(VERSION),) -VERSION := norev000 -endif -ifeq ($(ISODATE),) -ISODATE := 00000000 -endif - -# This helps to recompile if flags change -RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CFLAGS) $(CXXFLAGS)" ]; then echo "$(CFLAGS) $(CXXFLAGS)" > $(CONFIG_CACHE_COMPILER); fi ) -RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi ) - -# If there is a change in the source-file-list, make sure we recheck the deps -RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi ) -# If there is a change in the revision, make sure we recompile rev.cpp -RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(VERSION) $(MODIFIED)" ]; then echo "$(VERSION) $(MODIFIED)" > $(CONFIG_CACHE_VERSION); fi ) - -ifndef MAKEDEPEND -# The slow, but always correct, dep-check -DEP_MASK := %.d -DEPS := $(OBJS:%.o=%.d) - -# Only include the deps if we are compiling everything -ifeq ($(filter %.o clean mrproper, $(MAKECMDGOALS)),) --include $(DEPS) -else -# In case we want to compile a single target, include the .d file for it -ifneq ($(filter %.o, $(MAKECMDGOALS)),) -SINGLE_DEP := $(filter %.o, $(MAKECMDGOALS)) --include $(SINGLE_DEP:%.o=%.d) -endif -endif - -# Find the deps via GCC. Rarely wrong, but a bit slow - -$(OBJS_C:%.o=%.d): %.d: $(SRC_DIR)/%.c $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.c=%.c)' - $(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@ - -$(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@ - -$(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@ - -$(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.rc=%.rc)' - $(Q)touch $@ - -else -# The much faster, but can be wrong, dep-check -DEP_MASK := -DEPS := Makefile.dep - -# Only include the deps if we are not cleaning -ifeq ($(filter depend clean mrproper, $(MAKECMDGOALS)),) --include Makefile.dep -endif - -ifeq ("$(SRC_OBJS_DIR)/$(DEPEND)","$(MAKEDEPEND)") -DEP := $(MAKEDEPEND) -$(SRC_OBJS_DIR)/$(DEPEND): $(SRC_DIR)/depend/depend.cpp - $(E) '$(STAGE) Compiling and linking $(DEPEND)' - $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) -o $@ $< -endif - -# Macro for invoking a command on groups of 100 words at a time -# (analogous to xargs(1)). The macro invokes itself recursively -# until the list of words is depleted. -# -# Usage: $(call xargs,COMMAND,LIST) -# -# COMMAND should be a shell command to which the words will be -# appended as arguments in groups of 100. -define xargs -$(1) $(wordlist 1,100,$(2)) -$(if $(word 101,$(2)),$(call xargs,$(1),$(wordlist 101,$(words $(2)),$(2)))) -endef - -# Make sure that only 'make depend' ALWAYS triggers a recheck -ifeq ($(filter depend, $(MAKECMDGOALS)),) -Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(CONFIG_CACHE_SOURCE) $(DEP) -else -Makefile.dep: $(FILE_DEP) $(SRCS:%=$(SRC_DIR)/%) $(DEP) FORCE -endif - $(E) '$(STAGE) DEP CHECK (all files)' - $(Q)rm -f Makefile.dep.tmp - $(Q)touch Makefile.dep.tmp - -# Calculate the deps via makedepend - $(call xargs,$(Q)$(MAKEDEPEND) -f$(SRC_OBJS_DIR)/Makefile.dep.tmp -o.o -Y -v -a -- $(CFLAGS_MAKEDEP) -- 2>/dev/null,$(SRCS:%=$(SRC_DIR)/%)) - -# Remove all comments and includes that don't start with $(SRC_DIR) -# Remove $(SRC_DIR) from object-file-name - @$(AWK) ' \ - /^# DO NOT/ { print $$0 ; next} \ - /^#/ {next} \ - /: / { \ - left = NF - 1; \ - for (n = 2; n <= NF; n++) { \ - if (match($$n, "^$(ROOT_DIR)") == 0) { \ - $$n = ""; \ - left--; \ - } \ - } \ - gsub("$(SRC_DIR)/", "", $$1); \ - if (left > 0) { \ - print $$0; \ - $$1 = "Makefile.dep:"; \ - print $$0; \ - } \ - next \ - } \ - { \ - print $$0 \ - } \ - ' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | LC_ALL=C $(SORT) > Makefile.dep - - $(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak - -endif - -# Avoid problems with deps if a .h/.hpp/.hpp.sq file is deleted without the deps -# being updated. Now the Makefile continues, the deps are recreated -# and all will be fine. -%.h %.hpp %.hpp.sq: - @true - - -# Compile all the files according to the targets - -$(OBJS_C): %.o: $(SRC_DIR)/%.c $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)' - $(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $< - -$(filter-out %sse2.o, $(filter-out %ssse3.o, $(filter-out %sse4.o, $(OBJS_CPP)))): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -o $@ $< - -$(filter %sse2.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse2 -o $@ $< - -$(filter %ssse3.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -mssse3 -o $@ $< - -$(filter %sse4.o, $(OBJS_CPP)): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -msse4.1 -o $@ $< - -$(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)' - $(Q)$(CXX_HOST) $(CFLAGS) $(CXXFLAGS) -c -o $@ $< - -$(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP) - $(E) '$(STAGE) Compiling resource $(<:$(SRC_DIR)/%.rc=%.rc)' - $(Q)$(WINDRES) -o $@ $< - -$(BIN_DIR)/$(TTD): $(TTD) - $(Q)cp $(TTD) $(BIN_DIR)/$(TTD) -ifeq ($(OS), UNIX) - $(Q)cp $(MEDIA_DIR)/openttd.32.bmp $(BIN_DIR)/baseset/ -endif -ifeq ($(OS), OSX) - $(Q)cp $(ROOT_DIR)/os/macosx/splash.png $(BIN_DIR)/baseset/ -endif - -$(TTD): $(OBJS) $(CONFIG_CACHE_LINKER) - $(E) '$(STAGE) Linking $@' - $(Q)+$(CXX_HOST) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ -ifdef STRIP - $(Q)$(STRIP) $@ -endif - -# Revision files - -$(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in - $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g;s@!!YEAR!!@$(YEAR)@g" > $(SRC_DIR)/rev.cpp - -$(SRC_DIR)/os/windows/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/os/windows/ottdres.rc.in - $(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g;s@!!YEAR!!@$(YEAR)@g" > $(SRC_DIR)/os/windows/ottdres.rc - -FORCE: - -depend: $(DEPS) - -clean: - $(E) '$(STAGE) Cleaning up object files' - $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(DEPEND) $(TTD:%=$(BIN_DIR)/%) $(BIN_DIR)/baseset/openttd.32.bmp $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_SOURCE) - -mrproper: clean - $(Q)rm -f $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc - -%.o: - @echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|mm|rc]' - -.PHONY: all mrproper depend clean FORCE diff --git a/config.lib b/config.lib deleted file mode 100644 index 304b86e485..0000000000 --- a/config.lib +++ /dev/null @@ -1,3508 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -log() { - if [ $1 = "1" ]; then - shift - echo "$@" - else - shift - fi - echo "$@" >> $config_log -} - -set_default() { - ignore_extra_parameters="0" - # We set all kinds of defaults for params. Later on the user can override - # most of them; but if they don't, this default is used. - build="" - host="" - cc_build="" - cc_host="" - cxx_build="" - cxx_host="" - windres="" - strip="" - lipo="" - awk="awk" - pkg_config="pkg-config" - os="DETECT" - cpu_type="DETECT" - config_log="config.log" - prefix_dir="/usr/local" - binary_dir="games" - data_dir="share/games/openttd" - doc_dir="1" - icon_dir="share/pixmaps" - icon_theme_dir="1" - personal_dir="1" - shared_dir="1" - install_dir="/" - man_dir="1" - menu_dir="1" - menu_group="Game;" - menu_name="OpenTTD" - binary_name="openttd" - enable_debug="0" - enable_desync_debug="0" - enable_profiling="0" - enable_lto="0" - enable_dedicated="0" - enable_static="1" - enable_translator="0" - enable_unicode="1" - enable_console="1"; - enable_assert="1" - enable_strip="0" - enable_universal="0" - enable_osx_g5="0" - enable_cocoa_quartz="1" - with_osx_sysroot="1" - with_application_bundle="1" - with_menu_entry="1" - with_allegro="1" - with_sdl="1" - with_cocoa="1" - with_zlib="1" - with_lzma="1" - with_lzo2="1" - with_xdg_basedir="1" - with_png="1" - enable_builtin_depend="1" - with_makedepend="0" - with_direct_music="1" - with_xaudio2="1" - with_sort="1" - with_iconv="1" - with_midi="" - with_midi_arg="" - with_fluidsynth="1" - with_freetype="1" - with_fontconfig="1" - with_icu_layout="1" - with_icu_sort="1" - static_icu="0" - with_uniscribe="1" - with_threads="1" - with_distcc="1" - with_ccache="1" - with_nforenum="1" - with_grfcodec="1" - with_sse="1" - - save_params_array=" - build - host - cc_build - cc_host - cxx_build - cxx_host - windres - strip - lipo - awk - pkg_config - os - cpu_type - config_log - prefix_dir - binary_dir - data_dir - doc_dir - icon_dir - icon_theme_dir - man_dir - menu_dir - personal_dir - shared_dir - install_dir - menu_group - menu_name - binary_name - enable_debug - enable_desync_debug - enable_profiling - enable_lto - enable_dedicated - enable_static - enable_translator - enable_unicode - enable_console - enable_assert - enable_strip - enable_universal - enable_osx_g5 - enable_cocoa_quartz - with_osx_sysroot - with_application_bundle - with_allegro - with_sdl - with_cocoa - with_zlib - with_lzma - with_lzo2 - with_xdg_basedir - with_png - enable_builtin_depend - with_makedepend - with_direct_music - with_xaudio2 - with_sort - with_iconv - with_midi - with_midi_arg - with_fluidsynth - with_freetype - with_fontconfig - with_icu_layout - with_icu_sort - static_icu - with_uniscribe - with_threads - with_distcc - with_ccache - with_grfcodec - with_nforenum - with_sse - CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD PKG_CONFIG_PATH PKG_CONFIG_LIBDIR" -} - -detect_params() { - # Walk over all params from the user and override any default settings if - # needed. This also handles any invalid option. - for p in "$@"; do - if [ -n "$prev_p" ]; then - eval "$prev_p=\$p" - prev_p= - continue - fi - - optarg=`expr "x$p" : 'x[^=]*=\(.*\)'` - - case "$p" in - --help | -h | -\?) showhelp; exit 0;; - - --config-log) prev_p="config_log";; - --config-log=*) config_log="$optarg";; - - --build) prev_p="build";; - --build=*) build="$optarg";; - - --host) prev_p="host";; - --host=*) host="$optarg";; - - --os) prev_p="os";; - --os=*) os="$optarg";; - - --cpu-type) prev_p="cpu_type";; - --cpu-type=*) cpu_type="$optarg";; - - --cc-build) prev_p="cc_build";; - --cc-build=*) cc_build="$optarg";; - --cc-host) prev_p="cc_host";; - --cc-host=*) cc_host="$optarg";; - --cxx-build) prev_p="cxx_build";; - --cxx-build=*) cxx_build="$optarg";; - --cxx-host) prev_p="cxx_host";; - --cxx-host=*) cxx_host="$optarg";; - --windres) prev_p="windres";; - --windres=*) windres="$optarg";; - --awk) prev_p="awk";; - --awk=*) awk="$optarg";; - --pkg-config) prev_p="pkg_config";; - --pkg-config=*) pkg_config="$optarg";; - --strip) prev_p="strip";; - --strip=*) strip="$optarg";; - --lipo) prev_p="lipo";; - --lipo=*) lipo="$optarg";; - - - - # Alias --prefix with --prefix-dir, for compatibility with GNU autotools - --prefix-dir | --prefix) prev_p="prefix_dir";; - --prefix-dir=* | --prefix=*) prefix_dir="$optarg";; - - --binary-dir) prev_p="binary_dir";; - --binary-dir=*) binary_dir="$optarg";; - - --data-dir) prev_p="data_dir";; - --data-dir=*) data_dir="$optarg";; - - --doc-dir) prev_p="doc_dir";; - --doc-dir=*) doc_dir="$optarg";; - - --icon-dir) prev_p="icon_dir";; - --icon-dir=*) icon_dir="$optarg";; - - --icon-theme-dir) prev_p="icon_theme_dir";; - --icon-theme-dir=*) icon_theme_dir="$optarg";; - --without-icon-theme) icon_theme_dir="";; - - --menu-dir) prev_p="menu_dir";; - --menu-dir=*) menu_dir="$optarg";; - --without-menu-entry) menu_dir="";; - - --menu-name) prev_p="menu_name";; - --menu-name=*) menu_name="$optarg";; - - --binary-name) prev_p="binary_name";; - --binary-name=*) binary_name="$optarg";; - - --man-dir) prev_p="man_dir";; - --man-dir=*) man_dir="$optarg";; - - --personal-dir) prev_p="personal_dir";; - --personal-dir=*) personal_dir="$optarg";; - --without-personal-dir) personal_dir="";; - - --shared-dir) prev_p="shared_dir";; - --shared-dir=*) shared_dir="$optarg";; - --without-shared-dir) shared_dir="";; - - --install-dir) prev_p="install_dir";; - --install-dir=*) install_dir="$optarg";; - - - - --menu-group) prev_p="menu_group";; - --menu-group=*) menu_group="$optarg";; - - - - --enable-debug) enable_debug="1";; - --enable-debug=*) enable_debug="$optarg";; - --enable-desync-debug) enable_desync_debug="1";; - --enable-desync-debug=*) enable_desync_debug="$optarg";; - --enable-profiling) enable_profiling="1";; - --enable-profiling=*) enable_profiling="$optarg";; - --enable-lto) enable_lto="1";; - --enable-lto=*) enable_lto="$optarg";; - --enable-ipo) enable_lto="1";; - --enable-ipo=*) enable_lto="$optarg";; - --enable-dedicated) enable_dedicated="1";; - --enable-dedicated=*) enable_dedicated="$optarg";; - --disable-static) enable_static="0";; - --enable-static) enable_static="2";; - --enable-static=*) enable_static="$optarg";; - --disable-translator) enable_translator="0";; - --enable-translator) enable_translator="2";; - --enable-translator=*) enable_translator="$optarg";; - --disable-assert) enable_assert="0";; - --enable-assert) enable_assert="2";; - --enable-assert=*) enable_assert="$optarg";; - --disable-strip) enable_strip="0";; - --enable-strip) enable_strip="2";; - --enable-strip=*) enable_strip="$optarg";; - --disable-universal) enable_universal="0";; - --enable-universal) enable_universal="i386 ppc";; - --enable-universal=*) enable_universal="$optarg";; - --disable-osx-g5) enable_osx_g5="0";; - --enable-osx-g5) enable_osx_g5="2";; - --enable-osx-g5=*) enable_osx_g5="$optarg";; - --disable-unicode) enable_unicode="0";; - --enable-unicode) enable_unicode="2";; - --enable-unicode=*) enable_unicode="$optarg";; - --disable-console) enable_console="0";; - --enable-console) enable_console="2";; - --enable-console=*) enable_console="$optarg";; - - --disable-cocoa-quartz) enable_cocoa_quartz="0";; - --enable-cocoa-quartz) enable_cocoa_quartz="2";; - --enable-cocoa-quartz=*) enable_cocoa_quartz="$optarg";; - - --with-allegro) with_allegro="2";; - --without-allegro) with_allegro="0";; - --with-allegro=*) with_allegro="$optarg";; - - --with-sdl) with_sdl="2";; - --without-sdl) with_sdl="0";; - --with-sdl=*) with_sdl="$optarg";; - - --with-cocoa) with_cocoa="2";; - --without-cocoa) with_cocoa="0";; - --with-cocoa=*) with_cocoa="$optarg";; - - --with-zlib) with_zlib="2";; - --without-zlib) with_zlib="0";; - --with-zlib=*) with_zlib="$optarg";; - - --with-lzma) with_lzma="2";; - --without-lzma) with_lzma="0";; - --with-lzma=*) with_lzma="$optarg";; - --with-liblzma) with_lzma="2";; - --without-liblzma) with_lzma="0";; - --with-liblzma=*) with_lzma="$optarg";; - - --with-lzo2) with_lzo2="2";; - --without-lzo2) with_lzo2="0";; - --with-lzo2=*) with_lzo2="$optarg";; - --with-liblzo2) with_lzo2="2";; - --without-liblzo2) with_lzo2="0";; - --with-liblzo2=*) with_lzo2="$optarg";; - - --with-xdg-basedir) with_xdg_basedir="2";; - --without-xdg-basedir) with_xdg_basedir="0";; - --with-xdg-basedir=*) with_xdg_basedir="$optarg";; - --with-libxdg-basedir) with_xdg_basedir="2";; - --without-libxdg-basedir) with_xdg_basedir="0";; - --with-libxdg-basedir=*) with_xdg_basedir="$optarg";; - - --with-png) with_png="2";; - --without-png) with_png="0";; - --with-png=*) with_png="$optarg";; - --with-libpng) with_png="2";; - --without-libpng) with_png="0";; - --with-libpng=*) with_png="$optarg";; - - --with-fluidsynth) with_fluidsynth="2";; - --without-fluidsynth) with_fluidsynth="0";; - --with-fluidsynth=*) with_fluidsynth="$optarg";; - - --with-freetype) with_freetype="2";; - --without-freetype) with_freetype="0";; - --with-freetype=*) with_freetype="$optarg";; - --with-libfreetype) with_freetype="2";; - --without-libfreetype) with_freetype="0";; - --with-libfreetype=*) with_freetype="$optarg";; - - --with-fontconfig) with_fontconfig="2";; - --without-fontconfig) with_fontconfig="0";; - --with-fontconfig=*) with_fontconfig="$optarg";; - --with-libfontconfig) with_fontconfig="2";; - --without-libfontconfig) with_fontconfig="0";; - --with-libfontconfig=*) with_fontconfig="$optarg";; - - --with-icu) with_icu_layout="2";with_icu_sort="2";; - --without-icu) with_icu_layout="0";with_icu_sort="0";; - --with-icu=*) with_icu_layout="$optarg";with_icu_sort="$optarg";; - --with-libicu) with_icu_layout="2";with_icu_sort="2";; - --without-libicu) with_icu_layout="0";with_icu_sort="0";; - --with-libicu=*) with_icu_layout="$optarg";with_icu_sort="$optarg";; - --with-icu-layout) with_icu_layout="2";; - --without-icu-layout) with_icu_layout="0";; - --with-icu-layout=*) with_icu_layout="$optarg";; - --with-icu-sort) with_icu_sort="2";; - --without-icu-sort) with_icu_sort="0";; - --with-icu-sort=*) with_icu_sort="$optarg";; - --static-icu) static_icu="1";; - --static-icu=*) static_icu="$optarg";; - --static-libicu) static_icu="1";; - --static-libicu=*) static_icu="$optarg";; - - --with-uniscribe) with_uniscribe="2";; - --without-uniscribe) with_uniscribe="0";; - --with-uniscribe=*) with_uniscribe="$optarg";; - - --disable-builtin-depend) enable_builtin_depend="0";; - --enable-builtin-depend) enable_builtin_depend="2";; - --enable-builtin-depend=*) enable_builtin_depend="$optarg";; - - --with-makedepend) with_makedepend="2";; - --without-makedepend) with_makedepend="0";; - --with-makedepend=*) with_makedepend="$optarg";; - - --with-direct-music) with_direct_music="2";; - --without-direct-music) with_direct_music="0";; - --with-direct-music=*) with_direct_music="$optarg";; - - --with-xaudio2) with_xaudio2="2";; - --without-xaudio2) with_xaudio2="0";; - --with-xaudio2=*) with_xaudio2="$optarg";; - - --with-sort) with_sort="2";; - --without-sort) with_sort="0";; - --with-sort=*) with_sort="$optarg";; - - --with-iconv) with_iconv="2";; - --without-iconv) with_iconv="0";; - --with-iconv=*) with_iconv="$optarg";; - - --with-midi=*) with_midi="$optarg";; - --with-midi-arg=*) with_midi_arg="$optarg";; - - --without-distcc) with_distcc="0";; - --with-distcc) with_distcc="2";; - --with-distcc=*) with_distcc="$optarg";; - - --without-ccache) with_ccache="0";; - --with-ccache) with_ccache="2";; - --with-ccache=*) with_ccache="$optarg";; - - --without-nforenum) with_nforenum="0";; - --with-nforenum) with_nforenum="2";; - --with-nforenum=*) with_nforenum="$optarg";; - - --without-grfcodec) with_grfcodec="0";; - --with-grfcodec) with_grfcodec="2";; - --with-grfcodec=*) with_grfcodec="$optarg";; - - --without-osx-sysroot) with_osx_sysroot="0";; - --with-osx-sysroot) with_osx_sysroot="2";; - --with-osx-sysroot=*) with_osx_sysroot="$optarg";; - - --without-application-bundle) with_application_bundle="0";; - --with-application-bundle) with_application_bundle="1";; - --with-application-bundle=*) with_application_bundle="$optarg";; - - --without-threads) with_threads="0";; - --with-threads) with_threads="1";; - --with-threads=*) with_threads="$optarg";; - - --without-sse) with_sse="0";; - --with-sse) with_sse="1";; - --with-sse=*) with_sse="$optarg";; - - CC=* | --CC=*) CC="$optarg";; - CXX=* | --CXX=*) CXX="$optarg";; - CFLAGS=* | --CFLAGS=*) CFLAGS="$optarg";; - CXXFLAGS=* | --CXXFLAGS=*) CXXFLAGS="$optarg";; - LDFLAGS=* | --LDFLAGS=*) LDFLAGS="$optarg";; - CFLAGS_BUILD=* | --CFLAGS_BUILD=* | --CFLAGS-BUILD=*) CFLAGS_BUILD="$optarg";; - CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=* | --CXXFLAGS-BUILD=*) CXXFLAGS_BUILD="$optarg";; - LDFLAGS_BUILD=* | --LDFLAGS_BUILD=* | --LDFLAGS-BUILD=*) LDFLAGS_BUILD="$optarg";; - PKG_CONFIG_PATH=* | --PKG_CONFIG_PATH=* | --PKG-CONFIG-PATH=*) PKG_CONFIG_PATH="$optarg";; - PKG_CONFIG_LIBDIR=* | --PKG_CONFIG_LIBDIR=* | --PKG-CONFIG-LIBDIR=*) PKG_CONFIG_LIBDIR="$optarg";; - - --ignore-extra-parameters) ignore_extra_parameters="1";; - - --* | -*) - if [ "$ignore_extra_parameters" = "0" ]; then - log 1 "Unknown option $p" - exit 1 - else - log 1 "Unknown option $p ignored" - fi - ;; - esac - done - - if [ -n "$prev_p" ]; then - log 1 "configure: error: missing argument to --$prev_p" - exit 1 - fi - - # Clean the logfile - echo "" > $config_log - log 2 "Invocation: $0 $*" -} - -save_params() { - # Here we save all params, so we can later on do an exact redo of this - # configuration, without having the user to re-input stuff - - echo "Running configure with following options:" >> $config_log - echo "" >> $config_log - - configure="$CONFIGURE_EXECUTABLE --ignore-extra-parameters" - for p in $save_params_array; do - eval "v=\"\$$p\"" - p=`echo "$p" | sed 's@_@-@g;s@\n@@g;s@ @\\ @g'` - # Only save those params that aren't empty - configure="$configure --$p=\"$v\"" - done - - echo "$configure" >> $config_log - echo "$configure" > config.cache - echo "" >> $config_log -} - -# Export a variable so tools like pkg-config can see it when invoked. -# If the variable contains an empty string then unset it. -# $1 - name of the variable to export or unset -export_or_unset() { - eval local value=\$$1 - if [ -n "$value" ]; then - export $1; - log 2 "using $1=$value"; - else - unset $1; - log 2 "not using $1"; - fi -} - -check_params() { - # Some params want to be in full uppercase, else they might not work as - # expected.. fix that here - - os=`echo $os | tr '[a-z]' '[A-Z]'` - cpu_type=`echo $cpu_type | tr '[a-z]' '[A-Z]'` - - # Export some variables to be used by pkg-config - # - # PKG_CONFIG_LIBDIR variable mustn't be set if we are not willing to - # override the default pkg-config search path, it mustn't be an empty - # string. If the variable is empty (e.g. when an empty string comes - # from config.cache) then unset it. This way the "don't override" state - # will be properly preserved when (re)configuring. - export_or_unset PKG_CONFIG_PATH - export_or_unset PKG_CONFIG_LIBDIR - - # Check if all params have valid values - - # OS only allows DETECT, UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HAIKU, SUNOS, CYGWIN, MINGW, and OS2 - if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|HAIKU|SUNOS|CYGWIN|MINGW|OS2)$'`" ]; then - log 1 "configure: error: invalid option --os=$os" - log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|HAIKU|SUNOS|CYGWIN|MINGW|OS2]" - exit 1 - fi - # cpu_type can be either 32 or 64 - if [ -z "`echo $cpu_type | egrep '^(32|64|DETECT)$'`" ]; then - log 1 "configure: error: invalid option --cpu-type=$cpu_type" - log 1 " Available options are: --cpu-type[=DETECT|32|64]" - exit 1 - fi - # enable_debug should be between 0 and 4 - if [ -z "`echo $enable_debug | egrep '^[0123]$'`" ]; then - log 1 "configure: error: invalid option --enable-debug=$enable_debug" - log 1 " Available options are: --enable-debug[=0123]" - exit 1 - fi - - # enable_desync_debug should be between 0 and 3 - if [ -z "`echo $enable_desync_debug | egrep '^[012]$'`" ]; then - log 1 "configure: error: invalid option --enable-desync-debug=$enable_desync_debug" - log 1 " Available options are: --enable-desync-debug[=012]" - exit 1 - fi - - detect_awk - - detect_os - - check_build - check_host - - # Check for universal builds; they only make sense for OSX, so fail if enabled for another OS - if [ "$enable_universal" = "0" ]; then - log 1 "checking universal build... no" - else - if [ "$os" != "OSX" ]; then - log 1 "configure: error: --enable-universal only works on OSX" - exit 1 - fi - log 1 "checking universal build... yes, for: $enable_universal" - fi - - # Already detected by check_build - log 1 "checking build cc... $cc_build" - log 1 "checking host cc... $cc_host" - - check_cxx_build - check_cxx_host - check_windres - if [ "$enable_strip" != "0" ]; then - check_strip - else - log 1 "checking strip... disabled" - fi - check_lipo - - if [ "$enable_builtin_depend" != "0" ]; then - log 1 "checking builtin depend... yes" - makedepend="\$(SRC_OBJS_DIR)/\$(DEPEND)" - else - log 1 "checking builtin depend... no" - fi - - check_makedepend - detect_cputype - detect_sse_capable_architecture - - if [ "$enable_static" = "1" ]; then - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - enable_static="2" - else - enable_static="0" - fi - fi - - if [ "$enable_static" != "0" ]; then - log 1 "checking static... yes" - - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "OSX" ]; then - log 1 "WARNING: static is only known to work on Windows, and MacOSX" - log 1 "WARNING: use static at your own risk on this platform" - - sleep 5 - fi - else - log 1 "checking static... no" - fi - - if [ "$enable_unicode" = "1" ]; then - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - enable_unicode="2" - else - enable_unicode="0" - fi - fi - - if [ "$enable_unicode" != "0" ]; then - log 1 "checking unicode... yes" - else - log 1 "checking unicode... no" - fi - - # Show what we configured - if [ "$enable_debug" = "0" ]; then - log 1 "using debug level... no" - elif [ "$enable_profiling" != "0" ]; then - log 1 "using debug level... profiling (debug level $enable_debug)" - else - log 1 "using debug level... level $enable_debug" - fi - - if [ "$enable_desync_debug" = "0" ]; then - log 1 "using desync debug level... no" - else - log 1 "using desync debug level... level $enable_desync_debug" - log 1 "WARNING: desync debug functions slow down the game considerably." - log 1 "WARNING: use only when you are instructed to do so" - log 1 " or when you know what you are doing." - - sleep 5 - fi - - if [ "$enable_lto" != "0" ]; then - # GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}' - has_lto=`($cxx_build -dumpspecs 2>&1 | grep '\%{flto') || ($cxx_build -help ipo 2>&1 | grep '\-ipo')` - if [ -n "$has_lto" ]; then - log 1 "using link time optimization... yes" - else - enable_lto="0" - log 1 "using link time optimization... no" - log 1 "WARNING: you selected link time optimization but it is not found." - sleep 5 - fi - else - log 1 "using link time optimization... no" - fi - - - if [ "$os" != "OSX" ] && [ "$with_osx_sysroot" != "0" ]; then - if [ "$with_osx_sysroot" = "1" ]; then - with_osx_sysroot="0" - - log 1 "checking OSX sysroot... not OSX, skipping" - else - log 1 "configure: error: --with-osx-sysroot only works if OSX is the target" - exit 1 - fi - fi - - if [ "$with_osx_sysroot" != "0" ]; then - if [ "$enable_universal" = "0" ] && [ "$with_osx_sysroot" != "1" ] && [ "$with_osx_sysroot" != "2" ]; then - # Sysroot manually specified? Check for usability - log 1 "checking OSX sysroot... $with_osx_sysroot" - if ! check_osx_sdk "$with_osx_sysroot"; then - log 1 "Passed sysroot not found/not functional" - exit 1 - fi - else - # If autodetect and no universal, use system default - if [ "$with_osx_sysroot" = "1" ] && [ "$enable_universal" = "0" ]; then - log 1 "checking OSX sysroot... no (use system default)" - else - log 1 "checking OSX sysroot... automatically" - detect_osx_sdk - fi - fi - - if [ -n "$osx_sdk_path" ]; then - if [ "$enable_universal" != "0" ]; then - if [ -z "$osx_sdk_104_path" ]; then - log 1 "WARNING: Could not find a usable 10.4u SDK, the resulting" - log 1 "WARNING: binary will only run on OSX 10.5 or later" - osx_sdk_104_path="$osx_sdk_path" - fi - OSX_SYSROOT="-isysroot $osx_sdk_104_path" - OSX_LD_SYSROOT="-Wl,-syslibroot,$osx_sdk_104_path" - else - OSX_SYSROOT="-isysroot $osx_sdk_path" - OSX_LD_SYSROOT="-Wl,-syslibroot,$osx_sdk_path" - fi - fi - else - if [ "$os" = "OSX" ]; then - log 1 "checking OSX sysroot... no (use system default)" - fi - fi - - detect_allegro - detect_sdl - detect_cocoa - - if [ "$enable_dedicated" != "0" ]; then - log 1 "checking GDI video driver... dedicated server, skipping" - log 1 "checking dedicated... found" - else - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - log 1 "checking GDI video driver... found" - else - log 1 "checking GDI video driver... not Windows, skipping" - fi - - if [ -z "$allegro_config" ] && [ -z "$sdl2_config" ] && [ -z "$sdl_config" ] && [ "$with_cocoa" = 0 ] && [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - log 1 "configure: error: no video driver development files found" - log 1 " If you want a dedicated server use --enable-dedicated as parameter" - exit 1 - else - log 1 "checking dedicated... not selected" - fi - fi - - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - log 1 "checking console application... not Windows, skipping" - elif [ "$enable_console" = "1" ] && [ "$enable_dedicated" != "0" ]; then - log 1 "checking console application... dedicated server, enabled" - enable_console="2" - elif [ "$enable_console" = "1" ]; then - log 1 "checking console application... disabled (only used when forced)" - enable_console="0" - elif [ "$enable_console" = "0" ]; then - log 1 "checking console application... disabled" - else - log 1 "checking console application... enabled" - fi - - log 1 "checking squirrel... found" - SCRIPT_SRC_DIR="$ROOT_DIR/src/3rdparty/squirrel/include" - - if [ "$enable_translator" != "0" ]; then - log 1 "checking translator... debug" - # -t shows TODO items, normally they are muted - strgen_flags="-t" - else - log 1 "checking translator... no" - strgen_flags="" - fi - - if [ "$enable_assert" != "0" ]; then - log 1 "checking assert... enabled" - else - log 1 "checking assert... disabled" - fi - - pre_detect_with_zlib=$with_zlib - detect_zlib - - if [ "$with_zlib" = "0" ] || [ -z "$zlib_config" ]; then - log 1 "WARNING: zlib was not detected or disabled" - log 1 "WARNING: OpenTTD doesn't require zlib, but it does mean that many features" - log 1 "WARNING: (like loading most old savegames/scenarios, loading heightmaps," - log 1 "WARNING: using PNG, or using fonts, ...) will be disabled." - if [ "$pre_detect_with_zlib" = "0" ]; then - log 1 "WARNING: We strongly suggest you to install zlib." - else - log 1 "configure: error: no zlib detected" - log 1 " If you want to compile without zlib use --without-zlib as parameter" - exit - fi - fi - - pre_detect_with_lzma=$with_lzma - detect_lzma - - if [ "$with_lzma" = "0" ] || [ -z "$lzma_config" ]; then - log 1 "WARNING: lzma was not detected or disabled" - log 1 "WARNING: OpenTTD doesn't require lzma, but it does mean that many features" - log 1 "WARNING: (like loading most savegames/scenarios and joining most servers)" - log 1 "WARNING: will be disabled." - if [ "$pre_detect_with_lzma" = "0" ]; then - log 1 "WARNING: We strongly suggest you to install liblzma." - log 1 "configure: error: no liblzma detected" - else - log 1 " If you want to compile without lzma use --without-lzma as parameter" - exit - fi - fi - - pre_detect_with_lzo2=$with_lzo2 - detect_lzo2 - - if [ "$with_lzo2" = "0" ] || [ -z "$lzo2" ]; then - log 1 "WARNING: liblzo2 was not detected or disabled" - log 1 "WARNING: OpenTTD doesn't require liblzo2, but it does mean that" - log 1 "WARNING: loading old savegames/scenarios will be disabled." - if [ "$pre_detect_with_lzo2" = "0" ]; then - log 1 "WARNING: We strongly suggest you to install liblzo2." - else - log 1 "configure: error: no liblzo2 detected" - log 1 " If you want to compile without liblzo2 use --without-liblzo2 as parameter" - exit - fi - fi - - if [ "$with_uniscribe" != "0" ]; then - if [ "$os" != "MINGW" ]; then - if [ "$with_uniscribe" != "1" ]; then - log 1 "configure: error: Uniscribe is only supported on native Win32 targets" - exit 1 - fi - with_uniscribe="0" - - log 1 "checking Uniscribe text layout... not Windows, skipping" - else - log 1 "checking Uniscribe text layout... found" - - # Don't use ICU unless forced. - if [ "$with_icu_layout" = "1" ]; then - with_icu_layout="0" - fi - if [ "$with_icu_sort" = "1" ]; then - with_icu_sort="0" - fi - fi - fi - - detect_xdg_basedir - detect_png - detect_freetype - detect_fontconfig - detect_icu_layout - detect_icu_sort - detect_fluidsynth - - if [ "$with_direct_music" != "0" ]; then - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - if [ "$with_direct_music" != "1" ]; then - log 1 "configure: error: direct-music is only supported on Win32 targets" - exit 1 - fi - with_direct_music="0" - - log 1 "checking direct-music... not Windows, skipping" - else - check_direct_music - fi - fi - - if [ "$with_xaudio2" != "0" ]; then - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - if [ "$with_xaudio2" != "1" ]; then - log 1 "configure: error: xaudio2 is only supported on Win32 targets" - exit 1 - fi - with_xaudio2="0" - - log 1 "checking xaudio2... not Windows, skipping" - else - check_xaudio2 - fi - fi - - detect_sort - - # Suppress language errors when there is a version defined, indicating a release - # It just isn't pretty if any release produces warnings in the languages. - if [ -f "$ROOT_DIR/version" ]; then - lang_suppress="yes" - log 1 "suppress language errors... yes" - else - lang_suppress="" - log 1 "suppress language errors... no" - fi - - if [ "$enable_debug" = "0" ] && [ "$enable_profiling" = "0" ] && [ "$enable_strip" != "0" ]; then - if [ "$os" = "OSX" ]; then - strip_arg="" - elif [ "$os" = "OS2" ]; then - strip_arg="" - # OS2 uses strip via gcc, because it needs to be feed to emxbind - LDFLAGS="$LDFLAGS -s" - elif [ "$os" = "SUNOS" ]; then - # The GNU strip does know -s, the non-GNU doesn't - # So try to detect it (in a bit of an ugly way) - strip_arg="`$strip -s strip.test 2>/dev/null && echo \"-s\"`" - else - strip_arg="-s" - fi - - log 1 "checking stripping... $strip $strip_arg" - else - strip="" - log 1 "checking stripping... skipped" - fi - - if [ "$with_distcc" = "0" ]; then - log 1 "checking distcc... no" - elif [ "$with_distcc" = "1" ]; then - with_distcc="0" - - log 1 "checking distcc... no (only used when forced)" - elif [ "$with_distcc" = "2" ]; then - distcc="distcc" - else - distcc="$with_distcc" - fi - if [ "$with_distcc" != "0" ]; then - res="`$distcc --version 2>/dev/null | head -n 1 | cut -b 1-6`" - if [ "$res" != "distcc" ]; then - distcc="" - log 1 "checking distcc... no" - if [ "$with_distcc" = "2" ]; then - log 1 "configure: error: no distcc detected, but was forced to be used" - exit 1 - fi - if [ "$with_distcc" != "1" ]; then - log 1 "configure: error: '$with_distcc' doesn't seem a distcc to me" - exit 1 - fi - fi - - log 1 "checking distcc... $distcc" - fi - - if [ "$with_ccache" = "0" ]; then - log 1 "checking ccache... no" - elif [ "$with_ccache" = "1" ]; then - with_ccache="0" - - log 1 "checking ccache... no (only used when forced)" - elif [ "$with_ccache" = "2" ]; then - ccache="ccache" - else - ccache="$with_ccache" - fi - if [ "$with_ccache" != "0" ]; then - res="`$ccache --version 2>/dev/null | head -n 1 | cut -b 1-6`" - if [ "$res" != "ccache" ]; then - ccache="" - log 1 "checking ccache... no" - if [ "$with_ccache" = "2" ]; then - log 1 "configure: error: no ccache detected, but was forced to be used" - exit 1 - fi - if [ "$with_ccache" != "1" ]; then - log 1 "configure: error: '$with_ccache' doesn't seem a ccache to me" - exit 1 - fi - fi - - log 1 "checking ccache... $ccache" - fi - - detect_grfcodec - detect_nforenum - - if [ -z "$grfcodec" ] && [ -n "$nforenum" ]; then - log 1 "checking nforenum/grfcodec... nforenum needs grfcodec enabled, disabling nforenum" - nforenum="" - fi - - if [ -z "$nforenum" ] && [ -n "$grfcodec" ]; then - log 1 "checking nforenum/grfcodec... grfcodec needs nforenum enabled, disabling grfcodec" - grfcodec="" - fi - - if [ "$os" != "OSX" ] && [ "$with_application_bundle" != "0" ]; then - if [ "$with_application_bundle" = "1" ]; then - with_application_bundle="0" - - log 1 "checking OSX application bundle... not OSX, skipping" - else - log 1 "configure: error: --with-application-bundle only works if OSX is the target" - exit 1 - fi - fi - - if [ "$os" = "OSX" ] && [ "$with_application_bundle" = "1" ]; then - OSXAPP="OpenTTD.app" - else - OSXAPP="" - fi - - if [ "$os" = "OSX" ]; then - # Test on ppc970 (G5) - we can optimize there - - if [ "$enable_osx_g5" != "0" ]; then - log 1 "detecting ppc970 (G5)... yes (forced)" - else - # First, are we a real OSX system, else we can't detect it - native=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | grep darwin` - # If $host doesn't match $build , we are cross-compiling - if [ -n "$native" ] && [ "$build" = "$host" ]; then - $cxx_build $SRC_DIR/os/macosx/G5_detector.cpp -o G5_detector - res=`./G5_detector` - rm -f G5_detector - if [ -n "$res" ]; then - # This is G5, add flags for it - enable_osx_g5="2" - - log 1 "detecting ppc970 (G5)... yes" - else - enable_osx_g5="0" - - log 1 "detecting ppc970 (G5)... no" - fi - else - enable_osx_g5="0" - - log 1 "detecting ppc970 (G5)... no (cross-compiling)" - fi - fi - else - if [ "$enable_osx_g5" != "0" ]; then - log 1 "configure: error: ppc970 (OSX G5) selected, but not compiling for OSX" - log 1 "configure: error: either select OSX as OS, or deselect ppc970" - - exit 1 - fi - fi - - if { [ -d "$ROOT_DIR/.git" ] || [ -f "$ROOT_DIR/.git" ]; } && [ -n "`git help 2>/dev/null`" ]; then - log 1 "checking revision... git detection" - elif [ -f "$ROOT_DIR/.ottdrev" ]; then - log 1 "checking revision... source tarball" - else - log 1 "checking revision... no detection" - log 1 "WARNING: there is no means to determine the version." - log 1 "WARNING: please use a subversion, mercurial, or git checkout of OpenTTD." - log 1 "WARNING: you can only join game servers that have been compiled without" - log 1 "WARNING: version detection." - log 1 "WARNING: there is a great chance you desync." - log 1 "WARNING: USE WITH CAUTION!" - - sleep 5 - fi - - if [ "$doc_dir" = "1" ]; then - if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then - doc_dir="share/doc/openttd" - else - doc_dir="$data_dir/docs" - fi - else - doc_dir="`echo $doc_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - if [ "$icon_theme_dir" = "1" ]; then - if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then - icon_theme_dir="share/icons/hicolor" - else - icon_theme_dir="" - fi - else - icon_theme_dir="`echo $icon_theme_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - if [ "$personal_dir" = "1" ]; then - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "HAIKU" ]; then - personal_dir="OpenTTD" - elif [ "$os" = "OSX" ]; then - personal_dir="Documents/OpenTTD" - else - personal_dir=".openttd" - fi - else - personal_dir="`echo $personal_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - if [ "$shared_dir" = "1" ]; then - # we are using default values - if [ "$os" = "OSX" ]; then - shared_dir="/Library/Application\\\\ Support/OpenTTD" - else - shared_dir="" - fi - else - shared_dir="`echo $shared_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - if [ "$man_dir" = "1" ]; then - # add manpage on UNIX systems - if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OSX" ]; then - man_dir="share/man/man6" - else - man_dir="" - fi - else - man_dir="`echo $man_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - if [ "$menu_dir" = "1" ]; then - # add a freedesktop menu item only for some UNIX systems - if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then - menu_dir="share/applications" - else - menu_dir="" - fi - else - menu_dir="`echo $menu_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`" - fi - - detect_iconv - - if [ -n "$personal_dir" ] - then - log 1 "personal home directory... $personal_dir" - else - log 1 "personal home directory... none" - fi - - if [ -n "$shared_dir" ] - then - log 1 "shared data directory... $shared_dir" - else - log 1 "shared data directory... none" - fi - - if [ -n "$install_dir" ] - then - log 1 "installation directory... $install_dir" - else - log 1 "installation directory... none" - fi - - if [ -n "$icon_theme_dir" ] - then - log 1 "icon theme directory... $icon_theme_dir" - else - log 1 "icon theme directory... none" - fi - - if [ -n "$man_dir" ] - then - log 1 "manual page directory... $man_dir" - else - log 1 "manual page directory... none" - fi - - if [ -n "$menu_dir" ] - then - log 1 "menu item directory... $menu_dir" - else - log 1 "menu item directory... none" - fi -} - -make_compiler_cflags() { - # Params: - # $1 - compiler - # $2 - name of the cflags variable - # $3 - name of the cxxflags variable - # $4 - name of the ldflags variable - # $5 - name of the features variable - - # Get the compiler to tell us who it is - version_line="`$1 --version | head -n1`" - - eval eval "flags=\\\$$2" - eval eval "cxxflags=\\\$$3" - eval eval "ldflags=\\\$$4" - eval eval "features=\\\$$5" - - if [ `echo "$version_line" | cut -d' ' -f1` = "icc" ]; then - # Enable some things only for certain ICC versions - cc_version=`$1 -dumpversion | cut -c 1-4 | sed s@\\\.@@g` - - flags="$flags -rdynamic" - ldflags="$ldflags -rdynamic" - - if [ -z "$first_time_icc_check" ]; then - first_time_icc_check=no - if [ $cc_version -lt 90 ]; then - log 1 "WARNING: you seem to be using a very old version of ICC" - log 1 "WARNING: OpenTTD hasn't been tested with this version" - sleep 5 - elif [ $cc_version -lt 120 ]; then - log 1 "WARNING: you seem to be using an unsupported ICC version" - log 1 "WARNING: ICC older than 12.0 is known to fail to compile OpenTTD" - sleep 5 - fi - fi - - flags="$flags -Wall" - # remark #111: statement is unreachable - flags="$flags -wd111" - # remark #181: argument is incompatible with corresponding format string conversion - # ICC is very picky about signedness of operands, warnings provided by GCC are enough - flags="$flags -wd181" - # remark #271: trailing comma is nonstandard - flags="$flags -wd271" - # remark #280: selector expression is constant - flags="$flags -wd280" - # remark #304: access control not specified ("public" by default) - flags="$flags -wd304" - # remark #383: value copied to temporary, reference to temporary used - flags="$flags -wd383" - # remark #444: destructor for base class ... is not virtual - flags="$flags -wd444" - # remark #593: variable ... was set but never used - flags="$flags -wd593" - # warning #654: overloaded virtual function ... is only partially overridden in class ... - flags="$flags -wd654" - # remark #810: conversion from ... to ... may lose significant bits - flags="$flags -wd810" - # remark #869: parameter ... was never referenced - flags="$flags -wd869" - # warning #873: function ... ::operator new ... has no corresponding operator delete ... - flags="$flags -wd873" - # remark #981: operands are evaluated in unspecified order - flags="$flags -wd981" - # remark #1418: external function definition with no prior declaration - flags="$flags -wd1418" - # remark #1419: external declaration in primary source file - flags="$flags -wd1419" - # remark #1572: floating-point equality and inequality - flags="$flags -wd1572" - # remark #1599: declaration hides variable/parameter ... - flags="$flags -wd1599" - # remark #1720: function ... ::operator new ... has no corresponding member operator delete ... - flags="$flags -wd1720" - - if [ $cc_version -lt 110 ]; then - # warns about system headers with recent glibc: - # warning #1292: attribute "__nonnull__" ignored - flags="$flags -wd1292" - fi - - if [ $cc_version -ge 100 ]; then - # warning #1899: multicharacter character literal (potential portability problem) - flags="$flags -wd1899" - # vec report defaults to telling where it did loop vectorisation, which is not very important - flags="$flags -vec-report=0 " - fi - - if [ $cc_version -ge 110 ]; then - # remark #2259: non-pointer conversion from ... to ... may lose significant bits - flags="$flags -wd2259" - fi - - if [ "$enable_lto" != "0" ]; then - has_ipo=`$1 -help ipo | grep '\-ipo'` - if [ -n "$has_ipo" ]; then - # Use IPO (only if we see IPO exists and is requested) - flags="$flags -ipo" - features="$features lto" - fi - fi - elif echo "$version_line" | grep -q "clang"; then - # Enable some things only for certain clang versions - # Need to try really hard to get the version line, because OSX clang likes to hide its true version - cc_version="`$1 -v 2>&1 | grep -i version | head -n 1 | sed s@[^0-9]@@g | cut -c 1-2`" - - # aliasing rules are not held in openttd code - flags="$flags -fno-strict-aliasing" - - # -W alone doesn't enable all warnings enabled by -Wall; on the other hand, - # -Weverything enables too many useless warnings that can't be disabled (as of 3.0) - flags="$flags -Wall -W -Wextra" - - # warning: unused parameter '...' - flags="$flags -Wno-unused-parameter" - - # warning: expression result unused - flags="$flags -Wno-unused-value" - - # warning: multi-character character constant - flags="$flags -Wno-multichar" - - # warning: explicitly assigning a variable of type '...' to itself - # it happens when using the FOR_ALL_WINDOWS_FROM_BACK_FROM macro - flags="$flags -Wno-self-assign" - - # warning: is a C++11 extension - flags="$flags -Wno-c++11-extensions" - - if [ "$cc_version" -lt "30" ]; then - # warning: equality comparison with extraneous parentheses - flags="$flags -Wno-parentheses" - # warning: operands of ? are integers of different signs: 'unsigned int' and 'int' - flags="$flags -Wno-sign-compare" - fi - - if [ "$cc_version" -ge "30" ]; then - # warning: equality comparison with extraneous parentheses - # this warning could be useful, but it warns about code in squirrel - flags="$flags -Wno-parentheses-equality" - fi - - if [ "$with_ccache" != "0" -o "$with_distcc" != "0" ]; then - # ccache and distcc run separate preprocess and compile passes, - # both are fed with the same CFLAGS. Unfortunately, clang - # complains about -I when compiling preprocessed files: - # "clang: warning: argument unused during compilation: '-I /usr/include'" - flags="$flags -Qunused-arguments" - fi - - if [ "$enable_assert" -eq "0" ]; then - # do not warn about unused variables when building without asserts - flags="$flags -Wno-unused-variable" - fi - - # rdynamic is used to get useful stack traces from crash reports. - ldflags="$ldflags -rdynamic" - - # Assume gcc, since it just uses argv[0] in its --version output - else - # Enable some things only for certain GCC versions - # cc_version = major_version * 100 + minor_version - # For example: "3.3" -> 303, "4.9.2" -> 409, "6" -> 600, "23.5" -> 2305 - cc_version=`$1 -dumpversion | $awk -F . '{printf "%d%02d", $1, $2}'` - - if [ $cc_version -lt 303 ]; then - log 1 "configure: error: gcc older than 3.3 can't compile OpenTTD because of its poor template support" - exit 1 - fi - - flags="$flags -Wall -Wno-multichar -Wsign-compare -Wundef" - flags="$flags -Wwrite-strings -Wpointer-arith" - flags="$flags -W -Wno-unused-parameter -Wredundant-decls" - flags="$flags -Wformat=2 -Wformat-security" - - if [ $enable_assert -eq 0 ]; then - # Do not warn about unused variables when building without asserts - flags="$flags -Wno-unused-variable" - if [ $cc_version -ge 406 ]; then - # GCC 4.6 gives more warnings, disable them too - flags="$flags -Wno-unused-but-set-variable" - flags="$flags -Wno-unused-but-set-parameter" - fi - fi - - if [ $cc_version -ge 304 ]; then - # Warn when a variable is used to initialise itself: - # int a = a; - flags="$flags -Winit-self" - fi - - if [ $cc_version -ge 400 ]; then - # GCC 4.0+ complains about that we break strict-aliasing. - # On most places we don't see how to fix it, and it doesn't - # break anything. So disable strict-aliasing to make the - # compiler all happy. - flags="$flags -fno-strict-aliasing" - # Warn about casting-out 'const' with regular C-style cast. - # The preferred way is const_cast<>() which doesn't warn. - flags="$flags -Wcast-qual" - fi - - if [ $cc_version -ge 402 ]; then - # GCC 4.2+ automatically assumes that signed overflows do - # not occur in signed arithmetic, whereas we are not - # sure that they will not happen. It furthermore complains - # about its own optimized code in some places. - flags="$flags -fno-strict-overflow" - # GCC 4.2 no longer includes -Wnon-virtual-dtor in -Wall. - # Enable it in order to be consistent with older GCC versions. - flags="$flags -Wnon-virtual-dtor" - fi - - if [ $cc_version -eq 405 ]; then - # Prevent optimisation supposing enums are in a range specified by the standard - # For details, see http://gcc.gnu.org/PR43680 - flags="$flags -fno-tree-vrp" - fi - - if [ $cc_version -eq 407 ]; then - # Disable -Wnarrowing which gives many warnings, such as: - # warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing] - # They are valid according to the C++ standard, but useless. - cxxflags="$cxxflags -Wno-narrowing" - fi - - if [ $cc_version -ge 407 ]; then - # Disable bogus 'attempt to free a non-heap object' warning - flags="$flags -Wno-free-nonheap-object" - fi - - if [ $cc_version -ge 600 ]; then - # -flifetime-dse=2 (default since GCC 6) doesn't play - # well with our custom pool item allocator - cxxflags="$cxxflags -flifetime-dse=1" - fi - - if [ "$enable_lto" != "0" ]; then - # GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}' - has_lto=`$1 -dumpspecs | grep '\%{flto'` - if [ -n "$has_lto" ]; then - # Use LTO only if we see LTO exists and is requested - if [ $cc_version -lt 406 ]; then - flags="$flags -flto" - else - flags="$flags -flto=jobserver" - fi - ldflags="$ldflags -fwhole-program" - features="$features lto" - fi - fi - - has_rdynamic=`$1 -dumpspecs | grep rdynamic` - if [ -n "$has_rdynamic" ]; then - # rdynamic is used to get useful stack traces from crash reports. - flags="$flags -rdynamic" - ldflags="$ldflags -rdynamic" - fi - fi - - eval "$2=\"$flags\"" - eval "$3=\"$cxxflags\"" - eval "$4=\"$ldflags\"" - eval "$5=\"$features\"" -} - -make_cflags_and_ldflags() { - # General CFlags for BUILD - CFLAGS_BUILD_ENV="$CFLAGS_BUILD" - CFLAGS_BUILD="" - # Special CXXFlags for BUILD - CXXFLAGS_BUILD_ENV="$CXXFLAGS_BUILD" - CXXFLAGS_BUILD="" - # LDFLAGS for BUILD - LDFLAGS_BUILD_ENV="$LDFLAGS_BUILD" - LDFLAGS_BUILD="" - # FEATURES for BUILD (lto) - FEATURES_BUILD="" - # General CFlags for HOST - CFLAGS_ENV="$CFLAGS" - CFLAGS="" - # Special CXXFlags for HOST - CXXFLAGS_ENV="$CXXFLAGS" - CXXFLAGS="" - # Libs to compile. In fact this is just LDFLAGS - LIBS="" - # LDFLAGS used for HOST - LDFLAGS_ENV="$LDFLAGS" - LDFLAGS="" - # FEATURES for HOST (lto) - FEATURES="" - - make_compiler_cflags "$cc_build" "CFLAGS_BUILD" "CXXFLAGS_BUILD" "LDFLAGS_BUILD" "FEATURES_BUILD" - make_compiler_cflags "$cc_host" "CFLAGS" "CXXFLAGS" "LDFLAGS" "FEATURES" - - CFLAGS="$CFLAGS -D$os" - CFLAGS_BUILD="$CFLAGS_BUILD -D$os" - CXXFLAGS="$CXXFLAGS -std=c++11" - CXXFLAGS_BUILD="$CXXFLAGS_BUILD -std=c++11" - - if [ "$enable_debug" = "0" ]; then - # No debug, add default stuff - OBJS_SUBDIR="release" - - if [ "$enable_profiling" = "0" ]; then - # -fomit-frame-pointer and -pg do not go well together (gcc errors they are incompatible) - CFLAGS="-fomit-frame-pointer $CFLAGS" - fi - CFLAGS="-O2 $CFLAGS" - else - OBJS_SUBDIR="debug" - - # Each debug level reduces the optimization by a bit - if [ $enable_debug -ge 1 ]; then - CFLAGS="$CFLAGS -g -D_DEBUG" - fi - if [ $enable_debug -ge 2 ]; then - CFLAGS="$CFLAGS -fno-inline" - fi - if [ $enable_debug -ge 3 ]; then - CFLAGS="$CFLAGS -O0" - else - CFLAGS="$CFLAGS -O2" - fi - fi - - if [ $enable_debug -le 2 ]; then - cc_host_is_gcc=`basename "$cc_host" | grep "gcc" 2>/dev/null` - if [ -n "$cc_host_is_gcc" ]; then - # Define only when compiling with GCC. Some GLIBC versions use GNU - # extensions in a way that breaks build with at least ICC. - # This requires -O1 or more, so debug level 3 (-O0) is excluded. - CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" - if [ "$os" = "MINGW" ]; then - # Prevent undefined references when _FORTIFY_SOURCE > 0 - LDFLAGS="$LDFLAGS -fstack-protector" - fi - fi - - cc_build_is_gcc=`basename "$cc_build" | grep "gcc" 2>/dev/null` - if [ -n "$cc_build_is_gcc" ]; then - # Just add -O1 to the tools needed for building. - CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1" - if [ "$os" = "MINGW" ]; then - # Prevent undefined references when _FORTIFY_SOURCE > 0 - LDFLAGS_BUILD="$LDFLAGS_BUILD -fstack-protector" - fi - fi - fi - - if [ "$os" = "OSX" ] && [ $cc_version -eq 400 ]; then - # Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization, - # wrongly optimizing ^= in loops. This disables the failing optimisation. - CFLAGS="$CFLAGS -fno-expensive-optimizations" - fi - - if [ "$enable_profiling" != "0" ]; then - CFLAGS="$CFLAGS -pg" - LDFLAGS="$LDFLAGS -pg" - fi - - if [ "$with_threads" = "0" ]; then - CFLAGS="$CFLAGS -DNO_THREADS" - fi - if [ "$with_sse" = "1" ]; then - CFLAGS="$CFLAGS -DWITH_SSE" - fi - - if [ "`echo $1 | cut -c 1-3`" != "icc" ]; then - if [ "$os" = "CYGWIN" ]; then - flags="$flags -mwin32" - LDFLAGS="$LDFLAGS -mwin32" - fi - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - if [ $cc_version -lt 406 ]; then - flags="$flags -mno-cygwin" - LDFLAGS="$LDFLAGS -mno-cygwin" - fi - - if [ "$enable_console" != "0" ]; then - LDFLAGS="$LDFLAGS -Wl,--subsystem,console" - else - LDFLAGS="$LDFLAGS -Wl,--subsystem,windows" - fi - - LIBS="$LIBS -lws2_32 -lwinmm -lusp10 -lgdi32 -ldxguid -lole32 -limm32" - - if [ $cc_version -ge 404 ]; then - LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++" - fi - if [ $cc_version -ge 407 ]; then - CFLAGS="$CFLAGS -mno-ms-bitfields" - fi - fi - fi - - if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "OSX" ] && [ "$os" != "OS2" ]; then - LIBS="$LIBS -lpthread" - fi - - if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "MINGW" ]; then - LIBS="$LIBS -lc" - fi - - if [ "$os" = "OPENBSD" ]; then - LIBS="$LIBS -pthread" - fi - - if [ "$os" = "OSX" ]; then - LDFLAGS="$LDFLAGS -framework Cocoa" - - # Add macports include dir which is not always set a default system dir. This avoids zillions of bogus warnings. - CFLAGS="$CFLAGS -isystem/opt/local/include" - - if [ "$enable_universal" = "0" ]; then - # Universal builds set this elsewhere - CFLAGS="$OSX_SYSROOT $CFLAGS" - LDFLAGS="$OSX_LD_SYSROOT $LDFLAGS" - fi - fi - - if [ "$os" = "HAIKU" ]; then - LIBS="$LIBS -lmidi -lbe" - fi - - # Most targets act like UNIX, just with some additions - if [ "$os" = "HAIKU" ] || [ "$os" = "OSX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then - CFLAGS="$CFLAGS -DUNIX" - fi - # And others like Windows - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - CFLAGS="$CFLAGS -DWIN" - fi - - if [ -n "$allegro_config" ]; then - CFLAGS="$CFLAGS -DWITH_ALLEGRO" - CFLAGS="$CFLAGS `$allegro_config --cflags`" - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$allegro_config --static --libs`" - else - LIBS="$LIBS `$allegro_config --libs`" - fi - fi - fi - - if [ -n "$sdl2_config" ]; then - CFLAGS="$CFLAGS -DWITH_SDL2" - # SDL must not add _GNU_SOURCE as it breaks many platforms - CFLAGS="$CFLAGS `$sdl2_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`" - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$sdl2_config --static --libs`" - else - LIBS="$LIBS `$sdl2_config --libs`" - fi - elif [ -n "$sdl_config" ]; then - CFLAGS="$CFLAGS -DWITH_SDL" - # SDL must not add _GNU_SOURCE as it breaks many platforms - CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`" - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$sdl_config --static --libs`" - else - LIBS="$LIBS `$sdl_config --libs`" - fi - fi - - if [ "$with_cocoa" != "0" ]; then - CFLAGS="$CFLAGS -DWITH_COCOA" - LIBS="$LIBS -F$osx_sdk_path/System/Library/Frameworks -framework Cocoa -framework AudioUnit -framework AudioToolbox" - - if [ "$enable_cocoa_quartz" != "0" ]; then - CFLAGS="$CFLAGS -DENABLE_COCOA_QUARTZ" - fi - fi - - if [ "$with_zlib" != "0" ]; then - CFLAGS="$CFLAGS -DWITH_ZLIB" - CFLAGS="$CFLAGS `$zlib_config --cflags | tr '\n\r' ' '`" - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$zlib_config --libs --static | tr '\n\r' ' '`" - else - LIBS="$LIBS `$zlib_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ -n "$lzma_config" ]; then - CFLAGS="$CFLAGS -DWITH_LIBLZMA" - CFLAGS="$CFLAGS `$lzma_config --cflags | tr '\n\r' ' '`" - - if [ "$enable_static" != "0" ]; then - CFLAGS="$CFLAGS -DLZMA_API_STATIC" - LIBS="$LIBS `$lzma_config --libs --static | tr '\n\r' ' '`" - else - LIBS="$LIBS `$lzma_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ "$with_lzo2" != "0" ]; then - if [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then - LIBS="$LIBS $lzo2" - else - LIBS="$LIBS -llzo2" - fi - CFLAGS="$CFLAGS -DWITH_LZO" - fi - - if [ -n "$xdg_basedir_config" ]; then - CFLAGS="$CFLAGS -DWITH_XDG_BASEDIR" - CFLAGS="$CFLAGS `$xdg_basedir_config --cflags | tr '\n\r' ' '`" - - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$xdg_basedir_config --libs --static | tr '\n\r' ' '`" - else - LIBS="$LIBS `$xdg_basedir_config --libs | tr '\n\r' ' '`" - fi - fi - - # 64bit machines need -D_SQ64 - if [ "$cpu_type" = "64" ] && [ "$enable_universal" = "0" ]; then - CFLAGS="$CFLAGS -D_SQ64" - fi - CFLAGS="$CFLAGS -I$SCRIPT_SRC_DIR" - - if [ -n "$png_config" ]; then - CFLAGS="$CFLAGS -DWITH_PNG" - CFLAGS="$CFLAGS `$png_config --cflags | tr '\n\r' ' '`" - - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$png_config --libs --static | tr '\n\r' ' '`" - else - LIBS="$LIBS `$png_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ -n "$fontconfig_config" ]; then - CFLAGS="$CFLAGS -DWITH_FONTCONFIG" - CFLAGS="$CFLAGS `$fontconfig_config --cflags | tr '\n\r' ' '`" - - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$fontconfig_config --libs --static | tr '\n\r' ' '`" - else - LIBS="$LIBS `$fontconfig_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ -n "$freetype_config" ]; then - CFLAGS="$CFLAGS -DWITH_FREETYPE" - CFLAGS="$CFLAGS `$freetype_config --cflags | tr '\n\r' ' '`" - - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$freetype_config --libs --static | tr '\n\r' ' '` -lfreetype" - else - LIBS="$LIBS `$freetype_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ -n "$icu_layout_config" ]; then - CFLAGS="$CFLAGS -DWITH_ICU_LX" - CFLAGS="$CFLAGS `$icu_layout_config --cflags | tr '\n\r' ' '`" - - if [ "$static_icu" != "0" ]; then - LIBS="$LIBS `$icu_layout_config --libs --static | tr '\n\r' ' ' | sed s/-licu/-lsicu/g`" - else - LIBS="$LIBS `$icu_layout_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ -n "$icu_sort_config" ]; then - CFLAGS="$CFLAGS -DWITH_ICU_I18N" - CFLAGS="$CFLAGS `$icu_sort_config --cflags | tr '\n\r' ' '`" - - if [ "$static_icu" != "0" ]; then - LIBS="$LIBS `$icu_sort_config --libs --static | tr '\n\r' ' ' | sed s/-licu/-lsicu/g`" - else - LIBS="$LIBS `$icu_sort_config --libs | tr '\n\r' ' '`" - fi - fi - - if [ "$with_uniscribe" != "0" ]; then - CFLAGS="$CFLAGS -DWITH_UNISCRIBE" - LIBS="$LIBS -lusp10" - fi - - if [ "$with_direct_music" != "0" ]; then - CFLAGS="$CFLAGS -DWIN32_ENABLE_DIRECTMUSIC_SUPPORT" - # GCC 4.0+ doesn't like the DirectX includes (gives tons of - # warnings on it we won't be able to fix). For now just - # suppress those warnings. - if [ $cc_version -ge 400 ]; then - CFLAGS="$CFLAGS -Wno-non-virtual-dtor" - fi - fi - - if [ "$with_xaudio2" != "0" ]; then - CFLAGS="$CFLAGS -DWITH_XAUDIO2" - fi - - if [ -n "$fluidsynth" ]; then - LIBS="$LIBS -lfluidsynth" - CFLAGS="$CFLAGS -DFLUIDSYNTH" - fi - - if [ "$with_iconv" != "0" ]; then - CFLAGS="$CFLAGS -DWITH_ICONV" - if [ "$link_to_iconv" = "yes" ]; then - LIBS="$LIBS -liconv" - if [ "$with_iconv" != "2" ]; then - CFLAGS="$CFLAGS -I$with_iconv/include" - LIBS="$LIBS -L$with_iconv/lib" - fi - fi - - if [ "$os" != "OSX" ] && [ "$have_non_const_iconv" != "no" ]; then - CFLAGS="$CFLAGS -DHAVE_NON_CONST_ICONV" - fi - fi - - if [ -n "$with_midi" ]; then - CFLAGS="$CFLAGS -DEXTERNAL_PLAYER=\\\\\"$with_midi\\\\\"" - fi - if [ -n "$with_midi_arg" ]; then - CFLAGS="$CFLAGS -DMIDI_ARG=\\\\\"$with_midi_arg\\\\\"" - fi - - if [ "$enable_dedicated" != "0" ]; then - CFLAGS="$CFLAGS -DDEDICATED" - fi - - if [ "$enable_unicode" != "0" ]; then - CFLAGS="$CFLAGS -DUNICODE -D_UNICODE" - fi - - if [ "$os" = "HAIKU" ]; then - LDFLAGS="$LDFLAGS -lnetwork" - fi - - if [ "$os" = "SUNOS" ]; then - LDFLAGS="$LDFLAGS -lnsl -lsocket" - fi - - if [ "$enable_static" != "0" ]; then - # OSX can't handle -static in LDFLAGS - if [ "$os" != "OSX" ]; then - LDFLAGS="$LDFLAGS -static" - fi - fi - - if [ "$enable_assert" = "0" ]; then - CFLAGS="$CFLAGS -DNDEBUG" - CFLAGS_BUILD="$CFLAGS_BUILD -DNDEBUG" - fi - - if [ "$enable_desync_debug" != "0" ]; then - CFLAGS="$CFLAGS -DRANDOM_DEBUG" - fi - - if [ "$enable_osx_g5" != "0" ]; then - CFLAGS="$CFLAGS -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt" - fi - - if [ -n "$personal_dir" ]; then - CFLAGS="$CFLAGS -DWITH_PERSONAL_DIR -DPERSONAL_DIR=\\\\\"$personal_dir\\\\\"" - fi - - if [ -n "$shared_dir" ]; then - CFLAGS="$CFLAGS -DWITH_SHARED_DIR -DSHARED_DIR=\\\\\"$shared_dir\\\\\"" - fi - - CFLAGS="$CFLAGS -DGLOBAL_DATA_DIR=\\\\\"$prefix_dir/$data_dir\\\\\"" - - if [ "$enable_lto" != "0" ]; then - lto_build=`echo "$FEATURES_BUILD" | grep "lto"` - lto_host=`echo "$FEATURES" | grep "lto"` - if [ -z "$lto_build$lto_host" ]; then - log 1 "WARNING: you enabled LTO/IPO, but neither build nor host compiler supports it" - log 1 "WARNING: LTO/IPO has been disabled" - fi - if [ -n "$lto_build" ]; then - LDFLAGS_BUILD="$LDFLAGS_BUILD $CFLAGS_BUILD $CXXFLAGS_BUILD" - fi - if [ -n "$lto_host" ]; then - LDFLAGS="$LDFLAGS $CFLAGS $CXXFLAGS" - fi - fi - - # All flags to be extended via the env - CFLAGS_BUILD="$CFLAGS_BUILD $CFLAGS_BUILD_ENV" - CXXFLAGS_BUILD="$CXXFLAGS_BUILD $CXXFLAGS_BUILD_ENV" - LDFLAGS_BUILD="$LDFLAGS_BUILD $LDFLAGS_BUILD_ENV" - CFLAGS="$CFLAGS $CFLAGS_ENV" - CXXFLAGS="$CXXFLAGS $CXXFLAGS_ENV" - LDFLAGS="$LDFLAGS $LDFLAGS_ENV" - - log 1 "using CFLAGS_BUILD... $CFLAGS_BUILD" - log 1 "using CXXFLAGS_BUILD... $CXXFLAGS_BUILD" - log 1 "using LDFLAGS_BUILD... $LDFLAGS_BUILD" - log 1 "using CFLAGS... $CFLAGS" - log 1 "using CXXFLAGS... $CXXFLAGS" - log 1 "using LDFLAGS... $LIBS $LDFLAGS" - - # Makedepend doesn't like something like: -isysroot /OSX/blabla - # so convert it to: -isysroot -OSX/blabla. makedepend just ignores - # any - command it doesn't know, so we are pretty save. - # Lovely hackish, not? - # Btw, this almost always comes from outside the configure, so it is - # not something we can control. - # Also make makedepend aware of compiler's built-in defines. - if [ "$with_makedepend" != "0" ] || [ "$enable_builtin_depend" != "0" ]; then - # Append CXXFLAGS possibly containing -std=c++0x - cflags_makedep="`echo | $cxx_host $CXXFLAGS -E -x c++ -dM - | sed 's@.define @-D@g;s@ .*@ @g;s@(.*)@@g' | tr -d '\r\n'`" - - # Please escape ALL " within ` because e.g. "" terminates the string in some sh implementations - cflags_makedep="$cflags_makedep `echo \"$CFLAGS\" \"$CXXFLAGS\" | sed 's@ /@ -@g;s@-I[ ]*[^ ]*@@g;s@[ ]*-[^D][^ ]*@@g'`" - else - makedepend="" - fi - - if [ "$with_distcc" != "0" ]; then - cc_host="$distcc $cc_host" - cxx_host="$distcc $cxx_host" - log 1 "" - log 1 " NOTICE: remind yourself to use 'make -jN' to make use of distcc" - log 1 "" - fi - - if [ "$with_ccache" != "0" ]; then - cc_host="$ccache $cc_host" - cxx_host="$ccache $cxx_host" - fi -} - -check_compiler() { - # Params: - # $1 - Type for message (build / host) - # $2 - What to fill with the found compiler - # $3 - System to try - # $4 - Compiler to try - # $5 - Env-setting to try - # $6 - GCC alike to try - # $7 - CC alike to try - # $8 - "0" gcc, "1" g++, "2" windres, "3" strip, "4" lipo - # $9 - What the command is to check for - - if [ -n "$4" ]; then - # Check for manual compiler - machine=`$4 $9 2>/dev/null` - ret=$? - eval "$2=\"$4\"" - - log 2 "executing $4 $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - log 1 "checking $1... $4 not found" - log 1 "the selected binary doesn't seem to be a $6 binary" - exit 1 - fi - elif [ -n "$3" ]; then - # Check for system - if [ -z "$6" ]; then - compiler="$3" - else - compiler="$3-$6" - fi - machine=`eval $compiler $9 2>/dev/null` - ret=$? - eval "$2=\"$compiler\"" - - log 2 "executing $compiler $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - if [ -z "$5" ]; then - log 1 "checking $1... $compiler not found" - log 1 "I couldn't detect any $6 binary for $3" - exit 1 - else - compiler="$3-$5" - fi - machine=`eval $compiler $9 2>/dev/null` - ret=$? - eval "$2=\"$compiler\"" - - log 2 "executing $compiler $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - log 1 "checking $1... $compiler not found" - log 1 "I couldn't detect any $5 binary for $3" - exit 1 - fi - fi - - if [ "$machine" != "$3" ] && ( [ "$8" = "0" ] || [ "$8" = "1" ] ); then - log 1 "checking $1... expected $3, found $machine" - log 1 "the compiler suggests it doesn't build code for the machine you specified" - exit 1 - fi - else - # Nothing given, autodetect - - if [ -n "$5" ]; then - machine=`$5 $9 2>/dev/null` - ret=$? - eval "$2=\"$5\"" - - log 2 "executing $5 $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - # The user defined a GCC that doesn't reply to $9.. abort - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - log 1 "checking $1... $5 unusable" - log 1 "the CC environment variable is set, but it doesn't seem to be a $6 binary" - log 1 "please redefine the CC/CXX environment to a $6 binary" - exit 1 - fi - else - log 2 "checking $1... CC/CXX not set (skipping)" - - # No $5, so try '$6' - machine=`$6 $9 2>/dev/null` - ret=$? - eval "$2=\"$6\"" - - log 2 "executing $6 $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then - # Maybe '$7'? - machine=`$7 $9 2>/dev/null` - ret=$? - eval "$2=\"$7\"" - - log 2 "executing $7 $9" - log 2 " returned $machine" - log 2 " exit code $ret" - - # All failed, abort - if [ -z "$machine" ]; then - log 1 "checking $1... $6 not found" - log 1 "I couldn't detect any $6 binary on your system" - log 1 "please define the CC/CXX environment to where it is located" - - exit 1 - fi - fi - fi - fi - - if [ "$8" != "0" ]; then - eval "res=\$$2" - log 1 "checking $1... $res" - else - log 1 "checking $1... $machine" - fi -} - -check_build() { - check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CC" "gcc" "cc" "0" "-dumpmachine" -} - -check_host() { - # By default the host is the build - if [ -z "$host" ]; then host="$build"; fi - check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine" -} - -check_cxx_build() { - check_compiler "build c++" "cxx_build" "$build" "$cxx_build" "$CXX" "g++" "c++" 1 "-dumpmachine" -} - -check_cxx_host() { - # By default the host is the build - if [ -z "$host" ]; then host="$build"; fi - check_compiler "host c++" "cxx_host" "$host" "$cxx_host" "$CXX" "g++" "c++" 1 "-dumpmachine" -} - -check_windres() { - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - check_compiler "host windres" "windres" "$host" "$windres" "$WINDRES" "windres" "windres" "2" "-V" - fi -} - -check_strip() { - if [ "$os" = "OS2" ]; then - # OS2 via gcc is a bit weird.. stripping HAS to be done via emxbind, which is via gcc directly - log 1 "checking host strip... using gcc -s option" - elif [ "$os" = "OSX" ]; then - # Most targets have -V in strip, to see if they exists... OSX doesn't.. so execute something - echo "int main(int argc, char *argv[]) { }" > strip.test.c - $cxx_host strip.test.c -o strip.test - check_compiler "host strip" "strip" "$host" "$strip" "$STRIP" "strip" "strip" "3" "strip.test" - rm -f strip.test.c strip.test - else - check_compiler "host strip" "strip" "$host" "$strip" "$STRIP" "strip" "strip" "3" "-V" - fi -} - -check_lipo() { - if [ "$os" = "OSX" ] && [ "$enable_universal" != "0" ]; then - echo "int main(int argc, char *argv[]) { }" > lipo.test.c - $cxx_host lipo.test.c -o lipo.test - check_compiler "host lipo" "lipo" "$host" "$lipo" "$LIPO" "lipo" "lipo" "4" "-info lipo.test" - rm -f lipo.test.c lipo.test - fi -} - -check_osx_sdk() { - local sysroot="" - if [ -n "$1" ]; then - if echo "$1" | grep -q / ; then - # Seems to be a file system path - osx_sdk_path="$1" - else - osx_sdk_path="/Developer/SDKs/MacOSX$1.sdk" - fi - if [ ! -d "$osx_sdk_path" ]; then - # No directory, not present or garbage - return 1 - fi - - # Set minimum version to 10.4 as that's when kCGBitmapByteOrder32Host was introduced - sysroot="-isysroot $osx_sdk_path -Wl,-syslibroot,$osx_sdk_path -mmacosx-version-min=10.4" - fi - -cat > tmp.osx.mm << EOF -#include -int main() { - kCGBitmapByteOrder32Host; - return 0; -} -EOF - execute="$cxx_host $sysroot $CFLAGS tmp.osx.mm -framework Cocoa -o tmp.osx 2>&1" - eval $execute > /dev/null - ret=$? - log 2 "executing $execute" - log 2 " exit code $ret" - rm -f tmp.osx.mm tmp.osx - return $ret -} - -check_direct_music() { - echo " - #include - #include - #include - int main(int argc, char *argv[]) { }" > direct_music.test.c - $cxx_host $CFLAGS direct_music.test.c -o direct_music.test 2> /dev/null - res=$? - rm -f direct_music.test.c direct_music.test - - if [ "$res" != "0" ]; then - if [ "$with_direct_music" != "1" ]; then - log 1 "configure: error: direct-music is not available on this system" - exit 1 - fi - with_direct_music="0" - - log 1 "checking direct-music... not found" - else - log 1 "checking direct-music... found" - fi -} - -check_xaudio2() { - echo " - #include - - #undef NTDDI_VERSION - #undef _WIN32_WINNT - - #define NTDDI_VERSION NTDDI_WIN8 - #define _WIN32_WINNT _WIN32_WINNT_WIN8 - - #include - int main(int argc, char *argv[]) { }" > xaudio2.test.c - $cxx_host $CFLAGS xaudio2.test.c -o xaudio2.test 2> /dev/null - res=$? - rm -f xaudio2.test.c xaudio2.test - - if [ "$res" != "0" ]; then - if [ "$with_xaudio2" != "1" ]; then - log 1 "configure: error: xaudio2 is not available on this system" - exit 1 - fi - with_xaudio2="0" - - log 1 "checking xaudio2... not found" - else - log 1 "checking xaudio2... found" - fi -} - -check_makedepend() { - if [ "$enable_builtin_depend" != "0" ]; then - with_makedepend="0" - fi - - if [ "$with_makedepend" = "0" ]; then - log 1 "checking makedepend... disabled" - return - fi - - if [ "$with_makedepend" = "1" ] || [ "$with_makedepend" = "2" ]; then - makedepend="makedepend" - else - makedepend="$with_makedepend" - fi - - rm -f makedepend.tmp - touch makedepend.tmp - res=`$makedepend -fmakedepend.tmp 2>/dev/null` - res=$? - log 2 "executing $makedepend -f makedepend.tmp" - log 2 " returned `cat makedepend.tmp`" - log 2 " exit code $ret" - - if [ ! -s makedepend.tmp ]; then - rm -f makedepend.tmp makedepend.tmp.bak - - if [ "$with_makedepend" = "2" ]; then - log 1 "checking makedepend... not found" - - log 1 "I couldn't detect any makedepend on your system" - log 1 "please locate it via --makedepend=[binary]" - - exit 1 - elif [ "$with_makedepend" != "1" ]; then - log 1 "checking makedepend... $makedepend not found" - - log 1 "the selected file doesn't seem to be a valid makedepend binary" - - exit 1 - else - log 1 "checking makedepend... not found" - - with_makedepend="0" - return - fi - fi - - rm -f makedepend.tmp makedepend.tmp.bak - - log 1 "checking makedepend... $makedepend" -} - -check_version() { - # $1 - requested version (major.minor) - # $2 - version we got (major.minor) - - if [ -z "$2" ]; then - return 0 - fi - - req_major=`echo $1 | cut -d. -f1` - got_major=`echo $2 | cut -d. -f1` - if [ $got_major -lt $req_major ]; then - return 0 - elif [ $got_major -gt $req_major ]; then - return 1 - fi - - req_minor=`echo $1 | cut -d. -f2` - got_minor=`echo $2 | cut -d. -f2` - if [ $got_minor -lt $req_minor ]; then - return 0 - fi - return 1 -} - -detect_awk() { - # Not all awks allow gsub(), so we test for that here! It is in fact all we need... - - # These awks are known to work. Test for them explicit - awks="gawk mawk nawk" - - awk_prefix="echo \"a.c b.c c.c\" | tr ' ' \\\\n | " - awk_param="' { ORS = \" \" } /\.c$/ { gsub(\".c$\", \".o\", \$0); print \$0; }' 2>/dev/null" - awk_result="a.o b.o c.o " - log 2 "Detecing awk..." - - log 2 "Trying: $awk_prefix $awk $awk_param" - res=`eval $awk_prefix $awk $awk_param` - log 2 "Result: '$res'" - if [ "$res" != "$awk_result" ] && [ "$awk" = "awk" ]; then - # User didn't supply his own awk, so try to detect some other known working names for an awk - for awk in $awks; do - log 2 "Trying: $awk_prefix $awk $awk_param" - res=`eval $awk_prefix $awk $awk_param` - log 2 "Result: '$res'" - if [ "$res" = "$awk_result" ]; then break; fi - done - - if [ "$res" != "$awk_result" ]; then - log 1 "checking awk... not found" - log 1 "configure: error: no awk found" - log 1 "configure: error: please install one of the following: $awks" - exit 1 - fi - fi - if [ "$res" != "$awk_result" ]; then - log 1 "checking awk... not found" - log 1 "configure: error: you supplied '$awk' but it doesn't seem a valid gawk or mawk" - exit 1 - fi - - log 1 "checking awk... $awk" -} - -detect_os() { - if [ "$os" = "DETECT" ]; then - # Detect UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HPUX, SUNOS, CYGWIN, MINGW, and OS2 - - # Try first via dumpmachine, then via uname - os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk ' - /linux/ { print "UNIX"; exit} - /darwin/ { print "OSX"; exit} - /freebsd/ { print "FREEBSD"; exit} - /dragonfly/ { print "DRAGONFLY"; exit} - /openbsd/ { print "OPENBSD"; exit} - /netbsd/ { print "NETBSD"; exit} - /hp-ux/ { print "HPUX"; exit} - /haiku/ { print "HAIKU"; exit} - /sunos/ { print "SUNOS"; exit} - /solaris/ { print "SUNOS"; exit} - /cygwin/ { print "CYGWIN"; exit} - /mingw/ { print "MINGW"; exit} - /os2/ { print "OS2"; exit} - '` - - if [ -z "$os" ]; then - os=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | $awk ' - /linux/ { print "UNIX"; exit} - /darwin/ { print "OSX"; exit} - /freebsd/ { print "FREEBSD"; exit} - /dragonfly/ { print "DRAGONFLY"; exit} - /openbsd/ { print "OPENBSD"; exit} - /netbsd/ { print "NETBSD"; exit} - /hp-ux/ { print "HPUX"; exit} - /haiku/ { print "HAIKU"; exit} - /sunos/ { print "SUNOS"; exit} - /cygwin/ { print "CYGWIN"; exit} - /mingw/ { print "MINGW"; exit} - /os\/2/ { print "OS2"; exit} - /gnu/ { print "UNIX"; exit} - '` - fi - - if [ -z "$os" ]; then - log 1 "detecting OS... none detected" - log 1 "I couldn't detect your OS. Please use --os=OS to force one" - log 1 "Allowed values are: UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HPUX, HAIKU, SUNOS, CYGWIN, MINGW, and OS2" - exit 1 - fi - - log 1 "detecting OS... $os" - else - log 1 "forcing OS... $os" - fi -} - -detect_allegro() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_allegro" = "0" ]; then - log 1 "checking Allegro... disabled" - - allegro_config="" - return 0 - fi - - if [ "$with_allegro" = "2" ] && [ "$with_cocoa" = "2" ]; then - log 1 "configure: error: it is impossible to compile both Allegro and COCOA" - log 1 "configure: error: please deselect one of them and try again" - exit 1 - fi - - if [ "$with_allegro" = "2" ] && [ "$enable_dedicated" != "0" ]; then - log 1 "configure: error: it is impossible to compile a dedicated with Allegro" - log 1 "configure: error: please deselect one of them and try again" - exit 1 - fi - - if [ "$enable_dedicated" != "0" ]; then - log 1 "checking Allegro... dedicated server, skipping" - - allegro_config="" - return 0 - fi - - # By default on OSX we don't use Allegro. The rest is auto-detect - if [ "$with_allegro" = "1" ] && [ "$os" = "OSX" ] && [ "$with_cocoa" != "0" ]; then - log 1 "checking Allegro... OSX, skipping" - - allegro_config="" - return 0 - fi - - detect_pkg_config "$with_allegro" "allegro" "allegro_config" "4.4" -} - - -detect_sdl() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_sdl" = "0" ]; then - log 1 "checking SDL... disabled" - - sdl_config="" - sdl2_config="" - return 0 - fi - - if [ "$with_sdl" != "1" ] && [ "$with_cocoa" = "2" ]; then - log 1 "configure: error: it is impossible to compile both SDL and COCOA" - log 1 "configure: error: please deselect one of them and try again" - exit 1 - fi - - if [ "$with_sdl" != "1" ] && [ "$enable_dedicated" != "0" ]; then - log 1 "configure: error: it is impossible to compile a dedicated with SDL" - log 1 "configure: error: please deselect one of them and try again" - exit 1 - fi - - if [ "$enable_dedicated" != "0" ]; then - log 1 "checking SDL... dedicated server, skipping" - - sdl_config="" - sdl2_config="" - return 0 - fi - - # By default on OSX we don't use SDL. The rest is auto-detect - if [ "$with_sdl" = "1" ] && [ "$os" = "OSX" ] && [ "$with_cocoa" != "0" ]; then - log 1 "checking SDL... OSX, skipping" - - sdl_config="" - return 0 - fi - - if [ "$os" = "OSX" ]; then - log 1 "WARNING: sdl is known to fail on some versions of Mac OS X" - log 1 "WARNING: with some hardware configurations. Use at own risk!" - sleep 5 - fi - - if [ $with_sdl = "sdl1" ]; then - detect_pkg_config "2" "sdl" "sdl_config" "1.2" - elif [ $with_sdl = "sdl2" ]; then - detect_pkg_config "2" "sdl2" "sdl2_config" "2.0" - else - sdl2_config="" - if [ -x "`which sdl2-config`" ]; then - detect_pkg_config "$with_sdl" "sdl2" "sdl2_config" "2.0" - fi - if [ -z "$sdl2_config" ]; then - detect_pkg_config "$with_sdl" "sdl" "sdl_config" "1.2" - fi - fi -} - -detect_osx_sdk() { - # Try to find the best SDK available. For a normal build this - # is currently the 10.5 SDK as this is needed to compile all - # optional code. Because such an executable won't run on 10.4 - # or lower, also check for the 10.4u SDK when doing an universal - # build. - - # Check for the 10.5 SDK, but try 10.6 if that fails - check_osx_sdk "10.5" || check_osx_sdk "10.6" || osx_sdk_path="" - - if [ -z "$osx_sdk_path" ] || [ "$enable_universal" != "0" ]; then - # No better SDK or universal build enabled? Check 10.4u SDK as well - local old_sdk="$osx_sdk_path" - if check_osx_sdk "10.4u"; then - osx_sdk_104_path="$osx_sdk_path" - else - osx_sdk_104_path="" - fi - if [ -z "$old_sdk" ]; then - osx_sdk_path="$osx_sdk_104_path" - else - osx_sdk_path="$old_sdk" - fi - fi - - if [ -z "$osx_sdk_path" ]; then - log 1 "Your system SDK is probably too old" - log 1 "Please install/upgrade your Xcode to >= 2.5" - - exit 1 - fi -} - -detect_cocoa() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_cocoa" = "0" ]; then - log 1 "checking COCOA... disabled" - - return 0 - fi - - if [ "$with_cocoa" = "2" ] && [ "$enable_dedicated" != "0" ]; then - log 1 "configure: error: it is impossible to compile a dedicated with COCOA" - log 1 "configure: error: please deselect one of them and try again" - exit 1 - fi - - if [ "$enable_dedicated" != "0" ]; then - log 1 "checking COCOA... dedicated server, skipping" - - with_cocoa="0" - return 0 - fi - - # By default on OSX we use COCOA. The rest doesn't support it - if [ "$with_cocoa" = "1" ] && [ "$os" != "OSX" ]; then - log 1 "checking COCOA... not OSX, skipping" - - with_cocoa="0" - return 0 - fi - - if [ "$os" != "OSX" ]; then - log 1 "checking COCOA... not OSX" - - log 1 "configure: error: COCOA video driver is only supported for OSX" - exit 1 - fi - - log 1 "checking COCOA... found" - - - if [ "$enable_cocoa_quartz" != "0" ]; then - log 1 "checking whether to enable the Quartz window subdriver... yes" - else - log 1 "checking whether to enable the Quartz window subdriver... no" - fi -} - -detect_library() { - # $1 - config-param ($with_zlib value) - # $2 - library name ('zlib', sets $zlib) - # $3 - static library name (libz.a) - # $4 - header directory () - # $5 - header name (zlib.h) - # $6 - force static (if non-empty) - - if [ -n "$6" ]; then force_static="1"; fi - - # 0 means no, 1 is auto-detect, 2 is force - if [ "$1" = "0" ]; then - log 1 "checking $2... disabled" - - eval "$2=\"\"" - return 0 - fi - - log 2 "detecting $2" - - if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then - eval "$2=`ls -1 /usr/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /usr/include/$4$5... no" - eval "$2=`ls -1 /usr/local/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /usr/local/include/$4$5... no" - eval "$2=`ls -1 /mingw/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /mingw/include/$4$5... no" - eval "$2=`ls -1 /mingw$cpu_type/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /mingw$cpu_type/include/$4$5... no" - eval "$2=`ls -1 /opt/local/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /opt/local/include/$4$5... no" - fi - if [ -z "$res" ] && [ "$os" = "NETBSD" ]; then - eval "$2=`ls -1 /usr/pkg/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /usr/pkg/include/$4$5... no" - fi - fi - if [ -z "$res" ] && [ "$os" = "HAIKU" ]; then - if [ -z "$includeDir" ]; then - includeDir=`finddir B_SYSTEM_HEADERS_DIRECTORY` - fi - eval "$2=`ls -1 $includeDir/$4*.h 2>/dev/null | egrep \"\/$5\$\"`" - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying $includeDir/$4$5... no" - fi - fi - - eval "res=\$$2" - if [ -n "$res" ] && ( [ -n "$force_static" ] || ( [ "$enable_static" != "0" ] && [ "$os" != "OSX" ] ) ); then - eval "res=\$$2" - log 2 " trying $res... found" - # Now find the static lib, if needed - eval "$2=`ls /lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /lib/$3... no" - eval "$2=`ls /usr/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /usr/lib/$3... no" - eval "$2=`ls /usr/local/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /usr/local/lib/$3... no" - eval "$2=`ls /mingw/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /mingw/lib/$3... no" - eval "$2=`ls /mingw$cpu_type/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`" - fi - eval "res=\$$2" - if [ -z "$res" ]; then - log 2 " trying /mingw$cpu_type/lib/$3... no" - log 1 "configure: error: $2 couldn't be found" - log 1 "configure: error: you requested a static link, but I can't find $3" - - exit 1 - fi - fi - else - # Make sure it exists - if [ -f "$1" ]; then - eval "$2=`ls $1 2>/dev/null`" - else - eval "$2=`ls $1/$3 2>/dev/null`" - fi - fi - - eval "res=\$$2" - if [ -z "$res" ]; then - log 1 "checking $2... not found" - if [ "$1" = "2" ]; then - log 1 "configure: error: $2 couldn't be found" - - exit 1 - elif [ "$1" != "1" ]; then - log 1 "configure: error: $2 couldn't be found" - log 1 "configure: error: you supplied '$1', but it seems invalid" - - exit 1 - fi - - eval "with_$2=0" - - return 0 - fi - - eval "res=\$$2" - log 2 " trying $res... found" - - log 1 "checking $2... found" -} - -detect_zlib() { - detect_pkg_config "$with_zlib" "zlib" "zlib_config" "1.2" -} - -detect_lzo2() { - detect_library "$with_lzo2" "lzo2" "liblzo2.a" "lzo/" "lzo1x.h" -} - -detect_fluidsynth() { - detect_library "$with_fluidsynth" "fluidsynth" "" "" "fluidsynth.h" -} - -detect_pkg_config() { - # $1 - config-param ($with_lzma value) - # $2 - package name ('liblzma') - # $3 - config name ('lzma_config', sets $lzma_config) - # $4 - minimum module version ('2.3') - # $5 - check for dedicated, 1 is "skif if dedicated" - - # 0 means no, 1 is auto-detect, 2 is force - if [ "$1" = "0" ]; then - log 1 "checking $2... disabled" - - eval "$3=\"\"" - return 0 - fi - - if [ "$5" = "1" ] && [ "$1" = "1" ] && [ "$enable_dedicated" != "0" ]; then - log 1 "checking $2... dedicated server, skipping" - - eval "$3=\"\"" - return 0 - fi - - log 2 "detecting $2" - - if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then - pkg_config_call="$pkg_config $2" - else - pkg_config_call="$1" - fi - - version=`$pkg_config_call --modversion 2>/dev/null` - ret=$? - check_version "$4" "$version" - version_ok=$? - log 2 "executing $pkg_config_call --modversion" - log 2 " returned $version" - log 2 " exit code $ret" - - if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then - if [ -n "$version" ] && [ "$version_ok" != "1" ]; then - log 1 "checking $2... needs at least version $4, $2 NOT enabled" - else - log 1 "checking $2... not found" - fi - - # It was forced, so it should be found. - if [ "$1" != "1" ]; then - log 1 "configure: error: $pkg_config $2 couldn't be found" - log 1 "configure: error: you supplied '$1', but it seems invalid" - exit 1 - fi - - eval "$3=\"\"" - return 0 - fi - - eval "$3=\"$pkg_config_call\"" - log 1 "checking $2... found" -} - -detect_lzma() { - detect_pkg_config "$with_lzma" "liblzma" "lzma_config" "5.0" -} - -detect_xdg_basedir() { - detect_pkg_config "$with_xdg_basedir" "libxdg-basedir" "xdg_basedir_config" "1.2" -} - -detect_png() { - detect_pkg_config "$with_png" "libpng" "png_config" "1.2" -} - -detect_freetype() { - if [ "$with_freetype" = "1" ] && ([ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]); then - log 1 "checking freetype2... WIN32, skipping" - freetype_config="" - return 0 - fi - - detect_pkg_config "$with_freetype" "freetype2" "freetype_config" "2.2" "1" -} - -detect_fontconfig() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_fontconfig" = "0" ]; then - log 1 "checking libfontconfig... disabled" - - fontconfig_config="" - return 0 - fi - if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then - log 1 "checking libfontconfig... WIN32, skipping" - fontconfig_config="" - return 0 - fi - - if [ "$os" = "OSX" ]; then - log 1 "checking libfontconfig... OSX, skipping" - fontconfig_config="" - return 0 - fi - - detect_pkg_config "$with_fontconfig" "fontconfig" "fontconfig_config" "2.3" "1" -} - -detect_icu_layout() { - if [ "$with_cocoa" != "0" ] && [ "$with_icu_layout" = "1" ]; then - log 1 "checking icu-lx... OSX, skipping" - icu_layout_config="" - return 0 - fi - - detect_pkg_config "$with_icu_layout" "icu-lx" "icu_layout_config" "4.8" "1" -} - -detect_icu_sort() { - if [ "$with_cocoa" != "0" ] && [ "$with_icu_sort" = "1" ]; then - log 1 "checking icu-i18n... OSX, skipping" - icu_sort_config="" - return 0 - fi - - detect_pkg_config "$with_icu_sort" "icu-i18n" "icu_sort_config" "4.8" "1" -} - -detect_iconv() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_iconv" = "0" ]; then - log 1 "checking iconv... disabled" - - return 0 - fi - - if [ "$with_iconv" = "1" ] && [ "$os" != "OSX" ]; then - log 1 "checking iconv... not OSX, skipping" - with_iconv="0" - - return 0 - fi - - # Try to find iconv.h, seems to only thing to detect iconv with - - if [ "$with_iconv" = "1" ] || [ "$with_iconv" = "" ] || [ "$with_iconv" = "2" ]; then - # Iterate over search paths - iconv="" - search_paths=`LC_ALL=C $cxx_host $OSX_SYSROOT $CFLAGS -E - -v &1 | \ - $awk '/#include <...> search starts here:/{flag=1;next}/End of search list./{flag=0}flag'` - for path in $search_paths; do - iconv=`ls -1 $path 2>/dev/null | grep "iconv.h"` - if [ -n "$iconv" ]; then - break - fi - done - else - # Make sure it exists - iconv=`ls $with_iconv/include/iconv.h 2>/dev/null` - fi - - if [ -z "$iconv" ]; then - log 1 "checking iconv... not found" - if [ "$with_iconv" = "2" ]; then - log 1 "configure: error: iconv couldn't be found" - - exit 1 - elif [ "$with_iconv" != "1" ]; then - log 1 "configure: error: iconv couldn't be found" - log 1 "configure: error: you supplied '$with_iconv', but I couldn't detect iconv in it" - - exit 1 - fi - - return 0 - fi - - if [ "$with_iconv" = "1" ]; then - with_iconv="2" - fi - - log 2 "found iconv in $iconv" - - log 1 "checking iconv... found" - - # There are different implementations of iconv. The older ones, - # e.g. SUSv2, pass a const pointer, whereas the newer ones, e.g. - # IEEE 1003.1 (2004), pass a non-const pointer. - - cat > tmp.iconv.cpp << EOF -#include "src/stdafx.h" -#include -int main() { - static char buf[1024]; - iconv_t convd = 0; - const char *inbuf = ""; - char *outbuf = buf; - size_t outlen = 1023; - size_t inlen = 0; - return iconv(convd, &inbuf, &inlen, &outbuf, &outlen); -} -EOF - execute="$cxx_host $OSX_SYSROOT $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1" - eval $execute > /dev/null - ret=$? - log 2 "executing $execute" - log 2 " exit code $ret" - if [ "$ret" = "0" ]; then have_non_const_iconv="no"; else have_non_const_iconv="yes"; fi - log 1 "checking if iconv has non-const inbuf... $have_non_const_iconv" - - cat > tmp.iconv.cpp << EOF -#include "src/stdafx.h" -#include -int main() { - static char buf[1024]; - iconv_t convd = 0; - char *inbuf = ""; - char *outbuf = buf; - size_t outlen = 1023; - size_t inlen = 0; - return iconv(convd, &inbuf, &inlen, &outbuf, &outlen); -} -EOF - execute="$cxx_host $OSX_SYSROOT $OSX_LD_SYSROOT $CFLAGS tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1" - eval $execute > /dev/null - ret=$? - log 2 "executing $execute" - log 2 " exit code $ret" - if [ "$ret" = "0" ]; then link_to_iconv="no"; else link_to_iconv="yes"; fi - log 1 "checking whether to link to iconv... $link_to_iconv" - rm -f tmp.iconv tmp.iconv.cpp -} - -_detect_sort() { - sort_test_in="d -a -c -b" - - sort_test_out="a -b -c -d" - - log 2 "running echo | $1" - - if [ "`echo \"$sort_test_in\" | $1 2>/dev/null`" = "$sort_test_out" ]; then - sort="$1" - log 2 " result was valid" - else - log 2 " result was invalid" - fi -} - -detect_sort() { - if [ "$with_sort" = "0" ]; then - log 1 "checking sort... disabled" - - return - fi - - if [ "$with_sort" = "1" ] || [ "$with_sort" = "2" ]; then - _detect_sort "sort" - if [ -z "$sort" ]; then _detect_sort "/sbin/sort"; fi - if [ -z "$sort" ]; then _detect_sort "/usr/sbin/sort"; fi - if [ -z "$sort" ]; then _detect_sort "/usr/local/sbin/sort"; fi - if [ -z "$sort" ]; then _detect_sort "/bin/sort"; fi - if [ -z "$sort" ]; then _detect_sort "/usr/bin/sort"; fi - if [ -z "$sort" ]; then _detect_sort "/usr/local/bin/sort"; fi - else - _detect_sort "$with_sort" - fi - - if [ -z "$sort" ]; then - if [ "$with_sort" = "2" ]; then - log 1 "checking sort... not found" - - log 1 "configure: error: couldn't detect sort on your system" - exit 1 - elif [ "$with_sort" != "1" ]; then - log 1 "checking sort... $with_sort not found" - - log 1 "configure: error: '$with_sort' doesn't look like a sort to me" - log 1 "configure: error: please verify its location and function and try again" - - exit 1 - else - log 1 "checking sort... not found" - fi - else - log 1 "checking sort... $sort" - fi -} - -detect_grfcodec() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_grfcodec" = "0" ]; then - log 1 "checking grfcodec... disabled" - - grfcodec="" - return 0 - fi - - if [ "$with_grfcodec" = "1" ] || [ "$with_grfcodec" = "" ] || [ "$with_grfcodec" = "2" ]; then - grfcodec="grfcodec" - else - grfcodec="$with_grfcodec" - fi - - version=`$grfcodec -v 2>/dev/null | $awk '{print $3}' | sed 's/[rM]//g;s/-/0/'` - ret=$? - log 2 "executing grfcodec -v" - log 2 " returned $version" - log 2 " exit code $ret" - - if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "985" ]; then - if [ -n "$version" ] && [ "$version" -lt "985" ]; then - log 1 "checking grfcodec... needs at least version 6.0.5 (r985), disabled" - else - log 1 "checking grfcodec... not found" - fi - - # It was forced, so it should be found. - if [ "$with_grfcodec" != "1" ]; then - log 1 "configure: error: grfcodec couldn't be found" - log 1 "configure: error: you supplied '$with_grfcodec', but it seems invalid" - exit 1 - fi - - grfcodec="" - return 0 - fi - - log 1 "checking grfcodec... found" -} - -detect_nforenum() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_nforenum" = "0" ]; then - log 1 "checking nforenum... disabled" - - nforenum="" - return 0 - fi - - if [ "$with_nforenum" = "1" ] || [ "$with_nforenum" = "" ] || [ "$with_nforenum" = "2" ]; then - nforenum="nforenum" - else - nforenum="$with_nforenum" - fi - - version=`$nforenum -v 2>/dev/null | $awk '{print $3}' | sed 's/[rM]//g;s/-/0/'` - ret=$? - log 2 "executing nforenum -v" - log 2 " returned $version" - log 2 " exit code $ret" - - if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "985" ]; then - if [ -n "$version" ] && [ "$version" -lt "985" ]; then - log 1 "checking nforenum... needs at least version 6.0.5 (r985), disabled" - else - log 1 "checking nforenum... not found" - fi - - # It was forced, so it should be found. - if [ "$with_nforenum" != "1" ]; then - log 1 "configure: error: nforenum couldn't be found" - log 1 "configure: error: you supplied '$with_nforenum', but it seems invalid" - exit 1 - fi - - nforenum="" - return 0 - fi - - log 1 "checking nforenum... found" -} - -detect_cputype() { - if [ -n "$cpu_type" ] && [ "$cpu_type" != "DETECT" ]; then - log 1 "forcing cpu-type... $cpu_type bits" - return; - fi - echo "#define _SQ64 1" > tmp.64bit.cpp - echo "#include \"src/stdafx.h\"" >> tmp.64bit.cpp - echo "assert_compile(sizeof(size_t) == 8);" >> tmp.64bit.cpp - echo "int main() { return 0; }" >> tmp.64bit.cpp - execute="$cxx_host $CFLAGS tmp.64bit.cpp -o tmp.64bit -DTESTING 2>&1" - cpu_type="`eval $execute 2>/dev/null`" - ret=$? - log 2 "executing $execute" - log 2 " returned $cpu_type" - log 2 " exit code $ret" - if [ "$ret" = "0" ]; then cpu_type="64"; else cpu_type="32"; fi - log 1 "detecting cpu-type... $cpu_type bits" - rm -f tmp.64bit tmp.64bit.cpp -} - -detect_sse_capable_architecture() { - # 0 means no, 1 is auto-detect, 2 is force - if [ "$with_sse" = "0" ]; then - log 1 "checking SSE... disabled" - return - fi - - echo "#define _SQ64 1" > tmp.sse.cpp - echo "#include " >> tmp.sse.cpp - echo "#include " >> tmp.sse.cpp - echo "#include " >> tmp.sse.cpp - echo "int main() { return 0; }" >> tmp.sse.cpp - execute="$cxx_host -msse4.1 $CFLAGS tmp.sse.cpp -o tmp.sse 2>&1" - sse="`eval $execute 2>/dev/null`" - ret=$? - log 2 "executing $execute" - log 2 " returned $sse" - log 2 " exit code $ret" - if [ "$ret" = "0" ]; then - log 1 "detecting SSE... found" - else - # It was forced, so it should be found. - if [ "$with_sse" != "1" ]; then - log 1 "configure: error: SSE couldn't be found" - log 1 "configure: error: you force enabled SSE, but it seems unavailable" - exit 1 - fi - - log 1 "detecting SSE... not found" - with_sse="0" - fi - rm -f tmp.sse tmp.exe tmp.sse.cpp -} - -make_sed() { - T_CFLAGS="$CFLAGS" - T_CXXFLAGS="$CXXFLAGS" - T_LDFLAGS="$LDFLAGS" - - SRC_OBJS_DIR="$BASE_SRC_OBJS_DIR/$OBJS_SUBDIR" - - # All the data needed to compile a single target - # Make sure if you compile multiple targets to - # use multiple OBJS_DIR, because all in-between - # binaries are stored in there, and nowhere else. - SRC_REPLACE=" - s@!!CC_HOST!!@$cc_host@g; - s@!!CXX_HOST!!@$cxx_host@g; - s@!!CC_BUILD!!@$cc_build@g; - s@!!CXX_BUILD!!@$cxx_build@g; - s@!!WINDRES!!@$windres@g; - s@!!STRIP!!@$strip $strip_arg@g; - s@!!LIPO!!@$lipo@g; - s@!!CFLAGS!!@$T_CFLAGS@g; - s@!!CFLAGS_BUILD!!@$CFLAGS_BUILD@g; - s@!!CXXFLAGS!!@$T_CXXFLAGS@g; - s@!!CXXFLAGS_BUILD!!@$CXXFLAGS_BUILD@g; - s@!!STRGEN_FLAGS!!@$strgen_flags@g; - s@!!LIBS!!@$LIBS@g; - s@!!LDFLAGS!!@$T_LDFLAGS@g; - s@!!LDFLAGS_BUILD!!@$LDFLAGS_BUILD@g; - s@!!BIN_DIR!!@$BIN_DIR@g; - s@!!ROOT_DIR!!@$ROOT_DIR@g; - s@!!MEDIA_DIR!!@$MEDIA_DIR@g; - s@!!SOURCE_LIST!!@$SOURCE_LIST@g; - s@!!SRC_OBJS_DIR!!@$SRC_OBJS_DIR@g; - s@!!LANG_OBJS_DIR!!@$LANG_OBJS_DIR@g; - s@!!GRF_OBJS_DIR!!@$GRF_OBJS_DIR@g; - s@!!SETTING_OBJS_DIR!!@$SETTING_OBJS_DIR@g; - s@!!SRC_DIR!!@$SRC_DIR@g; - s@!!SCRIPT_SRC_DIR!!@$SCRIPT_SRC_DIR@g; - s@!!OSXAPP!!@$OSXAPP@g; - s@!!LANG_DIR!!@$LANG_DIR@g; - s@!!TTD!!@$TTD@g; - s@!!BINARY_DIR!!@$prefix_dir/$binary_dir@g; - s@!!DATA_DIR!!@$prefix_dir/$data_dir@g; - s@!!DOC_DIR!!@$prefix_dir/$doc_dir@g; - s@!!MAN_DIR!!@$prefix_dir/$man_dir@g; - s@!!ICON_DIR!!@$prefix_dir/$icon_dir@g; - s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g; - s@!!PERSONAL_DIR!!@$personal_dir@g; - s@!!SHARED_DIR!!@$shared_dir@g; - s@!!INSTALL_DIR!!@$install_dir@g; - s@!!BINARY_NAME!!@$binary_name@g; - s@!!STRGEN!!@$STRGEN@g; - s@!!DEPEND!!@$DEPEND@g; - s@!!SETTINGSGEN!!@$SETTINGSGEN@g; - s@!!STAGE!!@$STAGE@g; - s@!!MAKEDEPEND!!@$makedepend@g; - s@!!CFLAGS_MAKEDEP!!@$cflags_makedep@g; - s@!!SORT!!@$sort@g; - s@!!CONFIG_CACHE_COMPILER!!@config.cache.compiler@g; - s@!!CONFIG_CACHE_LINKER!!@config.cache.linker@g; - s@!!CONFIG_CACHE_SOURCE!!@config.cache.source@g; - s@!!CONFIG_CACHE_VERSION!!@config.cache.version@g; - s@!!CONFIG_CACHE_SOURCE_LIST!!@config.cache.source.list@g; - s@!!CONFIG_CACHE_PWD!!@config.cache.pwd@g; - s@!!LANG_SUPPRESS!!@$lang_suppress@g; - s@!!OBJS_C!!@$OBJS_C@g; - s@!!OBJS_CPP!!@$OBJS_CPP@g; - s@!!OBJS_MM!!@$OBJS_MM@g; - s@!!OBJS_RC!!@$OBJS_RC@g; - s@!!SRCS!!@$SRCS@g; - s@!!OS!!@$os@g; - s@!!CONFIGURE_FILES!!@$CONFIGURE_FILES@g; - s@!!AWK!!@$awk@g; - s@!!DISTCC!!@$distcc@g; - s@!!NFORENUM!!@$nforenum@g; - s@!!GRFCODEC!!@$grfcodec@g; - " - - if [ "$icon_theme_dir" != "" ]; then - SRC_REPLACE="$SRC_REPLACE - s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g; - " - else - SRC_REPLACE="$SRC_REPLACE - s@!!ICON_THEME_DIR!!@@g; - " - fi - - if [ "$man_dir" != "" ]; then - SRC_REPLACE="$SRC_REPLACE - s@!!MAN_DIR!!@$prefix_dir/$man_dir@g; - " - else - SRC_REPLACE="$SRC_REPLACE - s@!!MAN_DIR!!@@g; - " - fi - - if [ "$menu_dir" != "" ]; then - SRC_REPLACE="$SRC_REPLACE - s@!!MENU_DIR!!@$prefix_dir/$menu_dir@g; - " - else - SRC_REPLACE="$SRC_REPLACE - s@!!MENU_DIR!!@@g; - " - fi -} - -generate_menu_item() { - MENU_REPLACE=" - s@!!TTD!!@$TTD@g; - s@!!MENU_GROUP!!@$menu_group@g; - s@!!MENU_NAME!!@$menu_name@g - " - log 1 "Generating menu item..." - mkdir -p media - < $ROOT_DIR/media/openttd.desktop.in sed "$MENU_REPLACE" > media/openttd.desktop -} - -generate_main() { - STAGE="[MAIN]" - - make_sed - - # Create the main Makefile - log 1 "Generating Makefile..." - echo "# Auto-generated file from 'Makefile.in' -- DO NOT EDIT" > Makefile - < $ROOT_DIR/Makefile.in sed "$SRC_REPLACE" >> Makefile - cp $ROOT_DIR/Makefile.bundle.in Makefile.bundle - echo "# Auto-generated file -- DO NOT EDIT" > Makefile.am - echo >> Makefile.am - # Make the copy of the source-list, so we don't trigger an unwanted recompile - cp $SOURCE_LIST config.cache.source.list - # Add the current directory, so we don't trigger an unwanted recompile - echo "`pwd`" > config.cache.pwd - # Make sure config.cache is OLDER then config.cache.source.list - touch config.cache - touch config.pwd - - if [ "$menu_dir" != "" ]; then - generate_menu_item - fi -} - -generate_lang() { - STAGE="[LANG]" - - make_sed - - # Create the language file - mkdir -p $LANG_OBJS_DIR - - log 1 "Generating lang/Makefile..." - echo "# Auto-generated file from 'Makefile.lang.in' -- DO NOT EDIT" > $LANG_OBJS_DIR/Makefile - < $ROOT_DIR/Makefile.lang.in sed "$SRC_REPLACE" >> $LANG_OBJS_DIR/Makefile - echo "DIRS += $LANG_OBJS_DIR" >> Makefile.am - echo "LANG_DIRS += $LANG_OBJS_DIR" >> Makefile.am -} - -generate_settings() { - STAGE="[SETTING]" - - make_sed - - # Create the language file - mkdir -p $SETTING_OBJS_DIR - - log 1 "Generating setting/Makefile..." - echo "# Auto-generated file from 'Makefile.settings.in' -- DO NOT EDIT" > $SETTING_OBJS_DIR/Makefile - < $ROOT_DIR/Makefile.setting.in sed "$SRC_REPLACE" >> $SETTING_OBJS_DIR/Makefile - echo "DIRS += $SETTING_OBJS_DIR" >> Makefile.am -} - -generate_grf() { - STAGE="[BASESET]" - - make_sed - - # Create the language file - mkdir -p $GRF_OBJS_DIR - - log 1 "Generating grf/Makefile..." - echo "# Auto-generated file from 'Makefile.grf.in' -- DO NOT EDIT" > $GRF_OBJS_DIR/Makefile - < $ROOT_DIR/Makefile.grf.in sed "$SRC_REPLACE" >> $GRF_OBJS_DIR/Makefile - echo "DIRS += $GRF_OBJS_DIR" >> Makefile.am -} - -generate_src_normal() { - STAGE=$1 - - make_sed - - # Create the source file - mkdir -p $SRC_OBJS_DIR - - log 1 "Generating $2/Makefile..." - echo "# Auto-generated file from 'Makefile.src.in' -- DO NOT EDIT" > $SRC_OBJS_DIR/Makefile - < $ROOT_DIR/Makefile.src.in sed "$SRC_REPLACE" >> $SRC_OBJS_DIR/Makefile - echo "DIRS += $SRC_OBJS_DIR" >> Makefile.am - echo "SRC_DIRS += $SRC_OBJS_DIR" >> Makefile.am -} - -generate_src_osx() { - cc_host_orig="$cc_host" - cxx_host_orig="$cxx_host" - CFLAGS_orig="$CFLAGS" - LDFLAGS_orig="$LDFLAGS" - - for type in $enable_universal; do - - if [ -n "$osx_sdk_104_path" ]; then - # Use 10.4 SDK for 32-bit targets - CFLAGS="-isysroot $osx_sdk_104_path $CFLAGS_orig" - LDFLAGS="-Wl,-syslibroot,$osx_sdk_104_path $LDFLAGS_orig" - fi - - # We don't want to duplicate the x86_64 stuff for each target, so do it once here - if [ "$type" = "ppc64" ] || [ "$type" = "x86_64" ]; then - # 64 bits is always 10.5 or higher. Furthermore it has a non const ICONV - # and they also removed support for QuickTime/QuickDraw - if [ -n "$osx_sdk_path" ]; then - CFLAGS="-isysroot $osx_sdk_path $CFLAGS_orig" - LDFLAGS="-Wl,-syslibroot,$osx_sdk_path $LDFLAGS_orig" - fi - CFLAGS="$CFLAGS -D_SQ64" - fi - - case $type in - ppc) - BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc" - cc_host="$cc_host_orig -arch ppc -mmacosx-version-min=10.3" - cxx_host="$cxx_host_orig -arch ppc -mmacosx-version-min=10.3" - generate_src_normal "[ppc]" "objs/ppc";; - ppc970) - BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc970" - cc_host="$cc_host_orig -arch ppc970 -mmacosx-version-min=10.3 -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt" - cxx_host="$cxx_host_orig -arch ppc970 -mmacosx-version-min=10.3 -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt" - generate_src_normal "[ppc970]" "objs/ppc970";; - i386) - BASE_SRC_OBJS_DIR="$OBJS_DIR/i386" - cc_host="$cc_host_orig -arch i386 -mmacosx-version-min=10.4" - cxx_host="$cxx_host_orig -arch i386 -mmacosx-version-min=10.4" - generate_src_normal "[i386]" "objs/i386";; - ppc64) - BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc64" - cc_host="$cc_host_orig -arch ppc64 -mmacosx-version-min=10.5" - cxx_host="$cxx_host_orig -arch ppc64 -mmacosx-version-min=10.5" - generate_src_normal "[ppc64]" "objs/ppc64";; - x86_64) - BASE_SRC_OBJS_DIR="$OBJS_DIR/x86_64" - cc_host="$cc_host_orig -arch x86_64 -mmacosx-version-min=10.5" - cxx_host="$cxx_host_orig -arch x86_64 -mmacosx-version-min=10.5" - generate_src_normal "[x86_64]" "objs/x86_64";; - *) log 1 "Unknown architecture requested for universal build: $type";; - esac - done -} - -generate_src() { - if [ "$os" = "OSX" ] && [ "$enable_universal" != "0" ]; then - generate_src_osx - else - generate_src_normal "[SRC]" "objs" - fi -} - -showhelp() { - echo "'configure' configures OpenTTD." - echo "" - echo "Usage: $0 [OPTION]... [VAR=VALUE]..." - echo "" - echo "To assign environment variables (e.g., CC, CFLAGS...), specify them as" - echo "VAR=VALUE. See below for descriptions of some of the useful variables." - echo "" - echo "Defaults for the options are specified in brackets." - echo "" - echo "Configuration:" - echo " -h, --help display this help and exit" - echo "" - echo "System types:" - echo " --build=BUILD configure for building on BUILD [guessed]" - echo " --host=HOST cross-compile to build programs to run" - echo " on HOST [BUILD]" - echo " --windres=WINDRES the windres to use [HOST-windres]" - echo " --strip=STRIP the strip to use [HOST-strip]" - echo " --awk=AWK the awk to use in configure [awk]" - echo " --pkg-config=PKG-CONFIG the pkg-config to use in configure [pkg-config]" - echo " --lipo=LIPO the lipo to use (OSX ONLY) [HOST-lipo]" - echo " --os=OS the OS we are compiling for [DETECT]" - echo " DETECT/UNIX/OSX/FREEBSD/DRAGONFLY/OPENBSD/" - echo " NETBSD/HPUX/SUNOS/CYGWIN/" - echo " MINGW/OS2/HAIKU" - echo "" - echo "Paths:" - echo " --prefix-dir=dir specifies the prefix for all installed" - echo " files [/usr/local]" - echo " --binary-dir=dir location of the binary. Will be prefixed" - echo " with the prefix-dir [games]" - echo " --data-dir=dir location of data files (lang, data, gm)." - echo " Will be prefixed with the prefix-dir" - echo " [share/games/openttd]" - echo " --doc-dir=dir location of the doc files" - echo " Will be prefixed with the prefix-dir" - echo " [$doc_dir]" - echo " --icon-dir=dir location of icons. Will be prefixed" - echo " with the prefix-dir [share/pixmaps]" - echo " --icon-theme-dir=dir location of icon theme." - echo " Will be prefixed with the prefix-dir" - echo " and postfixed with size-dirs [$icon_theme_dir]" - echo " --man-dir=dir location of the manual page (UNIX only)" - echo " Will be prefixed with the prefix-dir" - echo " [$man_dir]" - echo " --menu-dir=dir location of the menu item. (UNIX only, except OSX)" - echo " Will be prefixed with the prefix-dir" - echo " [share/applications]" - echo " --personal-dir=dir location of the personal directory" - echo " [os-dependent default]" - echo " --shared-dir=dir location of shared data files" - echo " [os-dependent default]" - echo " --install-dir=dir specifies the root to install to." - echo " Useful to install into jails [/]" - echo " --binary-name the name used for the binary, icons," - echo " desktop file, etc. when installing [openttd]" - echo "" - echo "Features and packages:" - echo " --enable-debug[=LVL] enable debug-mode (LVL=[0123], 0 is release)" - echo " --enable-desync-debug=[LVL] enable desync debug options (LVL=[012], 0 is none" - echo " --enable-profiling enables profiling" - echo " --enable-lto enables GCC's Link Time Optimization (LTO)/ICC's" - echo " Interprocedural Optimization if available" - echo " --enable-dedicated compile a dedicated server (without video)" - echo " --enable-static enable static compile (doesn't work for" - echo " all HOSTs)" - echo " --enable-translator enable extra output for translators" - echo " --enable-universal[=ARCH] enable universal builds (OSX ONLY). Allowed is any combination" - echo " of architectures: i386 ppc ppc970 ppc64 x86_64" - echo " Default architectures are: i386 ppc" - echo " --enable-osx-g5 enables optimizations for ppc970 (G5) (OSX ONLY)" - echo " --disable-cocoa-quartz disable the quartz window mode driver for Cocoa (OSX ONLY)" - echo " --disable-unicode disable unicode support to build win9x" - echo " version (Win32 ONLY)" - echo " --enable-console compile as a console application instead of as a GUI application." - echo " If this setting is active, debug output will appear in the same" - echo " console instead of opening a new window. (Win32 ONLY)" - echo " --disable-assert disable asserts (continue on errors)" - echo " --enable-strip enable any possible stripping" - echo " --without-osx-sysroot disable the automatic adding of sysroot " - echo " (OSX ONLY)" - echo " --without-application-bundle disable generation of application bundle" - echo " (OSX ONLY)" - echo " --without-menu-entry Don't generate a menu item (Freedesktop based only)" - echo " --menu-group=group Category in which the menu item will be placed (Freedesktop based only)" - echo " --menu-name=name Name of the menu item when placed [OpenTTD]" - echo " --with-direct-music enable direct music support (Win32 ONLY)" - echo " --with-sort=sort define a non-default location for sort" - echo " --with-midi=midi define which midi-player to use" - echo " --with-midi-arg=arg define which args to use for the" - echo " midi-player" - echo " --with-fluidsynth enables fluidsynth support" - echo " --with-allegro[=\"pkg-config allegro\"]" - echo " enables Allegro video driver support" - echo " --with-cocoa enables COCOA video driver (OSX ONLY)" - echo " --with-sdl[=\"sdl1|sdl2\"] enables SDL video driver support" - echo " --with-zlib[=\"pkg-config zlib\"]" - echo " enables zlib support" - echo " --with-liblzma[=\"pkg-config liblzma\"]" - echo " enables liblzma support" - echo " --with-liblzo2[=liblzo2.a] enables liblzo2 support" - echo " --with-png[=\"pkg-config libpng\"]" - echo " enables libpng support" - echo " --with-freetype[=\"pkg-config freetype2\"]" - echo " enables libfreetype support" - echo " --with-fontconfig[=\"pkg-config fontconfig\"]" - echo " enables fontconfig support" - echo " --with-xdg-basedir[=\"pkg-config libxdg-basedir\"]" - echo " enables XDG base directory support" - echo " --with-icu enables icu components for layout and sorting" - echo " --with-icu-layout[=\"pkg-config icu-lx\"]" - echo " enables icu components for layouting (right-to-left support)" - echo " --with-icu-sort[=\"pkg-config icu-i18n\"]" - echo " enables icu components for locale specific string sorting" - echo " --static-icu try to link statically (libsicu instead of" - echo " libicu; can fail as the new name is guessed)" - echo " --with-iconv[=iconv-path] enables iconv support" - echo " --disable-builtin-depend disable use of builtin deps finder" - echo " --with-makedepend[=makedepend] enables makedepend support" - echo " --with-ccache enables ccache support" - echo " --with-distcc enables distcc support" - echo " --without-grfcodec disable usage of grfcodec and re-generation of base sets" - echo " --without-threads disable threading support" - echo " --without-sse disable SSE support (x86/x86_64 only)" - echo "" - echo "Some influential environment variables:" - echo " CC C compiler command" - echo " CXX C++ compiler command" - echo " CFLAGS C compiler flags" - echo " CXXFLAGS C++ compiler flags" - echo " WINDRES windres command" - echo " LDFLAGS linker flags, e.g. -L if you" - echo " have libraries in a nonstandard" - echo " directory " - echo " CFLAGS_BUILD C compiler flags for build time tool generation" - echo " CXXFLAGS_BUILD C++ compiler flags for build time tool generation" - echo " LDFLAGS_BUILD linker flags for build time tool generation" - echo " PKG_CONFIG_PATH additional library search paths (see \"man pkg-config\")" - echo " PKG_CONFIG_LIBDIR replace the default library search path (see \"man pkg-config\")" - echo "" - echo "Use these variables to override the choices made by 'configure' or to help" - echo "it to find libraries and programs with nonstandard names/locations." -} diff --git a/configure b/configure deleted file mode 100755 index 991e8f1432..0000000000 --- a/configure +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/sh - -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -check_path_characters() { - if [ -n "`echo $ROOT_DIR | grep '[^-_A-Za-z0-9\/\\\.:]'`" ]; then - echo "WARNING: The path contains a non-alphanumeric character that might cause" - echo " failures in subsequent build stages. Any failures with the build" - echo " will most likely be caused by this." - fi -} - -CONFIGURE_EXECUTABLE="$_" -# On *nix systems those two are equal when ./configure is done -if [ "$0" != "$CONFIGURE_EXECUTABLE" ]; then - # On some systems, when ./configure is triggered from 'make' - # the $_ is filled with 'make'. So if that is true, skip 'make' - # and use $0 (and hope that is correct ;)) - if [ -n "`echo $CONFIGURE_EXECUTABLE | grep make`" ]; then - CONFIGURE_EXECUTABLE="$0" - else - CONFIGURE_EXECUTABLE="$CONFIGURE_EXECUTABLE $0" - fi -fi -# Find out where configure is (in what dir) -ROOT_DIR="`dirname $0`" -# For MSYS/MinGW we want to know the FULL path. This as that path is generated -# once you call an outside binary. Having the same path for the rest is needed -# for dependency checking. -# pwd -W returns said FULL path, but doesn't exist on others so fall back. -ROOT_DIR="`cd $ROOT_DIR && (pwd -W 2>/dev/null || pwd 2>/dev/null)`" - -check_path_characters - -# Same here as for the ROOT_DIR above -PWD="`pwd -W 2>/dev/null || pwd 2>/dev/null`" -PREFIX="$PWD/bin" - -. $ROOT_DIR/config.lib - -# Set default dirs -OBJS_DIR="$PWD/objs" -BASE_SRC_OBJS_DIR="$OBJS_DIR" -LANG_OBJS_DIR="$OBJS_DIR/lang" -GRF_OBJS_DIR="$OBJS_DIR/extra_grf" -SETTING_OBJS_DIR="$OBJS_DIR/setting" -BIN_DIR="$PREFIX" -SRC_DIR="$ROOT_DIR/src" -LANG_DIR="$SRC_DIR/lang" -MEDIA_DIR="$ROOT_DIR/media" -SOURCE_LIST="$ROOT_DIR/source.list" - -if [ "$1" = "--reconfig" ] || [ "$1" = "--reconfigure" ]; then - if [ ! -f "config.cache" ]; then - echo "can't reconfigure, because never configured before" - exit 1 - fi - # Make sure we don't lock config.cache - cat config.cache | sed 's@\\ @\\\\ @g' > cache.tmp - sh cache.tmp - RET=$? - rm -f cache.tmp - exit $RET -fi - -set_default -detect_params "$@" -check_params -save_params -make_cflags_and_ldflags - -EXE="" -if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "OS2" ]; then - EXE=".exe" -fi - -TTD="openttd$EXE" -STRGEN="strgen$EXE" -DEPEND="depend$EXE" -SETTINGSGEN="settings_gen$EXE" - -if [ -z "$sort" ]; then - PIPE_SORT="sed s@a@a@" -else - PIPE_SORT="$sort" -fi - -if [ ! -f "$LANG_DIR/english.txt" ]; then - echo "Languages not found in $LANG_DIR. Can't continue without it." - echo "Please make sure the dir exists and contains at least english.txt" -fi - -# Read the source.list and process it -AWKCOMMAND=' - { } - /^( *)#end/ { if (deep == skip) { skip -= 1; } deep -= 1; next; } - /^( *)#else/ { if (deep == skip) { skip -= 1; } else if (deep - 1 == skip) { skip += 1; } next; } - /^( *)#if/ { - gsub(" ", "", $0); - gsub("^#if ", "", $0); - - if (deep != skip) { deep += 1; next; } - - deep += 1; - - if ($0 == "ALLEGRO" && "'$allegro_config'" == "") { next; } - if ($0 == "SDL" && "'$sdl_config'" == "") { next; } - if ($0 == "SDL2" && "'$sdl2_config'" == "") { next; } - if ($0 == "PNG" && "'$png_config'" == "") { next; } - if ($0 == "OSX" && "'$os'" != "OSX") { next; } - if ($0 == "OS2" && "'$os'" != "OS2") { next; } - if ($0 == "DEDICATED" && "'$enable_dedicated'" != "1") { next; } - if ($0 == "AI" && "'$enable_ai'" == "0") { next; } - if ($0 == "COCOA" && "'$with_cocoa'" == "0") { next; } - if ($0 == "HAIKU" && "'$os'" != "HAIKU") { next; } - if ($0 == "WIN32" && "'$os'" != "MINGW" && - "'$os'" != "CYGWIN" && "'$os'" != "MSVC") { next; } - if ($0 == "MSVC" && "'$os'" != "MSVC") { next; } - if ($0 == "DIRECTMUSIC" && "'$with_direct_music'" == "0") { next; } - if ($0 == "FLUIDSYNTH" && "'$fluidsynth'" == "" ) { next; } - if ($0 == "USE_XAUDIO2" && "'$with_xaudio2'" == "0") { next; } - if ($0 == "USE_THREADS" && "'$with_threads'" == "0") { next; } - if ($0 == "USE_SSE" && "'$with_sse'" != "1") { next; } - - skip += 1; - - next; - } - /^( *)#/ { next } - /^$/ { next } - /\.h$/ { next } - /\.hpp$/ { next } - { - if (deep == skip) { - gsub(" ", "", $0); - print $0; - } - } -' - -# Read the source.list and process it -# Please escape ALL " within ` because e.g. "" terminates the string in some sh implementations -SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk \"$AWKCOMMAND\" | LC_ALL=C $PIPE_SORT`" - -OBJS_C="` echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.c$/ { gsub(\".c$\", \".o\", $0); print $0; }'`" -OBJS_CPP="`echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.cpp$/ { gsub(\".cpp$\", \".o\", $0); print $0; }'`" -OBJS_MM="` echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.mm$/ { gsub(\".mm$\", \".o\", $0); print $0; }'`" -OBJS_RC="` echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.rc$/ { gsub(\".rc$\", \".o\", $0); print $0; }'`" -SRCS="` echo \"$SRCS\" | $awk ' { ORS = \" \" } { print $0; }'`" - -# In makefiles, we always use -u for sort -if [ -z "$sort" ]; then - sort="sed s@a@a@" -else - sort="$sort -u" -fi - -CONFIGURE_FILES="$ROOT_DIR/configure $ROOT_DIR/config.lib $ROOT_DIR/Makefile.in $ROOT_DIR/Makefile.grf.in $ROOT_DIR/Makefile.lang.in $ROOT_DIR/Makefile.src.in $ROOT_DIR/Makefile.bundle.in $ROOT_DIR/Makefile.setting.in" - -generate_main -generate_lang -generate_settings -generate_grf -generate_src - -check_path_characters diff --git a/findversion.sh b/findversion.sh deleted file mode 100755 index 28fcc121f7..0000000000 --- a/findversion.sh +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/sh - -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - - -# Arguments given? Show help text. -if [ "$#" != "0" ]; then - cat <\t\t\t -VERSION - a string describing what version of the code the current checkout is - based on. - This also includes the commit date, an indication of whether the checkout - was modified and which branch was checked out. This value is not - guaranteed to be sortable, but is mainly meant for identifying the - revision and user display. - - If no revision identifier could be found, this is left empty. -ISODATE - the commit date of the revision this checkout is based on. - The commit date may differ from the author date. - This can be used to decide upon the age of the source. - - If no timestamp could be found, this is left empty. -MODIFIED - Whether (the src directory of) this checkout is modified or not. A - value of 0 means not modified, a value of 2 means it was modified. - - A value of 1 means that the modified status is unknown, because this - is not an git checkout for example. - -HASH - the git revision hash - -By setting the AWK environment variable, a caller can determine which -version of "awk" is used. If nothing is set, this script defaults to -"awk". -EOF -exit 1; -fi - -# Allow awk to be provided by the caller. -if [ -z "$AWK" ]; then - AWK=awk -fi - -# Find out some dirs -cd `dirname "$0"` -ROOT_DIR=`pwd` - -# Determine if we are using a modified version -# Assume the dir is not modified -MODIFIED="0" -if [ -d "$ROOT_DIR/.git" ] || [ -f "$ROOT_DIR/.git" ]; then - # We are a git checkout - # Refresh the index to make sure file stat info is in sync, then look for modifications - git update-index --refresh >/dev/null - if [ -n "`git diff-index HEAD`" ]; then - MODIFIED="2" - fi - HASH=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null` - SHORTHASH=`echo ${HASH} | cut -c1-10` - ISODATE=`LC_ALL=C git show -s --pretty='format:%ci' HEAD | "$AWK" '{ gsub("-", "", $1); print $1 }'` - YEAR=`echo ${ISODATE} | cut -c1-4` - BRANCH="`git symbolic-ref -q HEAD 2>/dev/null | sed 's@.*/@@'`" - TAG="`git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\^0$@@'`" - - if [ "$MODIFIED" -eq "0" ]; then - hashprefix="-g" - elif [ "$MODIFIED" -eq "2" ]; then - hashprefix="-m" - else - hashprefix="-u" - fi - - if [ -n "$TAG" ]; then - VERSION="${TAG}" - ISTAG="1" - if [ -n "`echo \"${TAG}\" | grep \"^[0-9.]*$\"`" ]; then - ISSTABLETAG="1" - else - ISSTABLETAG="0" - fi - else - VERSION="${ISODATE}-${BRANCH}${hashprefix}${SHORTHASH}" - ISTAG="0" - ISSTABLETAG="0" - fi - -elif [ -f "$ROOT_DIR/.ottdrev" ]; then - # We are an exported source bundle - cat $ROOT_DIR/.ottdrev - exit -else - # We don't know - MODIFIED="1" - HASH="" - SHORTHASH="" - BRANCH="" - ISODATE="" - YEAR="" - TAG="" - VERSION="" - ISTAG="0" - ISSTABLETAG="0" -fi - -echo "$VERSION $ISODATE $MODIFIED $HASH $ISTAG $ISSTABLETAG $YEAR" diff --git a/projects/basesets_vs140.vcxproj b/projects/basesets_vs140.vcxproj deleted file mode 100644 index 4e5ed52c4a..0000000000 --- a/projects/basesets_vs140.vcxproj +++ /dev/null @@ -1,99 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v140 - - - - - - - - - ..\src\lang\afrikaans.txt;..\src\lang\arabic_egypt.txt;..\src\lang\basque.txt;..\src\lang\belarusian.txt;..\src\lang\brazilian_portuguese.txt;..\src\lang\bulgarian.txt;..\src\lang\catalan.txt;..\src\lang\croatian.txt;..\src\lang\czech.txt;..\src\lang\danish.txt;..\src\lang\dutch.txt;..\src\lang\english.txt;..\src\lang\english_AU.txt;..\src\lang\english_US.txt;..\src\lang\esperanto.txt;..\src\lang\estonian.txt;..\src\lang\faroese.txt;..\src\lang\finnish.txt;..\src\lang\french.txt;..\src\lang\gaelic.txt;..\src\lang\galician.txt;..\src\lang\german.txt;..\src\lang\greek.txt;..\src\lang\hebrew.txt;..\src\lang\hungarian.txt;..\src\lang\icelandic.txt;..\src\lang\indonesian.txt;..\src\lang\irish.txt;..\src\lang\italian.txt;..\src\lang\japanese.txt;..\src\lang\korean.txt;..\src\lang\latin.txt;..\src\lang\latvian.txt;..\src\lang\lithuanian.txt;..\src\lang\luxembourgish.txt;..\src\lang\malay.txt;..\src\lang\norwegian_bokmal.txt;..\src\lang\norwegian_nynorsk.txt;..\src\lang\polish.txt;..\src\lang\portuguese.txt;..\src\lang\romanian.txt;..\src\lang\russian.txt;..\src\lang\serbian.txt;..\src\lang\simplified_chinese.txt;..\src\lang\slovak.txt;..\src\lang\slovenian.txt;..\src\lang\spanish.txt;..\src\lang\spanish_MX.txt;..\src\lang\swedish.txt;..\src\lang\tamil.txt;..\src\lang\thai.txt;..\src\lang\traditional_chinese.txt;..\src\lang\turkish.txt;..\src\lang\ukrainian.txt;..\src\lang\vietnamese.txt;..\src\lang\welsh.txt - - - ..\bin\baseset\ - ..\objs\baseset\ - - - - Generating no_music.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_music.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_music.obm;%(Outputs) - - - Generating no_sound.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_sound.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_sound.obs;%(Outputs) - - - Generating orig_dos.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obg;%(Outputs) - - - Generating orig_dos.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obm;%(Outputs) - - - Generating orig_dos.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obs;%(Outputs) - - - Generating orig_dos_de.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos_de.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos_de.obg;%(Outputs) - - - Generating orig_tto.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_tto.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_tto.obm;%(Outputs) - - - Generating orig_win.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obg;%(Outputs) - - - Generating orig_win.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obm;%(Outputs) - - - Generating orig_win.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obs;%(Outputs) - - - - - - diff --git a/projects/basesets_vs140.vcxproj.filters b/projects/basesets_vs140.vcxproj.filters deleted file mode 100644 index aa555f3fc3..0000000000 --- a/projects/basesets_vs140.vcxproj.filters +++ /dev/null @@ -1,40 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - diff --git a/projects/basesets_vs140.vcxproj.filters.in b/projects/basesets_vs140.vcxproj.filters.in deleted file mode 100644 index 07bff4542f..0000000000 --- a/projects/basesets_vs140.vcxproj.filters.in +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - -!!FILES!! - - diff --git a/projects/basesets_vs140.vcxproj.in b/projects/basesets_vs140.vcxproj.in deleted file mode 100644 index 0471100a3e..0000000000 --- a/projects/basesets_vs140.vcxproj.in +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v140 - - - - - - - - -!!FILTERS!! - - - ..\bin\baseset\ - ..\objs\baseset\ - - -!!FILES!! - - - - - diff --git a/projects/basesets_vs141.vcxproj b/projects/basesets_vs141.vcxproj deleted file mode 100644 index a01f24989b..0000000000 --- a/projects/basesets_vs141.vcxproj +++ /dev/null @@ -1,99 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v141 - - - - - - - - - ..\src\lang\afrikaans.txt;..\src\lang\arabic_egypt.txt;..\src\lang\basque.txt;..\src\lang\belarusian.txt;..\src\lang\brazilian_portuguese.txt;..\src\lang\bulgarian.txt;..\src\lang\catalan.txt;..\src\lang\croatian.txt;..\src\lang\czech.txt;..\src\lang\danish.txt;..\src\lang\dutch.txt;..\src\lang\english.txt;..\src\lang\english_AU.txt;..\src\lang\english_US.txt;..\src\lang\esperanto.txt;..\src\lang\estonian.txt;..\src\lang\faroese.txt;..\src\lang\finnish.txt;..\src\lang\french.txt;..\src\lang\gaelic.txt;..\src\lang\galician.txt;..\src\lang\german.txt;..\src\lang\greek.txt;..\src\lang\hebrew.txt;..\src\lang\hungarian.txt;..\src\lang\icelandic.txt;..\src\lang\indonesian.txt;..\src\lang\irish.txt;..\src\lang\italian.txt;..\src\lang\japanese.txt;..\src\lang\korean.txt;..\src\lang\latin.txt;..\src\lang\latvian.txt;..\src\lang\lithuanian.txt;..\src\lang\luxembourgish.txt;..\src\lang\malay.txt;..\src\lang\norwegian_bokmal.txt;..\src\lang\norwegian_nynorsk.txt;..\src\lang\polish.txt;..\src\lang\portuguese.txt;..\src\lang\romanian.txt;..\src\lang\russian.txt;..\src\lang\serbian.txt;..\src\lang\simplified_chinese.txt;..\src\lang\slovak.txt;..\src\lang\slovenian.txt;..\src\lang\spanish.txt;..\src\lang\spanish_MX.txt;..\src\lang\swedish.txt;..\src\lang\tamil.txt;..\src\lang\thai.txt;..\src\lang\traditional_chinese.txt;..\src\lang\turkish.txt;..\src\lang\ukrainian.txt;..\src\lang\vietnamese.txt;..\src\lang\welsh.txt - - - ..\bin\baseset\ - ..\objs\baseset\ - - - - Generating no_music.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_music.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_music.obm;%(Outputs) - - - Generating no_sound.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_sound.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_sound.obs;%(Outputs) - - - Generating orig_dos.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obg;%(Outputs) - - - Generating orig_dos.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obm;%(Outputs) - - - Generating orig_dos.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obs;%(Outputs) - - - Generating orig_dos_de.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos_de.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos_de.obg;%(Outputs) - - - Generating orig_tto.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_tto.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_tto.obm;%(Outputs) - - - Generating orig_win.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obg;%(Outputs) - - - Generating orig_win.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obm;%(Outputs) - - - Generating orig_win.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obs;%(Outputs) - - - - - - diff --git a/projects/basesets_vs141.vcxproj.filters b/projects/basesets_vs141.vcxproj.filters deleted file mode 100644 index aa555f3fc3..0000000000 --- a/projects/basesets_vs141.vcxproj.filters +++ /dev/null @@ -1,40 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - diff --git a/projects/basesets_vs141.vcxproj.filters.in b/projects/basesets_vs141.vcxproj.filters.in deleted file mode 100644 index 07bff4542f..0000000000 --- a/projects/basesets_vs141.vcxproj.filters.in +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - -!!FILES!! - - diff --git a/projects/basesets_vs141.vcxproj.in b/projects/basesets_vs141.vcxproj.in deleted file mode 100644 index 69dbd2e078..0000000000 --- a/projects/basesets_vs141.vcxproj.in +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v141 - - - - - - - - -!!FILTERS!! - - - ..\bin\baseset\ - ..\objs\baseset\ - - -!!FILES!! - - - - - diff --git a/projects/basesets_vs142.vcxproj b/projects/basesets_vs142.vcxproj deleted file mode 100644 index d483708aa7..0000000000 --- a/projects/basesets_vs142.vcxproj +++ /dev/null @@ -1,99 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v142 - - - - - - - - - ..\src\lang\afrikaans.txt;..\src\lang\arabic_egypt.txt;..\src\lang\basque.txt;..\src\lang\belarusian.txt;..\src\lang\brazilian_portuguese.txt;..\src\lang\bulgarian.txt;..\src\lang\catalan.txt;..\src\lang\croatian.txt;..\src\lang\czech.txt;..\src\lang\danish.txt;..\src\lang\dutch.txt;..\src\lang\english.txt;..\src\lang\english_AU.txt;..\src\lang\english_US.txt;..\src\lang\esperanto.txt;..\src\lang\estonian.txt;..\src\lang\faroese.txt;..\src\lang\finnish.txt;..\src\lang\french.txt;..\src\lang\gaelic.txt;..\src\lang\galician.txt;..\src\lang\german.txt;..\src\lang\greek.txt;..\src\lang\hebrew.txt;..\src\lang\hungarian.txt;..\src\lang\icelandic.txt;..\src\lang\indonesian.txt;..\src\lang\irish.txt;..\src\lang\italian.txt;..\src\lang\japanese.txt;..\src\lang\korean.txt;..\src\lang\latin.txt;..\src\lang\latvian.txt;..\src\lang\lithuanian.txt;..\src\lang\luxembourgish.txt;..\src\lang\malay.txt;..\src\lang\norwegian_bokmal.txt;..\src\lang\norwegian_nynorsk.txt;..\src\lang\polish.txt;..\src\lang\portuguese.txt;..\src\lang\romanian.txt;..\src\lang\russian.txt;..\src\lang\serbian.txt;..\src\lang\simplified_chinese.txt;..\src\lang\slovak.txt;..\src\lang\slovenian.txt;..\src\lang\spanish.txt;..\src\lang\spanish_MX.txt;..\src\lang\swedish.txt;..\src\lang\tamil.txt;..\src\lang\thai.txt;..\src\lang\traditional_chinese.txt;..\src\lang\turkish.txt;..\src\lang\ukrainian.txt;..\src\lang\vietnamese.txt;..\src\lang\welsh.txt - - - ..\bin\baseset\ - ..\objs\baseset\ - - - - Generating no_music.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_music.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_music.obm;%(Outputs) - - - Generating no_sound.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)no_sound.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\no_sound.obs;%(Outputs) - - - Generating orig_dos.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obg;%(Outputs) - - - Generating orig_dos.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obm;%(Outputs) - - - Generating orig_dos.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos.obs;%(Outputs) - - - Generating orig_dos_de.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_dos_de.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_dos_de.obg;%(Outputs) - - - Generating orig_tto.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_tto.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_tto.obm;%(Outputs) - - - Generating orig_win.obg baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obg" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obg;%(Outputs) - - - Generating orig_win.obm baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obm" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obm;%(Outputs) - - - Generating orig_win.obs baseset metadata file - cscript //nologo ..\media\baseset\translations.vbs "%(FullPath)" "$(OutputPath)orig_win.obs" ..\src\lang ..\bin\baseset\orig_extra.grf - $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs) - ..\bin\baseset\orig_win.obs;%(Outputs) - - - - - - diff --git a/projects/basesets_vs142.vcxproj.filters b/projects/basesets_vs142.vcxproj.filters deleted file mode 100644 index aa555f3fc3..0000000000 --- a/projects/basesets_vs142.vcxproj.filters +++ /dev/null @@ -1,40 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - Baseset Metadata - - - diff --git a/projects/basesets_vs142.vcxproj.filters.in b/projects/basesets_vs142.vcxproj.filters.in deleted file mode 100644 index 07bff4542f..0000000000 --- a/projects/basesets_vs142.vcxproj.filters.in +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {b5a3ac67-19a9-4276-80e9-2360367d2680} - - - -!!FILES!! - - diff --git a/projects/basesets_vs142.vcxproj.in b/projects/basesets_vs142.vcxproj.in deleted file mode 100644 index 9743d83e7a..0000000000 --- a/projects/basesets_vs142.vcxproj.in +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Debug - Win32 - - - - basesets - {E12E77CA-C0F1-4ADA-943F-4929274249D3} - basesets - MakeFileProj - - - - Utility - false - v142 - - - - - - - - -!!FILTERS!! - - - ..\bin\baseset\ - ..\objs\baseset\ - - -!!FILES!! - - - - - diff --git a/projects/determineversion.vbs b/projects/determineversion.vbs deleted file mode 100755 index b70bcdf67c..0000000000 --- a/projects/determineversion.vbs +++ /dev/null @@ -1,216 +0,0 @@ -Option Explicit - -' This file is part of OpenTTD. -' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -Dim FSO -Set FSO = CreateObject("Scripting.FileSystemObject") - -Sub FindReplaceInFile(filename, to_find, replacement) - Dim file, data - Set file = FSO.OpenTextFile(filename, 1, 0, 0) - data = file.ReadAll - file.Close - data = Replace(data, to_find, replacement) - Set file = FSO.CreateTextFile(filename, -1, 0) - file.Write data - file.Close -End Sub - -Sub UpdateFile(modified, isodate, version, cur_date, githash, istag, isstabletag, year, filename) - FSO.CopyFile filename & ".in", filename - FindReplaceInFile filename, "!!MODIFIED!!", modified - FindReplaceInFile filename, "!!ISODATE!!", isodate - FindReplaceInFile filename, "!!VERSION!!", version - FindReplaceInFile filename, "!!DATE!!", cur_date - FindReplaceInFile filename, "!!GITHASH!!", githash - FindReplaceInFile filename, "!!ISTAG!!", istag - FindReplaceInFile filename, "!!ISSTABLETAG!!", isstabletag - FindReplaceInFile filename, "!!YEAR!!", year -End Sub - -Sub UpdateFiles(version) - Dim modified, isodate, cur_date, githash, istag, isstabletag, year - cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date) - - If InStr(version, Chr(9)) Then - ' Split string into field with tails - isodate = Mid(version, InStr(version, Chr(9)) + 1) - modified = Mid(isodate, InStr(isodate, Chr(9)) + 1) - githash = Mid(modified, InStr(modified, Chr(9)) + 1) - istag = Mid(githash, InStr(githash, Chr(9)) + 1) - isstabletag = Mid(istag, InStr(istag, Chr(9)) + 1) - year = Mid(isstabletag, InStr(isstabletag, Chr(9)) + 1) - ' Remove tails from fields - version = Mid(version, 1, InStr(version, Chr(9)) - 1) - isodate = Mid(isodate, 1, InStr(isodate, Chr(9)) - 1) - modified = Mid(modified, 1, InStr(modified, Chr(9)) - 1) - githash = Mid(githash, 1, InStr(githash, Chr(9)) - 1) - istag = Mid(istag, 1, InStr(istag, Chr(9)) - 1) - isstabletag = Mid(isstabletag, 1, InStr(isstabletag, Chr(9)) - 1) - Else - isodate = 0 - modified = 1 - githash = "" - istag = 0 - isstabletag = 0 - year = "" - End If - - UpdateFile modified, isodate, version, cur_date, githash, istag, isstabletag, year, "../src/rev.cpp" - UpdateFile modified, isodate, version, cur_date, githash, istag, isstabletag, year, "../src/os/windows/ottdres.rc" -End Sub - -Function DetermineVersion() - Dim WshShell, branch, tag, modified, isodate, oExec, line, hash, shorthash, year - Set WshShell = CreateObject("WScript.Shell") - On Error Resume Next - - modified = 0 - hash = "" - shorthash = "" - branch = "" - isodate = "" - tag = "" - year = "" - - ' Set the environment to english - WshShell.Environment("PROCESS")("LANG") = "en" - - Set oExec = WshShell.Exec("git rev-parse --verify HEAD") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - - If oExec.ExitCode = 0 Then - hash = oExec.StdOut.ReadLine() - shorthash = Mid(hash, 1, 10) - ' Make sure index is in sync with disk - Set oExec = WshShell.Exec("git update-index --refresh") - If Err.Number = 0 Then - ' StdOut and StdErr share a 4kB buffer so prevent it from filling up as we don't care about the output - oExec.StdOut.Close - oExec.StdErr.Close - ' Wait till the application is finished ... - Do While oExec.Status = 0 - WScript.Sleep 10 - Loop - End If - Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - - If oExec.ExitCode = 1 Then - modified = 2 - End If ' oExec.ExitCode = 1 - - Set oExec = WshShell.Exec("git show -s --pretty=format:%ci") - if Err.Number = 0 Then - isodate = Mid(oExec.StdOut.ReadLine(), 1, 10) - isodate = Replace(isodate, "-", "") - year = Mid(isodate, 1, 4) - End If ' Err.Number = 0 - - ' Check branch - Err.Clear - Set oExec = WshShell.Exec("git symbolic-ref HEAD") - If Err.Number = 0 Then - line = oExec.StdOut.ReadLine() - branch = Mid(line, InStrRev(line, "/") + 1) - End If ' Err.Number = 0 - - ' Check if a tag is currently checked out - Err.Clear - Set oExec = WshShell.Exec("git name-rev --name-only --tags --no-undefined HEAD") - If Err.Number = 0 Then - ' Wait till the application is finished ... - Do While oExec.Status = 0 - Loop - If oExec.ExitCode = 0 Then - tag = oExec.StdOut.ReadLine() - If Right(tag, 2) = "^0" Then - tag = Left(tag, Len(tag) - 2) - End If - End If ' oExec.ExitCode = 0 - End If ' Err.Number = 0 - End If ' Err.Number = 0 - End If ' oExec.ExitCode = 0 - End If ' Err.Number = 0 - - If hash = "" And FSO.FileExists("../.ottdrev") Then - Dim rev_file - Set rev_file = FSO.OpenTextFile("../.ottdrev", 1, True, 0) - DetermineVersion = rev_file.ReadLine() - rev_file.Close() - ElseIf hash = "" Then - DetermineVersion = "norev000" - modified = 1 - Else - Dim version, hashprefix, istag, isstabletag - If modified = 0 Then - hashprefix = "-g" - ElseIf modified = 2 Then - hashprefix = "-m" - Else - hashprefix = "-u" - End If - - If tag <> "" Then - version = tag - istag = 1 - - Set stable_regexp = New RegExp - stable_regexp.Pattern = "^[0-9.]*$" - If stable_regexp.Test(tag) Then - isstabletag = 1 - Else - isstabletag = 0 - End If - Else - version = isodate & "-" & branch & hashprefix & shorthash - istag = 0 - isstabletag = 0 - End If - - DetermineVersion = version & Chr(9) & isodate & Chr(9) & modified & Chr(9) & hash & Chr(9) & istag & Chr(9) & isstabletag & Chr(9) & year - End If -End Function - -Function IsCachedVersion(ByVal version) - Dim cache_file, cached_version - cached_version = "" - Set cache_file = FSO.OpenTextFile("../config.cache.version", 1, True, 0) - If Not cache_file.atEndOfStream Then - cached_version = cache_file.ReadLine() - End If - cache_file.Close - - If InStr(version, Chr(9)) Then - version = Mid(version, 1, Instr(version, Chr(9)) - 1) - End If - - If version <> cached_version Then - Set cache_file = fso.CreateTextFile("../config.cache.version", True) - cache_file.WriteLine(version) - cache_file.Close - IsCachedVersion = False - Else - IsCachedVersion = True - End If -End Function - -Function CheckFile(filename) - CheckFile = FSO.FileExists(filename) - If CheckFile Then CheckFile = (FSO.GetFile(filename).DateLastModified >= FSO.GetFile(filename & ".in").DateLastModified) -End Function - -Dim version -version = DetermineVersion -If Not (IsCachedVersion(version) And CheckFile("../src/rev.cpp") And CheckFile("../src/os/windows/ottdres.rc")) Then - UpdateFiles version -End If diff --git a/projects/dpi_aware.manifest b/projects/dpi_aware.manifest deleted file mode 100644 index ee1c7ea224..0000000000 --- a/projects/dpi_aware.manifest +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - True/PM - - - - - - - - - - - - - - - - - diff --git a/projects/gen-kdev4.sh b/projects/gen-kdev4.sh deleted file mode 100755 index 2062d9686a..0000000000 --- a/projects/gen-kdev4.sh +++ /dev/null @@ -1,201 +0,0 @@ -#!/bin/sh - -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# echo without interpretation of backslash escapes and without -# adding newline at the end - just the string as it is -rawprint() -{ - printf '%s' "$@" -} - -encode_dword() -{ - printf '\x%02x' \ - `expr $1 / 16777216 % 256` \ - `expr $1 / 65536 % 256` \ - `expr $1 / 256 % 256` \ - `expr $1 % 256` -} - -encode_string() -{ - # turn string into UTF-16 and hexdump it - hex_utf16=`rawprint "$1" | iconv -t UTF-16BE | od -t x1 -A n | tr -d -c '[:xdigit:]'`; - - encode_dword `rawprint "$hex_utf16" | wc -m | xargs -I {} expr {} / 2` # length = num hex digits / 2 - rawprint "$hex_utf16" | sed 's/../\\x&/g' # put '\x' prefix before every pair of digits -} - -encode_single_define() -{ - encode_string `rawprint "$1" | grep -o '^[^=]*'` # everything before '=' - rawprint '\x00\x00\x00\n\x00' - encode_string `rawprint "$1" | sed 's/^[^=]*=\?//'` # everything after '=' -} - -# $1 - newline-separated list of defines -encode_defines() -{ - # add some fixed defines and discard empty lines from the tail - defines=`printf 'va_list\nva_args\n%s' "$1"` - - # count lines (no newline at the end so add one) - encode_dword `printf '%s\n' "$defines" | wc -l` - - while [ -n "$defines" ]; do - encode_single_define `rawprint "$defines" | head -n 1` - defines=`rawprint "$defines" | tail -n +2` - done -} - -encode_includes() -{ - encode_dword 3 # number of custom includes - encode_string "$1/src/stdafx.h" - encode_string "$1/objs/lang" - encode_string "$1/objs/setting" -} - -# escape with a backslash (\) characters special to the sed replace string: \ & -# also escape our custom filed separator that we will be using in sed: @ -escape_sed_special() -{ - sed -e 's/[\&@]/\\&/g' -} - - - -PROJECT_DIR=`pwd` -DIR_NAME=`pwd | xargs -0 basename` - -USAGE_TEXT='Usage: - - projects/gen-kdev4 [PROJECT_NAME|-h|--help] - -PROJECT_NAME is the name of the project that will be displayed in KDevelop. -Before executing, cd into OpenTTD folder and run ./configure script. - --h, --help - print help and exit' - -case "$# $1" in - '1 -h' | '1 --help') printf 'Generate OpenTTD project files for KDevelop 4+\n\n%s\n' "$USAGE_TEXT"; exit 0;; - 1*) PROJECT_NAME="$1";; - 0*) PROJECT_NAME="$DIR_NAME";; - *) printf 'Wrong arguments given. %s\n' "$USAGE_TEXT" >&2; exit 1;; -esac - -CFLAGS=`grep '^using CFLAGS\.\.\.' config.log 2>/dev/null` -if [ -z "$CFLAGS" ]; then - echo "OpenTTD config.log not found" >&2 - echo "cd into OpenTTD first and run 'configure'" >&2 - exit 1 -fi -DEFINES=`eval "printf '%s\n' $CFLAGS" | grep '^\-D' | cut -c3-` - -PROJECT_NAME_SED=s@!!PROJECT_NAME!!@`rawprint "$PROJECT_NAME" | escape_sed_special`@g -PROJECT_DIR_SED=s@!!PROJECT_DIR!!@`rawprint "$PROJECT_DIR" | escape_sed_special`@g -CUSTOM_DEFINES_SED=s@!!CUSTOM_DEFINES!!@`encode_defines "$DEFINES" | escape_sed_special`@g -CUSTOM_INCLUDES_SED=s@!!CUSTOM_INCLUDES!!@`encode_includes "$PROJECT_DIR" | escape_sed_special`@g - -mkdir -p .kdev4 - -sed -e "$PROJECT_NAME_SED" \ - >"$PROJECT_DIR/$DIR_NAME.kdev4" \ - << "EOF" -[Project] -Manager=KDevCustomMakeManager -Name=!!PROJECT_NAME!! -EOF - -sed -e "$PROJECT_DIR_SED" -e "$CUSTOM_DEFINES_SED" -e "$CUSTOM_INCLUDES_SED" \ - >"$PROJECT_DIR/.kdev4/$DIR_NAME.kdev4" \ - << "EOF" -[CustomDefinesAndIncludes][ProjectPath0] -Defines=!!CUSTOM_DEFINES!! -Includes=!!CUSTOM_INCLUDES!! -Path=. - -[Defines And Includes][Compiler] -Name=GCC -Path=gcc -Type=GCC - -[Filters] -size=10 - -[Filters][0] -inclusive=0 -pattern=.* -targets=3 - -[Filters][1] -inclusive=0 -pattern=.svn -targets=2 - -[Filters][2] -inclusive=0 -pattern=.hg -targets=2 - -[Filters][3] -inclusive=0 -pattern=.git -targets=2 - -[Filters][4] -inclusive=0 -pattern=*.rej -targets=1 - -[Filters][5] -inclusive=0 -pattern=*.orig -targets=1 - -[Filters][6] -inclusive=0 -pattern=*~ -targets=1 - -[Filters][7] -inclusive=0 -pattern=.*.kate-swp -targets=1 - -[Filters][8] -inclusive=0 -pattern=.*.swp -targets=1 - -[Filters][9] -inclusive=0 -pattern=/objs -targets=2 - -[Launch] -Launch Configurations=Launch Configuration 0 - -[Launch][Launch Configuration 0] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=Launch OpenTTD\s -Type=Native Application - -[Launch][Launch Configuration 0][Data] -Arguments=-d 1 -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00) -Dependency Action=Nothing -EnvironmentGroup= -Executable=file://!!PROJECT_DIR!!/bin/openttd -External Terminal=konsole --noclose --workdir %workdir -e %exe -Project Target= -Use External Terminal=false -Working Directory=file://!!PROJECT_DIR!!/bin -isExecutable=true -EOF diff --git a/projects/generate b/projects/generate deleted file mode 100755 index 7d3c599654..0000000000 --- a/projects/generate +++ /dev/null @@ -1,337 +0,0 @@ -#!/bin/bash - -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# This file generates all project files based on sources.list, so everyone who -# can start a bash process, can update the project files. - -# Set neutral locale so sort behaves the same everywhere -LC_ALL=C -export LC_ALL - -# We really need gawk for this! -AWK=gawk - -${AWK} --version > /dev/null 2> /dev/null -if [ "$?" != "0" ]; then - echo "This script needs gawk to run properly" - exit 1 -fi - -ROOT_DIR="`pwd`/.." -if ! [ -e "$ROOT_DIR/source.list" ] -then - ROOT_DIR="`pwd`" -fi -if ! [ -e "$ROOT_DIR/source.list" ] -then - echo "Can't find source.list, needed in order to make this run. Please go to either" - echo " the project dir, or the root dir of a clean SVN checkout." - exit 1 -fi - -# openttd_vs142.sln is for MSVC 2019 -# openttd_vs142.vcxproj is for MSVC 2019 -# openttd_vs142.vcxproj.filters is for MSVC 2019 -# langs_vs142.vcxproj is for MSVC 2019 -# strgen_vs142.vcxproj is for MSVC 2019 -# strgen_vs142.vcxproj.filters is for MSVC 2019 -# generate_vs142.vcxproj is for MSVC 2019 -# version_vs142.vcxproj is for MSVC 2019 -# basesets_vs142.vcxproj is for MSVC 2019 - -# openttd_vs141.sln is for MSVC 2017 -# openttd_vs141.vcxproj is for MSVC 2017 -# openttd_vs141.vcxproj.filters is for MSVC 2017 -# langs_vs141.vcxproj is for MSVC 2017 -# strgen_vs141.vcxproj is for MSVC 2017 -# strgen_vs141.vcxproj.filters is for MSVC 2017 -# generate_vs141.vcxproj is for MSVC 2017 -# version_vs141.vcxproj is for MSVC 2017 -# basesets_vs141.vcxproj is for MSVC 2017 - -# openttd_vs140.sln is for MSVC 2015 -# openttd_vs140.vcxproj is for MSVC 2015 -# openttd_vs140.vcxproj.filters is for MSVC 2015 -# langs_vs140.vcxproj is for MSVC 2015 -# strgen_vs140.vcxproj is for MSVC 2015 -# strgen_vs140.vcxproj.filters is for MSVC 2015 -# generate_vs140.vcxproj is for MSVC 2015 -# version_vs140.vcxproj is for MSVC 2015 -# basesets_vs140.vcxproj is for MSVC 2015 - - - - -# First, collect the list of Windows files -allegro_config="" -sdl_config="1" -sdl2_config="1" -png_config="1" -os="MSVC" -enable_dedicated="0" -enable_ai="1" -with_cocoa="0" -enable_directmusic="1" -enable_fluidsynth="0" -with_threads="1" -file_prefix="..\\\\\\\\src\\\\\\\\" - -safety_check() { - li="" - for i in `cat $1 | grep -v "#\|ottdres.rc\|win32.cpp\|win32_v.cpp" | xargs -n 1 basename | sort`; do - if [ "$li" = "$i" ]; then - echo " !! ERROR !!" - echo "" - echo "The filename '$i' is already used in this project." - echo "Because MSVC uses one single directory for all object files, it" - echo "cannot handle filenames with the same name inside the same project." - echo "Please rename either one of the file and try generating again." - echo "" - echo " !! ERROR !!" - exit 1 - fi - li="$i" - done -} - -grep '\.h' "$ROOT_DIR/source.list" | grep -v '../objs/langs/table/strings.h\|../objs/settings/table/settings.h' | sed 's/ //g' | sort > tmp.headers.source.list -find "$ROOT_DIR/src" \( -iname "*.h" -or -iname "*.hpp" \) -and -not -ipath "*/.svn/*" | sed "s~$ROOT_DIR/src/~~" | sort > tmp.headers.src -if [ -n "`diff tmp.headers.source.list tmp.headers.src`" ]; then - echo "The following headers are missing in source.list and not in /src/ or vice versa." - diff tmp.headers.source.list tmp.headers.src | grep '[<>]' | sort - echo "" -fi -rm tmp.headers.* - -load_main_data() { - # Read the source.list and process it - RES="`cat $1 | ${AWK} -v BINMODE=1 ' - { gsub("\\r", "", $0); } - /^( *)#end/ { if (deep == skip) { skip -= 1; } deep -= 1; next; } - /^( *)#else/ { if (deep == skip) { skip -= 1; } else if (deep - 1 == skip) { skip += 1; } next; } - /^( *)#if/ { - gsub(" ", "", $0); - gsub("^#if", "", $0); - gsub("^ ", "", $0); - - if (deep != skip) { deep += 1; next; } - - deep += 1; - - if ($0 == "ALLEGRO" && "'$allegro_config'" == "") { next; } - if ($0 == "SDL" && "'$sdl_config'" == "") { next; } - if ($0 == "SDL2" && "'$sdl2_config'" == "") { next; } - if ($0 == "PNG" && "'$png_config'" == "") { next; } - if ($0 == "OSX" && "'$os'" != "OSX") { next; } - if ($0 == "OS2" && "'$os'" != "OS2") { next; } - if ($0 == "DOS" && "'$os'" != "DOS") { next; } - if ($0 == "DEDICATED" && "'$enable_dedicated'" != "1") { next; } - if ($0 == "AI" && "'$enable_ai'" == "0") { next; } - if ($0 == "COCOA" && "'$with_cocoa'" == "0") { next; } - if ($0 == "HAIKU" && "'$os'" != "HAIKU") { next; } - if ($0 == "WIN32" && "'$os'" != "MINGW" && - "'$os'" != "CYGWIN" && "'$os'" != "MSVC" ) { next; } - if ($0 == "MSVC" && "'$os'" != "MSVC") { next; } - if ($0 == "DIRECTMUSIC" && "'$enable_directmusic'" != "1") { next; } - if ($0 == "FLUIDSYNTH" && "'$enable_fluidsynth'" != "1") { next; } - if ($0 == "USE_XAUDIO2" && "'$with_xaudio2'" == "0") { next; } - if ($0 == "USE_THREADS" && "'$with_threads'" == "0") { next; } - - skip += 1; - - next; - } - /^( *)#/ { - if (deep == skip) { - gsub(" ", "", $0); - gsub("^#", "", $0); - gsub("^ ", "", $0); - filter = $0; - print "#3 "; - printf "#3 {c76ff9f1-1e62-46d8-8d55-%012d}\n", i; - print "#3 "; - i += 1; - } - - next; - } - /^$/ { next } - { - if (deep == skip) { - gsub(" ", "", $0); - gsub("/", "\\\\\\\\", $0); - split($0, file, "."); - cltype = "ClInclude" - if (file[2] == "cpp") cltype = "ClCompile"; - if (file[2] == "rc") cltype = "ResourceCompile"; - print "#2 <"cltype" Include=\\"'$file_prefix'"$0"\\" />"; - print "#4 <"cltype" Include=\\"'$file_prefix'"$0"\\">"; - print "#4 "filter""; - print "#4 "; - } - } - '`" - - eval "$2=\"\$RES\"" -} - -load_lang_data() { - RES="" - # Windows Folder sort and Linux Folder sort are slightly different. - # By removing the extension and sorting it on Linux, they are the same. - for i in `ls $1 | sed s~.txt$~~g | sort` - do - i=`basename $i` - if [ "$i" == "english" ] - then - continue - fi - RES="$RES -#2 -#2 Generating "$i" language file -#2 ..\\\\objs\\\\strgen\\\\strgen.exe -s ..\\\\src\\\\lang -d ..\\\\bin\\\\lang \"%(FullPath)\" -#2 ..\\\\src\\\\lang\\\\english.txt;..\\\\objs\\\\strgen\\\\strgen.exe;%(AdditionalInputs) -#2 ..\\\\bin\\\\lang\\\\"$i".lng;%(Outputs) -#2 -#3 -#3 Translations -#3 " - done - - eval "$2=\"\$RES\"" -} - -load_settings_data() { - RES="" - RES2=" -#3..\\\\objs\\\\settings\\\\settings_gen.exe -o ..\\\\objs\\\\settings\\\\table\\\\settings.h -b ..\\\\src\\\\table\\\\settings.h.preamble -a ..\\\\src\\\\table\\\\settings.h.postamble" - for i in `ls $1` - do - i=`basename $i` - RES="$RES -#2 -#4 -#4 INI -#4 " - RES2="$RES2 ..\\\\src\\\\table\\\\"$i - done - - eval "$2=\"\$RES\$RES2\"" -} - -load_baseset_data() { - FIRST="" - RES="" - RES2=" -#4 " - # Windows Folder sort and Linux Folder sort are slightly different. - # By removing the extension and sorting it on Linux, they are the same. - for i in `ls $2 | sed s~.txt$~~g | sort` - do - if [ "$FIRST" != "" ]; then - RES2="$RES2;" - else - FIRST=1 - fi - i=`basename $i` - RES2="$RES2..\\\\src\\\\lang\\\\$i.txt" - done - RES2="$RES2" - # Windows Folder sort and Linux Folder sort are slightly different. - # By fiddling with the extension and sorting it on Linux, they are the same. - for i in `ls $1 | sed s~\\\.~000~g | sort | sed s~000~.~g` - do - i=`basename $i` - RES="$RES -#2 -#2 Generating "$i" baseset metadata file -#2 cscript //nologo ..\\\\media\\\\baseset\\\\translations.vbs \"%(FullPath)\" \"\$(OutputPath)$i\" ..\\\\src\\\\lang ..\\\\bin\\\\baseset\\\\orig_extra.grf -#2 \$(Langs);..\\\\bin\\\\baseset\\\\orig_extra.grf;%(AdditionalInputs) -#2 ..\\\\bin\\\\baseset\\\\"$i";%(Outputs) -#2 -#3 -#3 Baseset Metadata -#3 " - done - - eval "$3=\"\$RES\$RES2\"" -} - -generate() { - echo "Generating $2..." - # Everything above the !!FILTERS!! marker - cat "$ROOT_DIR/projects/$2".in | ${AWK} -v BINMODE=1 -v FILTERS="$3" -v FILES="$1" ' - /^$/ { next } - /!!FILTERS!!/ { - split(FILTERS, filters, "\n"); - for (i = 1; filters[i] != ""; i++) { - line = $0 - gsub(/!!FILTERS!!/, filters[i], line); - print line; - } - next; - } - /!!FILES!!/ { - split(FILES, files, "\n"); - for (i = 1; files[i] != ""; i++) { - line = $0 - gsub(/!!FILES!!/, files[i], line); - print line; - } - next; - } - { - print $0; - } - ' > "$ROOT_DIR/projects/$2" -} - -safety_check "$ROOT_DIR/source.list" - -load_main_data "$ROOT_DIR/source.list" openttd -openttdfiles=`echo "$openttd" | grep "^#4" | sed "s~#4~~g"` -openttdfilters=`echo "$openttd" | grep "^#3" | sed "s~#3~~g"` -openttdvcxproj=`echo "$openttd" | grep "^#2" | sed "s~#2~~g"` - -load_lang_data "$ROOT_DIR/src/lang/*.txt" lang -langfiles=`echo "$lang" | grep "^#3" | sed "s~#3~~g"` -langvcxproj=`echo "$lang" | grep "^#2" | sed "s~#2~~g"` - -load_settings_data "$ROOT_DIR/src/table/*.ini" settings -settingsfiles=`echo "$settings" | grep "^#4" | sed "s~#4~~g"` -settingscommand=`echo "$settings" | grep "^#3" | sed "s~#3~~g"` -settingsvcxproj=`echo "$settings" | grep "^#2" | sed "s~#2~~g"` - -load_baseset_data "$ROOT_DIR/media/baseset/*.ob?" "$ROOT_DIR/src/lang/*.txt" baseset -basesetfiles=`echo "$baseset" | grep "^#3" | sed "s-#3--g"` -basesetvcxproj=`echo "$baseset" | grep "^#2" | sed "s~#2~~g"` -basesetlangs=`echo "$baseset" | grep "^#4" | sed "s~#4~~g"` - -generate "$openttdvcxproj" "openttd_vs140.vcxproj" -generate "$openttdfiles" "openttd_vs140.vcxproj.filters" "$openttdfilters" -generate "$openttdvcxproj" "openttd_vs141.vcxproj" -generate "$openttdfiles" "openttd_vs141.vcxproj.filters" "$openttdfilters" -generate "$openttdvcxproj" "openttd_vs142.vcxproj" -generate "$openttdfiles" "openttd_vs142.vcxproj.filters" "$openttdfilters" -generate "$langvcxproj" "langs_vs140.vcxproj" -generate "$langfiles" "langs_vs140.vcxproj.filters" -generate "$langvcxproj" "langs_vs141.vcxproj" -generate "$langfiles" "langs_vs141.vcxproj.filters" -generate "$langvcxproj" "langs_vs142.vcxproj" -generate "$langfiles" "langs_vs142.vcxproj.filters" -generate "$settingsvcxproj" "settings_vs140.vcxproj" "$settingscommand" -generate "$settingsfiles" "settings_vs140.vcxproj.filters" -generate "$settingsvcxproj" "settings_vs141.vcxproj" "$settingscommand" -generate "$settingsfiles" "settings_vs141.vcxproj.filters" -generate "$settingsvcxproj" "settings_vs142.vcxproj" "$settingscommand" -generate "$settingsfiles" "settings_vs142.vcxproj.filters" -generate "$basesetvcxproj" "basesets_vs140.vcxproj" "$basesetlangs" -generate "$basesetfiles" "basesets_vs140.vcxproj.filters" -generate "$basesetvcxproj" "basesets_vs141.vcxproj" "$basesetlangs" -generate "$basesetfiles" "basesets_vs141.vcxproj.filters" -generate "$basesetvcxproj" "basesets_vs142.vcxproj" "$basesetlangs" -generate "$basesetfiles" "basesets_vs142.vcxproj.filters" diff --git a/projects/generate.vbs b/projects/generate.vbs deleted file mode 100644 index 577dce9558..0000000000 --- a/projects/generate.vbs +++ /dev/null @@ -1,414 +0,0 @@ -Option Explicit - -' This file is part of OpenTTD. -' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -Dim FSO -Set FSO = CreateObject("Scripting.FileSystemObject") - -' openttd_vs142.sln is for MSVC 2019 -' openttd_vs142.vcxproj is for MSVC 2019 -' openttd_vs142.vcxproj.filters is for MSVC 2019 -' langs_vs142.vcxproj is for MSVC 2019 -' strgen_vs142.vcxproj is for MSVC 2019 -' strgen_vs142.vcxproj.filters is for MSVC 2019 -' generate_vs142.vcxproj is for MSVC 2019 -' version_vs142.vcxproj is for MSVC 2019 -' basesets_vs142.vcxproj is for MSVC 2019 - -' openttd_vs141.sln is for MSVC 2017 -' openttd_vs141.vcxproj is for MSVC 2017 -' openttd_vs141.vcxproj.filters is for MSVC 2017 -' langs_vs141.vcxproj is for MSVC 2017 -' strgen_vs141.vcxproj is for MSVC 2017 -' strgen_vs141.vcxproj.filters is for MSVC 2017 -' generate_vs141.vcxproj is for MSVC 2017 -' version_vs141.vcxproj is for MSVC 2017 -' basesets_vs141.vcxproj is for MSVC 2017 - -' openttd_vs140.sln is for MSVC 2015 -' openttd_vs140.vcxproj is for MSVC 2015 -' openttd_vs140.vcxproj.filters is for MSVC 2015 -' langs_vs140.vcxproj is for MSVC 2015 -' strgen_vs140.vcxproj is for MSVC 2015 -' strgen_vs140.vcxproj.filters is for MSVC 2015 -' generate_vs140.vcxproj is for MSVC 2015 -' version_vs140.vcxproj is for MSVC 2015 -' basesets_vs140.vcxproj is for MSVC 2015 - -Sub safety_check(filename) - Dim file, line, regexp, list - - ' Define regexp - Set regexp = New RegExp - regexp.Pattern = "#|ottdres.rc|win32.cpp|win32_v.cpp" - regexp.Global = True - - ' We use a dictionary to check duplicates - Set list = CreateObject("Scripting.Dictionary") - - Set file = FSO.OpenTextFile(filename, 1, 0, 0) - While Not file.AtEndOfStream - line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs - If Len(line) > 0 And Not regexp.Test(line) Then - line = FSO.GetFileName(line) - if list.Exists(line) Then - WScript.Echo " !! ERROR !!" _ - & vbCrLf & "" _ - & vbCrLf & "The filename '" & line & "' is already used in this project." _ - & vbCrLf & "Because MSVC uses one single directory for all object files, it" _ - & vbCrLf & "cannot handle filenames with the same name inside the same project." _ - & vbCrLf & "Please rename either one of the file and try generating again." _ - & vbCrLf & "" _ - & vbCrLf & " !! ERROR !!" - WScript.Quit(1) - End If - list.Add line, line - End If - Wend - file.Close -End Sub - -Sub get_files(srcdir, dir, list) - Dim file, filename - Dim rekeep, reskip - - ' pattern for files to keep - Set rekeep = New RegExp - rekeep.Pattern = "\.h(pp)?$" - rekeep.Global = True - - ' pattern for files to exclude - Set reskip = New RegExp - reskip.Pattern = "\.svn" - reskip.Global = True - - For Each file in dir.Files - filename = Replace(file.path, srcdir, "") ' Remove */src/ - filename = Replace(filename, "\", "/") ' Replace separators - If rekeep.Test(filename) And Not reskip.Test(filename) Then - list.Add filename, filename - End If - Next -End Sub - -Sub get_dir_files(srcdir, dir, list) - Dim folder - ' Get files - get_files srcdir, dir, list - - ' Recurse in subfolders - For Each folder in dir.SubFolders - get_dir_files srcdir, folder, list - Next -End Sub - -Sub headers_check(filename, dir) - Dim source_list_headers, src_dir_headers, regexp, line, file, str - - ' Define regexp for source.list parsing - Set regexp = New RegExp - regexp.Pattern = "\.h" - regexp.Global = True - - ' Parse source.list and store headers in a dictionary - Set source_list_headers = CreateObject("Scripting.Dictionary") - Set file = FSO.OpenTextFile(filename, 1, 0, 0) - While Not file.AtEndOfStream - line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs - If Len(line) > 0 And regexp.Test(line) And line <> "../objs/langs/table/strings.h" And line <> "../objs/settings/table/settings.h" Then - source_list_headers.Add line, line - End If - Wend - file.Close() - - ' Get header files in /src/ - Set src_dir_headers = CreateObject("Scripting.Dictionary") - get_dir_files dir, FSO.GetFolder(dir), src_dir_headers - - ' Finding files in source.list but not in /src/ - For Each line In source_list_headers - If Not src_dir_headers.Exists(line) Then - str = str & "< " & line & vbCrLf - End If - Next - - ' Finding files in /src/ but not in source.list - For Each line In src_dir_headers - If Not source_list_headers.Exists(line) Then - str = str & "> " & line & vbCrLf - End If - Next - - ' Display the missing files if any - If str <> "" Then - str = "The following headers are missing in source.list and not in /src/ or vice versa." _ - & vbCrLf & str - WScript.Echo str - End If -End Sub - -Sub load_main_data(filename, ByRef vcxproj, ByRef filters, ByRef files) - Dim file, line, deep, skip, first_filter, first_file, filter, cltype, index - index = 0 - ' Read the source.list and process it - Set file = FSO.OpenTextFile(filename, 1, 0, 0) - While Not file.AtEndOfStream - line = Replace(file.ReadLine, Chr(9), "") ' Remove tabs - If Len(line) > 0 Then - Select Case Split(line, " ")(0) - Case "#end" - If deep = skip Then skip = skip - 1 - deep = deep - 1 - Case "#else" - If deep = skip Then - skip = skip - 1 - ElseIf deep - 1 = skip Then - skip = skip + 1 - End If - Case "#if" - line = Replace(line, "#if ", "") - If deep = skip And ( _ - line = "SDL" Or _ - line = "SDL2" Or _ - line = "PNG" Or _ - line = "WIN32" Or _ - line = "MSVC" Or _ - line = "DIRECTMUSIC" Or _ - line = "AI" Or _ - line = "USE_SSE" Or _ - line = "USE_XAUDIO2" Or _ - line = "USE_THREADS" _ - ) Then skip = skip + 1 - deep = deep + 1 - Case "#" - if deep = skip Then - line = Replace(line, "# ", "") - if first_filter <> 0 Then - filters = filters & vbCrLf - Else - first_filter = 1 - End If - filter = line - filters = filters & _ - " " & vbCrLf & _ - " {c76ff9f1-1e62-46d8-8d55-" & String(12 - Len(CStr(index)), "0") & index & "}" & vbCrLf & _ - " " - index = index + 1 - End If - Case Else - If deep = skip Then - line = Replace(line, "/" ,"\") - if first_file <> 0 Then - vcxproj = vcxproj & vbCrLf - files = files & vbCrLf - Else - first_file = 1 - End If - Select Case Split(Line, ".")(1) - Case "cpp" - cltype = "ClCompile" - Case "rc" - cltype = "ResourceCompile" - Case Else - cltype = "ClInclude" - End Select - vcxproj = vcxproj & " <" & cltype & " Include="& Chr(34) & "..\src\" & line & Chr(34) & " />" - files = files & _ - " <" & cltype & " Include="& Chr(34) & "..\src\" & line & Chr(34) & ">" & vbCrLf & _ - " " & filter & "" & vbCrLf & _ - " " - End If - End Select - End If - Wend - file.Close() -End Sub - -Sub load_lang_data(dir, ByRef vcxproj, ByRef files) - Dim folder, file, first_time - Set folder = FSO.GetFolder(dir) - For Each file In folder.Files - file = FSO.GetFileName(file) - If file <> "english.txt" And FSO.GetExtensionName(file) = "txt" Then - file = Left(file, Len(file) - 4) - If first_time <> 0 Then - vcxproj = vcxproj & vbCrLf - files = files & vbCrLf - Else - first_time = 1 - End If - vcxproj = vcxproj & _ - " " & vbCrLf & _ - " Generating " & file & " language file" & vbCrLf & _ - " ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang " & Chr(34) & "%(FullPath)" & Chr(34) & "" & vbCrLf & _ - " ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)" & vbCrLf & _ - " ..\bin\lang\" & file & ".lng;%(Outputs)" & vbCrLf & _ - " " - files = files & _ - " " & vbCrLf & _ - " Translations" & vbCrLf & _ - " " - End If - Next -End Sub - -Sub load_settings_data(dir, ByRef vcxproj, ByRef command, ByRef files) - Dim folder, file, first_time - command = "..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble" - Set folder = FSO.GetFolder(dir) - For Each file In folder.Files - file = FSO.GetFileName(file) - If FSO.GetExtensionName(file) = "ini" Then - if first_time <> 0 Then - vcxproj = vcxproj & vbCrLf - files = files & vbCrLf - Else - first_time = 1 - End If - vcxproj = vcxproj & _ - " " - command = command & " ..\src\table\" & file - files = files & _ - " " & vbCrLf & _ - " INI" & vbCrLf & _ - " " - End If - Next -End Sub - -Sub load_baseset_data(dir, langdir, ByRef vcxproj, ByRef files, ByRef langs) - Dim folder, file, ext, first_time - Set folder = FSO.GetFolder(langdir) - langs = " " - For Each file In folder.Files - If first_time <> 0 Then - langs = langs & ";" - Else - first_time = 1 - End If - file = FSO.GetFileName(file) - ext = FSO.GetExtensionName(file) - langs = langs & "..\src\lang\" & file - Next - langs = langs & "" - first_time = 0 - Set folder = FSO.GetFolder(dir) - For Each file In folder.Files - file = FSO.GetFileName(file) - ext = FSO.GetExtensionName(file) - If ext = "obm" Or ext = "obg" Or ext = "obs" Then - If first_time <> 0 Then - vcxproj = vcxproj & vbCrLf - files = files & vbCrLf - Else - first_time = 1 - End If - vcxproj = vcxproj & _ - " " & vbCrLf & _ - " Generating " & file & " baseset metadata file" & vbCrLf & _ - " cscript //nologo ..\media\baseset\translations.vbs " & Chr(34) & "%(FullPath)" & Chr(34) & " " & Chr(34) & "$(OutputPath)" & file & Chr(34) & " ..\src\lang ..\bin\baseset\orig_extra.grf" & vbCrLf & _ - " $(Langs);..\bin\baseset\orig_extra.grf;%(AdditionalInputs)" & vbCrLf & _ - " ..\bin\baseset\" & file & ";%(Outputs)" & vbCrLf & _ - " " - files = files & _ - " " & vbCrLf & _ - " Baseset Metadata" & vbCrLf & _ - " " - End If - Next -End Sub - -Sub generate(data, dest, data2) - Dim srcfile, destfile, line, regexp - WScript.Echo "Generating " & FSO.GetFileName(dest) & "..." - Set srcfile = FSO.OpenTextFile(dest & ".in", 1, 0, 0) - Set destfile = FSO.CreateTextFile(dest, -1, 0) - - If Not IsNull(data2) Then - ' Everything above the !!FILTERS!! marker - Set regexp = New RegExp - regexp.Pattern = "!!FILTERS!!" - regexp.Global = True - - line = srcfile.ReadLine() - While Not regexp.Test(line) - If len(line) > 0 Then destfile.WriteLine(line) - line = srcfile.ReadLine() - Wend - - ' Our generated content - line = regexp.Replace(line, data2) - destfile.WriteLine(line) - End If - - ' Everything above the !!FILES!! marker - line = srcfile.ReadLine() - While line <> "!!FILES!!" - If len(line) > 0 Then destfile.WriteLine(line) - line = srcfile.ReadLine() - Wend - - ' Our generated content - destfile.WriteLine(data) - - ' Everything below the !!FILES!! marker - While Not srcfile.AtEndOfStream - line = srcfile.ReadLine() - If len(line) > 0 Then destfile.WriteLine(line) - Wend - srcfile.Close() - destfile.Close() -End Sub - -Dim ROOT_DIR -ROOT_DIR = FSO.GetFolder("..").Path -If Not FSO.FileExists(ROOT_DIR & "/source.list") Then - ROOT_DIR = FSO.GetFolder(".").Path -End If -If Not FSO.FileExists(ROOT_DIR & "/source.list") Then - WScript.Echo "Can't find source.list, needed in order to make this run." _ - & vbCrLf & "Please go to either the project dir, or the root dir of a clean SVN checkout." - WScript.Quit(1) -End If - -safety_check ROOT_DIR & "/source.list" -headers_check ROOT_DIR & "/source.list", ROOT_DIR & "\src\" ' Backslashes needed for DoFiles - -Dim openttdvcxproj, openttdfilters, openttdfiles -load_main_data ROOT_DIR & "/source.list", openttdvcxproj, openttdfilters, openttdfiles -generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs140.vcxproj", Null -generate openttdfiles, ROOT_DIR & "/projects/openttd_vs140.vcxproj.filters", openttdfilters -generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs141.vcxproj", Null -generate openttdfiles, ROOT_DIR & "/projects/openttd_vs141.vcxproj.filters", openttdfilters -generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs142.vcxproj", Null -generate openttdfiles, ROOT_DIR & "/projects/openttd_vs142.vcxproj.filters", openttdfilters - -Dim langvcxproj, langfiles -load_lang_data ROOT_DIR & "/src/lang", langvcxproj, langfiles -generate langvcxproj, ROOT_DIR & "/projects/langs_vs140.vcxproj", Null -generate langfiles, ROOT_DIR & "/projects/langs_vs140.vcxproj.filters", Null -generate langvcxproj, ROOT_DIR & "/projects/langs_vs141.vcxproj", Null -generate langfiles, ROOT_DIR & "/projects/langs_vs141.vcxproj.filters", Null -generate langvcxproj, ROOT_DIR & "/projects/langs_vs142.vcxproj", Null -generate langfiles, ROOT_DIR & "/projects/langs_vs142.vcxproj.filters", Null - -Dim settingsvcxproj, settingscommand, settingsfiles -load_settings_data ROOT_DIR & "/src/table", settingsvcxproj, settingscommand, settingsfiles -generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs140.vcxproj", settingscommand -generate settingsfiles, ROOT_DIR & "/projects/settings_vs140.vcxproj.filters", Null -generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs141.vcxproj", settingscommand -generate settingsfiles, ROOT_DIR & "/projects/settings_vs141.vcxproj.filters", Null -generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs142.vcxproj", settingscommand -generate settingsfiles, ROOT_DIR & "/projects/settings_vs142.vcxproj.filters", Null - -Dim basesetvcxproj, basesetfiles, basesetlangs -load_baseset_data ROOT_DIR & "/media/baseset", ROOT_DIR & "/src/lang", basesetvcxproj, basesetfiles, basesetlangs -generate basesetvcxproj, ROOT_DIR & "/projects/basesets_vs140.vcxproj", basesetlangs -generate basesetfiles, ROOT_DIR & "/projects/basesets_vs140.vcxproj.filters", Null -generate basesetvcxproj, ROOT_DIR & "/projects/basesets_vs141.vcxproj", basesetlangs -generate basesetfiles, ROOT_DIR & "/projects/basesets_vs141.vcxproj.filters", Null -generate basesetvcxproj, ROOT_DIR & "/projects/basesets_vs142.vcxproj", basesetlangs -generate basesetfiles, ROOT_DIR & "/projects/basesets_vs142.vcxproj.filters", Null diff --git a/projects/generate_vs140.vcxproj b/projects/generate_vs140.vcxproj deleted file mode 100644 index b17142050b..0000000000 --- a/projects/generate_vs140.vcxproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Debug - Win32 - - - - generate - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34} - generate - - - - Utility - v140 - - - - - - - - - - - - - Document - Running %27generate.vbs%27 ... - cscript "$(ProjectDir)generate.vbs" - %(FullPath);%(AdditionalInputs) - - - - - - diff --git a/projects/generate_vs141.vcxproj b/projects/generate_vs141.vcxproj deleted file mode 100644 index d7a877db17..0000000000 --- a/projects/generate_vs141.vcxproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Debug - Win32 - - - - generate - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34} - generate - - - - Utility - v141 - - - - - - - - - - - - - Document - Running %27generate.vbs%27 ... - cscript "$(ProjectDir)generate.vbs" - %(FullPath);%(AdditionalInputs) - - - - - - diff --git a/projects/generate_vs142.vcxproj b/projects/generate_vs142.vcxproj deleted file mode 100644 index 7230676cb5..0000000000 --- a/projects/generate_vs142.vcxproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Debug - Win32 - - - - generate - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34} - generate - - - - Utility - v142 - - - - - - - - - - - - - Document - Running %27generate.vbs%27 ... - cscript "$(ProjectDir)generate.vbs" - %(FullPath);%(AdditionalInputs) - - - - - - diff --git a/projects/langs_vs140.vcxproj b/projects/langs_vs140.vcxproj deleted file mode 100644 index 25e7160bfb..0000000000 --- a/projects/langs_vs140.vcxproj +++ /dev/null @@ -1,390 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v140 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - - - Generating afrikaans language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\afrikaans.lng;%(Outputs) - - - Generating arabic_egypt language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\arabic_egypt.lng;%(Outputs) - - - Generating basque language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\basque.lng;%(Outputs) - - - Generating belarusian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\belarusian.lng;%(Outputs) - - - Generating brazilian_portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\brazilian_portuguese.lng;%(Outputs) - - - Generating bulgarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\bulgarian.lng;%(Outputs) - - - Generating catalan language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\catalan.lng;%(Outputs) - - - Generating croatian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\croatian.lng;%(Outputs) - - - Generating czech language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\czech.lng;%(Outputs) - - - Generating danish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\danish.lng;%(Outputs) - - - Generating dutch language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\dutch.lng;%(Outputs) - - - Generating english_AU language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_AU.lng;%(Outputs) - - - Generating english_US language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_US.lng;%(Outputs) - - - Generating esperanto language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\esperanto.lng;%(Outputs) - - - Generating estonian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\estonian.lng;%(Outputs) - - - Generating faroese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\faroese.lng;%(Outputs) - - - Generating finnish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\finnish.lng;%(Outputs) - - - Generating french language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\french.lng;%(Outputs) - - - Generating gaelic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\gaelic.lng;%(Outputs) - - - Generating galician language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\galician.lng;%(Outputs) - - - Generating german language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\german.lng;%(Outputs) - - - Generating greek language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\greek.lng;%(Outputs) - - - Generating hebrew language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hebrew.lng;%(Outputs) - - - Generating hungarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hungarian.lng;%(Outputs) - - - Generating icelandic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\icelandic.lng;%(Outputs) - - - Generating indonesian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\indonesian.lng;%(Outputs) - - - Generating irish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\irish.lng;%(Outputs) - - - Generating italian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\italian.lng;%(Outputs) - - - Generating japanese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\japanese.lng;%(Outputs) - - - Generating korean language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\korean.lng;%(Outputs) - - - Generating latin language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latin.lng;%(Outputs) - - - Generating latvian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latvian.lng;%(Outputs) - - - Generating lithuanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\lithuanian.lng;%(Outputs) - - - Generating luxembourgish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\luxembourgish.lng;%(Outputs) - - - Generating malay language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\malay.lng;%(Outputs) - - - Generating norwegian_bokmal language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_bokmal.lng;%(Outputs) - - - Generating norwegian_nynorsk language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_nynorsk.lng;%(Outputs) - - - Generating polish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\polish.lng;%(Outputs) - - - Generating portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\portuguese.lng;%(Outputs) - - - Generating romanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\romanian.lng;%(Outputs) - - - Generating russian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\russian.lng;%(Outputs) - - - Generating serbian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\serbian.lng;%(Outputs) - - - Generating simplified_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\simplified_chinese.lng;%(Outputs) - - - Generating slovak language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovak.lng;%(Outputs) - - - Generating slovenian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovenian.lng;%(Outputs) - - - Generating spanish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish.lng;%(Outputs) - - - Generating spanish_MX language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish_MX.lng;%(Outputs) - - - Generating swedish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\swedish.lng;%(Outputs) - - - Generating tamil language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\tamil.lng;%(Outputs) - - - Generating thai language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\thai.lng;%(Outputs) - - - Generating traditional_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\traditional_chinese.lng;%(Outputs) - - - Generating turkish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\turkish.lng;%(Outputs) - - - Generating ukrainian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\ukrainian.lng;%(Outputs) - - - Generating vietnamese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\vietnamese.lng;%(Outputs) - - - Generating welsh language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\welsh.lng;%(Outputs) - - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/langs_vs140.vcxproj.filters b/projects/langs_vs140.vcxproj.filters deleted file mode 100644 index bf5257ec82..0000000000 --- a/projects/langs_vs140.vcxproj.filters +++ /dev/null @@ -1,176 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - diff --git a/projects/langs_vs140.vcxproj.filters.in b/projects/langs_vs140.vcxproj.filters.in deleted file mode 100644 index 0d60ee9595..0000000000 --- a/projects/langs_vs140.vcxproj.filters.in +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - -!!FILES!! - - diff --git a/projects/langs_vs140.vcxproj.in b/projects/langs_vs140.vcxproj.in deleted file mode 100644 index 3271fecffa..0000000000 --- a/projects/langs_vs140.vcxproj.in +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v140 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - -!!FILES!! - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/langs_vs141.vcxproj b/projects/langs_vs141.vcxproj deleted file mode 100644 index c554c6e378..0000000000 --- a/projects/langs_vs141.vcxproj +++ /dev/null @@ -1,390 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v141 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - - - Generating afrikaans language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\afrikaans.lng;%(Outputs) - - - Generating arabic_egypt language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\arabic_egypt.lng;%(Outputs) - - - Generating basque language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\basque.lng;%(Outputs) - - - Generating belarusian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\belarusian.lng;%(Outputs) - - - Generating brazilian_portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\brazilian_portuguese.lng;%(Outputs) - - - Generating bulgarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\bulgarian.lng;%(Outputs) - - - Generating catalan language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\catalan.lng;%(Outputs) - - - Generating croatian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\croatian.lng;%(Outputs) - - - Generating czech language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\czech.lng;%(Outputs) - - - Generating danish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\danish.lng;%(Outputs) - - - Generating dutch language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\dutch.lng;%(Outputs) - - - Generating english_AU language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_AU.lng;%(Outputs) - - - Generating english_US language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_US.lng;%(Outputs) - - - Generating esperanto language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\esperanto.lng;%(Outputs) - - - Generating estonian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\estonian.lng;%(Outputs) - - - Generating faroese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\faroese.lng;%(Outputs) - - - Generating finnish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\finnish.lng;%(Outputs) - - - Generating french language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\french.lng;%(Outputs) - - - Generating gaelic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\gaelic.lng;%(Outputs) - - - Generating galician language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\galician.lng;%(Outputs) - - - Generating german language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\german.lng;%(Outputs) - - - Generating greek language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\greek.lng;%(Outputs) - - - Generating hebrew language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hebrew.lng;%(Outputs) - - - Generating hungarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hungarian.lng;%(Outputs) - - - Generating icelandic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\icelandic.lng;%(Outputs) - - - Generating indonesian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\indonesian.lng;%(Outputs) - - - Generating irish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\irish.lng;%(Outputs) - - - Generating italian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\italian.lng;%(Outputs) - - - Generating japanese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\japanese.lng;%(Outputs) - - - Generating korean language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\korean.lng;%(Outputs) - - - Generating latin language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latin.lng;%(Outputs) - - - Generating latvian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latvian.lng;%(Outputs) - - - Generating lithuanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\lithuanian.lng;%(Outputs) - - - Generating luxembourgish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\luxembourgish.lng;%(Outputs) - - - Generating malay language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\malay.lng;%(Outputs) - - - Generating norwegian_bokmal language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_bokmal.lng;%(Outputs) - - - Generating norwegian_nynorsk language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_nynorsk.lng;%(Outputs) - - - Generating polish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\polish.lng;%(Outputs) - - - Generating portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\portuguese.lng;%(Outputs) - - - Generating romanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\romanian.lng;%(Outputs) - - - Generating russian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\russian.lng;%(Outputs) - - - Generating serbian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\serbian.lng;%(Outputs) - - - Generating simplified_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\simplified_chinese.lng;%(Outputs) - - - Generating slovak language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovak.lng;%(Outputs) - - - Generating slovenian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovenian.lng;%(Outputs) - - - Generating spanish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish.lng;%(Outputs) - - - Generating spanish_MX language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish_MX.lng;%(Outputs) - - - Generating swedish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\swedish.lng;%(Outputs) - - - Generating tamil language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\tamil.lng;%(Outputs) - - - Generating thai language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\thai.lng;%(Outputs) - - - Generating traditional_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\traditional_chinese.lng;%(Outputs) - - - Generating turkish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\turkish.lng;%(Outputs) - - - Generating ukrainian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\ukrainian.lng;%(Outputs) - - - Generating vietnamese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\vietnamese.lng;%(Outputs) - - - Generating welsh language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\welsh.lng;%(Outputs) - - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/langs_vs141.vcxproj.filters b/projects/langs_vs141.vcxproj.filters deleted file mode 100644 index bf5257ec82..0000000000 --- a/projects/langs_vs141.vcxproj.filters +++ /dev/null @@ -1,176 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - diff --git a/projects/langs_vs141.vcxproj.filters.in b/projects/langs_vs141.vcxproj.filters.in deleted file mode 100644 index 0d60ee9595..0000000000 --- a/projects/langs_vs141.vcxproj.filters.in +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - -!!FILES!! - - diff --git a/projects/langs_vs141.vcxproj.in b/projects/langs_vs141.vcxproj.in deleted file mode 100644 index b73d52c5c9..0000000000 --- a/projects/langs_vs141.vcxproj.in +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v141 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - -!!FILES!! - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/langs_vs142.vcxproj b/projects/langs_vs142.vcxproj deleted file mode 100644 index 0a11156bb0..0000000000 --- a/projects/langs_vs142.vcxproj +++ /dev/null @@ -1,390 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v142 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - - - Generating afrikaans language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\afrikaans.lng;%(Outputs) - - - Generating arabic_egypt language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\arabic_egypt.lng;%(Outputs) - - - Generating basque language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\basque.lng;%(Outputs) - - - Generating belarusian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\belarusian.lng;%(Outputs) - - - Generating brazilian_portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\brazilian_portuguese.lng;%(Outputs) - - - Generating bulgarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\bulgarian.lng;%(Outputs) - - - Generating catalan language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\catalan.lng;%(Outputs) - - - Generating croatian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\croatian.lng;%(Outputs) - - - Generating czech language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\czech.lng;%(Outputs) - - - Generating danish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\danish.lng;%(Outputs) - - - Generating dutch language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\dutch.lng;%(Outputs) - - - Generating english_AU language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_AU.lng;%(Outputs) - - - Generating english_US language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english_US.lng;%(Outputs) - - - Generating esperanto language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\esperanto.lng;%(Outputs) - - - Generating estonian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\estonian.lng;%(Outputs) - - - Generating faroese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\faroese.lng;%(Outputs) - - - Generating finnish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\finnish.lng;%(Outputs) - - - Generating french language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\french.lng;%(Outputs) - - - Generating gaelic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\gaelic.lng;%(Outputs) - - - Generating galician language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\galician.lng;%(Outputs) - - - Generating german language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\german.lng;%(Outputs) - - - Generating greek language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\greek.lng;%(Outputs) - - - Generating hebrew language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hebrew.lng;%(Outputs) - - - Generating hungarian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\hungarian.lng;%(Outputs) - - - Generating icelandic language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\icelandic.lng;%(Outputs) - - - Generating indonesian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\indonesian.lng;%(Outputs) - - - Generating irish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\irish.lng;%(Outputs) - - - Generating italian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\italian.lng;%(Outputs) - - - Generating japanese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\japanese.lng;%(Outputs) - - - Generating korean language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\korean.lng;%(Outputs) - - - Generating latin language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latin.lng;%(Outputs) - - - Generating latvian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\latvian.lng;%(Outputs) - - - Generating lithuanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\lithuanian.lng;%(Outputs) - - - Generating luxembourgish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\luxembourgish.lng;%(Outputs) - - - Generating malay language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\malay.lng;%(Outputs) - - - Generating norwegian_bokmal language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_bokmal.lng;%(Outputs) - - - Generating norwegian_nynorsk language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\norwegian_nynorsk.lng;%(Outputs) - - - Generating polish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\polish.lng;%(Outputs) - - - Generating portuguese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\portuguese.lng;%(Outputs) - - - Generating romanian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\romanian.lng;%(Outputs) - - - Generating russian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\russian.lng;%(Outputs) - - - Generating serbian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\serbian.lng;%(Outputs) - - - Generating simplified_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\simplified_chinese.lng;%(Outputs) - - - Generating slovak language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovak.lng;%(Outputs) - - - Generating slovenian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\slovenian.lng;%(Outputs) - - - Generating spanish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish.lng;%(Outputs) - - - Generating spanish_MX language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\spanish_MX.lng;%(Outputs) - - - Generating swedish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\swedish.lng;%(Outputs) - - - Generating tamil language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\tamil.lng;%(Outputs) - - - Generating thai language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\thai.lng;%(Outputs) - - - Generating traditional_chinese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\traditional_chinese.lng;%(Outputs) - - - Generating turkish language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\turkish.lng;%(Outputs) - - - Generating ukrainian language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\ukrainian.lng;%(Outputs) - - - Generating vietnamese language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\vietnamese.lng;%(Outputs) - - - Generating welsh language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\welsh.lng;%(Outputs) - - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/langs_vs142.vcxproj.filters b/projects/langs_vs142.vcxproj.filters deleted file mode 100644 index bf5257ec82..0000000000 --- a/projects/langs_vs142.vcxproj.filters +++ /dev/null @@ -1,176 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - Translations - - - diff --git a/projects/langs_vs142.vcxproj.filters.in b/projects/langs_vs142.vcxproj.filters.in deleted file mode 100644 index 0d60ee9595..0000000000 --- a/projects/langs_vs142.vcxproj.filters.in +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {2a164580-9033-4a01-974b-b21da507efda} - - - - -!!FILES!! - - diff --git a/projects/langs_vs142.vcxproj.in b/projects/langs_vs142.vcxproj.in deleted file mode 100644 index f24c7cad78..0000000000 --- a/projects/langs_vs142.vcxproj.in +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - Win32 - - - - langs - {0F066B23-18DF-4284-8265-F4A5E7E3B966} - langs - MakeFileProj - - - - Utility - false - v142 - - - - - - - - - - ..\bin\lang\ - ..\objs\langs\ - - - - Generating strings.h - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table - - - ./langs.tlb - - - - - - - Generating english language file - ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)" - ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs) - ..\bin\lang\english.lng;%(Outputs) - -!!FILES!! - - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - - - - diff --git a/projects/openttd_vs140.sln b/projects/openttd_vs140.sln deleted file mode 100644 index e2b7632f7e..0000000000 --- a/projects/openttd_vs140.sln +++ /dev/null @@ -1,103 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs140.vcxproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs140.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs140.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs140.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs140.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs140.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs140.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regression", "regression_vs140.vcxproj", "{4712B013-437D-42CE-947F-DEBABA15261F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basesets", "basesets_vs140.vcxproj", "{E12E77CA-C0F1-4ADA-943F-4929274249D3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|x64.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.Build.0 = Debug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj deleted file mode 100644 index 20253a2065..0000000000 --- a/projects/openttd_vs140.vcxproj +++ /dev/null @@ -1,1387 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v140 - - - Application - false - Unicode - true - v140 - - - Application - false - Unicode - v140 - - - Application - false - Unicode - true - v140 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters deleted file mode 100644 index 11e9821ffe..0000000000 --- a/projects/openttd_vs140.vcxproj.filters +++ /dev/null @@ -1,3155 +0,0 @@ - - - - - {c76ff9f1-1e62-46d8-8d55-000000000000} - - - {c76ff9f1-1e62-46d8-8d55-000000000001} - - - {c76ff9f1-1e62-46d8-8d55-000000000002} - - - {c76ff9f1-1e62-46d8-8d55-000000000003} - - - {c76ff9f1-1e62-46d8-8d55-000000000004} - - - {c76ff9f1-1e62-46d8-8d55-000000000005} - - - {c76ff9f1-1e62-46d8-8d55-000000000006} - - - {c76ff9f1-1e62-46d8-8d55-000000000007} - - - {c76ff9f1-1e62-46d8-8d55-000000000008} - - - {c76ff9f1-1e62-46d8-8d55-000000000009} - - - {c76ff9f1-1e62-46d8-8d55-000000000010} - - - {c76ff9f1-1e62-46d8-8d55-000000000011} - - - {c76ff9f1-1e62-46d8-8d55-000000000012} - - - {c76ff9f1-1e62-46d8-8d55-000000000013} - - - {c76ff9f1-1e62-46d8-8d55-000000000014} - - - {c76ff9f1-1e62-46d8-8d55-000000000015} - - - {c76ff9f1-1e62-46d8-8d55-000000000016} - - - {c76ff9f1-1e62-46d8-8d55-000000000017} - - - {c76ff9f1-1e62-46d8-8d55-000000000018} - - - {c76ff9f1-1e62-46d8-8d55-000000000019} - - - {c76ff9f1-1e62-46d8-8d55-000000000020} - - - {c76ff9f1-1e62-46d8-8d55-000000000021} - - - {c76ff9f1-1e62-46d8-8d55-000000000022} - - - {c76ff9f1-1e62-46d8-8d55-000000000023} - - - {c76ff9f1-1e62-46d8-8d55-000000000024} - - - {c76ff9f1-1e62-46d8-8d55-000000000025} - - - {c76ff9f1-1e62-46d8-8d55-000000000026} - - - {c76ff9f1-1e62-46d8-8d55-000000000027} - - - {c76ff9f1-1e62-46d8-8d55-000000000028} - - - {c76ff9f1-1e62-46d8-8d55-000000000029} - - - {c76ff9f1-1e62-46d8-8d55-000000000030} - - - {c76ff9f1-1e62-46d8-8d55-000000000031} - - - {c76ff9f1-1e62-46d8-8d55-000000000032} - - - {c76ff9f1-1e62-46d8-8d55-000000000033} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - MD5 - - - MD5 - - - Compat - - - Compat - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI API - - - Game API - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Drivers - - - Drivers - - - Drivers - - - Sprite loaders - - - Sprite loaders - - - Sprite loaders - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - Video - - - Video - - - Video - - - Video - - - Video - - - Music - - - Music - - - Music - - - Music - - - Sound - - - Sound - - - Sound - - - Sound - - - Sound - - - Windows files - - - Windows files - - - Windows files - - - Windows files - - - Threading - - - - - - - diff --git a/projects/openttd_vs140.vcxproj.filters.in b/projects/openttd_vs140.vcxproj.filters.in deleted file mode 100644 index 126bd61459..0000000000 --- a/projects/openttd_vs140.vcxproj.filters.in +++ /dev/null @@ -1,13 +0,0 @@ - - - -!!FILTERS!! - - -!!FILES!! - - - - - - diff --git a/projects/openttd_vs140.vcxproj.in b/projects/openttd_vs140.vcxproj.in deleted file mode 100644 index b5628a23d3..0000000000 --- a/projects/openttd_vs140.vcxproj.in +++ /dev/null @@ -1,374 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v140 - - - Application - false - Unicode - true - v140 - - - Application - false - Unicode - v140 - - - Application - false - Unicode - true - v140 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - -!!FILES!! - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/openttd_vs141.sln b/projects/openttd_vs141.sln deleted file mode 100644 index 6e328ba764..0000000000 --- a/projects/openttd_vs141.sln +++ /dev/null @@ -1,103 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs141.vcxproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs141.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs141.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs141.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs141.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs141.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs141.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regression", "regression_vs141.vcxproj", "{4712B013-437D-42CE-947F-DEBABA15261F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basesets", "basesets_vs141.vcxproj", "{E12E77CA-C0F1-4ADA-943F-4929274249D3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|x64.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.Build.0 = Debug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj deleted file mode 100644 index 7b0da9569c..0000000000 --- a/projects/openttd_vs141.vcxproj +++ /dev/null @@ -1,1387 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v141 - - - Application - false - Unicode - true - v141 - - - Application - false - Unicode - v141 - - - Application - false - Unicode - true - v141 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters deleted file mode 100644 index 11e9821ffe..0000000000 --- a/projects/openttd_vs141.vcxproj.filters +++ /dev/null @@ -1,3155 +0,0 @@ - - - - - {c76ff9f1-1e62-46d8-8d55-000000000000} - - - {c76ff9f1-1e62-46d8-8d55-000000000001} - - - {c76ff9f1-1e62-46d8-8d55-000000000002} - - - {c76ff9f1-1e62-46d8-8d55-000000000003} - - - {c76ff9f1-1e62-46d8-8d55-000000000004} - - - {c76ff9f1-1e62-46d8-8d55-000000000005} - - - {c76ff9f1-1e62-46d8-8d55-000000000006} - - - {c76ff9f1-1e62-46d8-8d55-000000000007} - - - {c76ff9f1-1e62-46d8-8d55-000000000008} - - - {c76ff9f1-1e62-46d8-8d55-000000000009} - - - {c76ff9f1-1e62-46d8-8d55-000000000010} - - - {c76ff9f1-1e62-46d8-8d55-000000000011} - - - {c76ff9f1-1e62-46d8-8d55-000000000012} - - - {c76ff9f1-1e62-46d8-8d55-000000000013} - - - {c76ff9f1-1e62-46d8-8d55-000000000014} - - - {c76ff9f1-1e62-46d8-8d55-000000000015} - - - {c76ff9f1-1e62-46d8-8d55-000000000016} - - - {c76ff9f1-1e62-46d8-8d55-000000000017} - - - {c76ff9f1-1e62-46d8-8d55-000000000018} - - - {c76ff9f1-1e62-46d8-8d55-000000000019} - - - {c76ff9f1-1e62-46d8-8d55-000000000020} - - - {c76ff9f1-1e62-46d8-8d55-000000000021} - - - {c76ff9f1-1e62-46d8-8d55-000000000022} - - - {c76ff9f1-1e62-46d8-8d55-000000000023} - - - {c76ff9f1-1e62-46d8-8d55-000000000024} - - - {c76ff9f1-1e62-46d8-8d55-000000000025} - - - {c76ff9f1-1e62-46d8-8d55-000000000026} - - - {c76ff9f1-1e62-46d8-8d55-000000000027} - - - {c76ff9f1-1e62-46d8-8d55-000000000028} - - - {c76ff9f1-1e62-46d8-8d55-000000000029} - - - {c76ff9f1-1e62-46d8-8d55-000000000030} - - - {c76ff9f1-1e62-46d8-8d55-000000000031} - - - {c76ff9f1-1e62-46d8-8d55-000000000032} - - - {c76ff9f1-1e62-46d8-8d55-000000000033} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - MD5 - - - MD5 - - - Compat - - - Compat - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI API - - - Game API - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Drivers - - - Drivers - - - Drivers - - - Sprite loaders - - - Sprite loaders - - - Sprite loaders - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - Video - - - Video - - - Video - - - Video - - - Video - - - Music - - - Music - - - Music - - - Music - - - Sound - - - Sound - - - Sound - - - Sound - - - Sound - - - Windows files - - - Windows files - - - Windows files - - - Windows files - - - Threading - - - - - - - diff --git a/projects/openttd_vs141.vcxproj.filters.in b/projects/openttd_vs141.vcxproj.filters.in deleted file mode 100644 index 126bd61459..0000000000 --- a/projects/openttd_vs141.vcxproj.filters.in +++ /dev/null @@ -1,13 +0,0 @@ - - - -!!FILTERS!! - - -!!FILES!! - - - - - - diff --git a/projects/openttd_vs141.vcxproj.in b/projects/openttd_vs141.vcxproj.in deleted file mode 100644 index 015c23d3c5..0000000000 --- a/projects/openttd_vs141.vcxproj.in +++ /dev/null @@ -1,374 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v141 - - - Application - false - Unicode - true - v141 - - - Application - false - Unicode - v141 - - - Application - false - Unicode - true - v141 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - -!!FILES!! - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/openttd_vs142.sln b/projects/openttd_vs142.sln deleted file mode 100644 index 15cd430168..0000000000 --- a/projects/openttd_vs142.sln +++ /dev/null @@ -1,105 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28516.95 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs142.vcxproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs142.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs142.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs142.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs142.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs142.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs142.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regression", "regression_vs142.vcxproj", "{4712B013-437D-42CE-947F-DEBABA15261F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basesets", "basesets_vs142.vcxproj", "{E12E77CA-C0F1-4ADA-943F-4929274249D3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64 - {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32 - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32 - {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32 - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32 - {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32 - {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32 - {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Debug|x64.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|Win32.ActiveCfg = Debug|Win32 - {4712B013-437D-42CE-947F-DEBABA15261F}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Debug|x64.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|Win32.Build.0 = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.ActiveCfg = Debug|Win32 - {E12E77CA-C0F1-4ADA-943F-4929274249D3}.Release|x64.Build.0 = Debug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1DE4D2BD-DBC4-4304-907E-34994EEAA4C1} - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj deleted file mode 100644 index db497537db..0000000000 --- a/projects/openttd_vs142.vcxproj +++ /dev/null @@ -1,1387 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v142 - - - Application - false - Unicode - true - v142 - - - Application - false - Unicode - v142 - - - Application - false - Unicode - true - v142 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters deleted file mode 100644 index 11e9821ffe..0000000000 --- a/projects/openttd_vs142.vcxproj.filters +++ /dev/null @@ -1,3155 +0,0 @@ - - - - - {c76ff9f1-1e62-46d8-8d55-000000000000} - - - {c76ff9f1-1e62-46d8-8d55-000000000001} - - - {c76ff9f1-1e62-46d8-8d55-000000000002} - - - {c76ff9f1-1e62-46d8-8d55-000000000003} - - - {c76ff9f1-1e62-46d8-8d55-000000000004} - - - {c76ff9f1-1e62-46d8-8d55-000000000005} - - - {c76ff9f1-1e62-46d8-8d55-000000000006} - - - {c76ff9f1-1e62-46d8-8d55-000000000007} - - - {c76ff9f1-1e62-46d8-8d55-000000000008} - - - {c76ff9f1-1e62-46d8-8d55-000000000009} - - - {c76ff9f1-1e62-46d8-8d55-000000000010} - - - {c76ff9f1-1e62-46d8-8d55-000000000011} - - - {c76ff9f1-1e62-46d8-8d55-000000000012} - - - {c76ff9f1-1e62-46d8-8d55-000000000013} - - - {c76ff9f1-1e62-46d8-8d55-000000000014} - - - {c76ff9f1-1e62-46d8-8d55-000000000015} - - - {c76ff9f1-1e62-46d8-8d55-000000000016} - - - {c76ff9f1-1e62-46d8-8d55-000000000017} - - - {c76ff9f1-1e62-46d8-8d55-000000000018} - - - {c76ff9f1-1e62-46d8-8d55-000000000019} - - - {c76ff9f1-1e62-46d8-8d55-000000000020} - - - {c76ff9f1-1e62-46d8-8d55-000000000021} - - - {c76ff9f1-1e62-46d8-8d55-000000000022} - - - {c76ff9f1-1e62-46d8-8d55-000000000023} - - - {c76ff9f1-1e62-46d8-8d55-000000000024} - - - {c76ff9f1-1e62-46d8-8d55-000000000025} - - - {c76ff9f1-1e62-46d8-8d55-000000000026} - - - {c76ff9f1-1e62-46d8-8d55-000000000027} - - - {c76ff9f1-1e62-46d8-8d55-000000000028} - - - {c76ff9f1-1e62-46d8-8d55-000000000029} - - - {c76ff9f1-1e62-46d8-8d55-000000000030} - - - {c76ff9f1-1e62-46d8-8d55-000000000031} - - - {c76ff9f1-1e62-46d8-8d55-000000000032} - - - {c76ff9f1-1e62-46d8-8d55-000000000033} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - Core Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - GUI Source Code - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Widgets - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Command handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Save/Load handlers - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - Tables - - - MD5 - - - MD5 - - - Compat - - - Compat - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Script - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - Squirrel headers - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI Core - - - AI API - - - Game API - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Game Core - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Script API Implementation - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Blitters - - - Drivers - - - Drivers - - - Drivers - - - Sprite loaders - - - Sprite loaders - - - Sprite loaders - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - NewGRF - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Map Accessors - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Misc - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Network Core - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - Pathfinder - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - NPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - YAPF - - - Video - - - Video - - - Video - - - Video - - - Video - - - Music - - - Music - - - Music - - - Music - - - Sound - - - Sound - - - Sound - - - Sound - - - Sound - - - Windows files - - - Windows files - - - Windows files - - - Windows files - - - Threading - - - - - - - diff --git a/projects/openttd_vs142.vcxproj.filters.in b/projects/openttd_vs142.vcxproj.filters.in deleted file mode 100644 index 126bd61459..0000000000 --- a/projects/openttd_vs142.vcxproj.filters.in +++ /dev/null @@ -1,13 +0,0 @@ - - - -!!FILTERS!! - - -!!FILES!! - - - - - - diff --git a/projects/openttd_vs142.vcxproj.in b/projects/openttd_vs142.vcxproj.in deleted file mode 100644 index 6941b3450b..0000000000 --- a/projects/openttd_vs142.vcxproj.in +++ /dev/null @@ -1,374 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - openttd - {668328A0-B40E-4CDB-BD72-D0064424414A} - openttd - x86-windows-static - x64-windows-static - - - - Application - false - Unicode - v142 - - - Application - false - Unicode - true - v142 - - - Application - false - Unicode - v142 - - - Application - false - Unicode - true - v142 - - - - - - - - - - - - - - - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - false - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - NativeMinimumRules.ruleset - - - $(SolutionDir)..\objs\$(Platform)\$(Configuration)\ - $(ProjectDir)..\bin - - - - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 4Bytes - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - false - - - MachineX86 - true - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - false - - - MachineX86 - 5.01 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Release/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Full - AnySuitable - true - Size - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - Default - false - true - - - - - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - FastCall - Default - true - true - - - NDEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - %(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - true - MachineX64 - true - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - - - X64 - .\Debug/openttd.tlb - - - - - /J /Zc:throwingNew /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - Disabled - true - ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_XAUDIO2;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LIBLZMA;WITH_PNG;WITH_UNISCRIBE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - - - - - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - false - true - ProgramDatabase - Cdecl - Default - true - true - - - _DEBUG;%(PreprocessorDefinitions) - 0x0809 - - - winmm.lib;ws2_32.lib;imm32.lib;%(AdditionalDependencies) - true - LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) - true - Windows - 1048576 - 1048576 - MachineX64 - 5.02 - - - os_versions.manifest - PerMonitorHighDPIAware - - - copy "$(OutDir)$(TargetName)$(TargetExt)" "$(SolutionDir)..\bin\$(TargetName)$(TargetExt)" - - - -!!FILES!! - - - - - - - - {0f066b23-18df-4284-8265-f4a5e7e3b966} - false - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - {0817f629-589e-4a3b-b81a-8647bc571e35} - false - - - {a133a442-bd0a-4ade-b117-ad7545e4bdd1} - false - - - {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec} - false - - - {e12e77ca-c0f1-4ada-943f-4929274249d3} - false - - - - diff --git a/projects/os_versions.manifest b/projects/os_versions.manifest deleted file mode 100644 index c7905ee709..0000000000 --- a/projects/os_versions.manifest +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/projects/regression.bat b/projects/regression.bat deleted file mode 100644 index db373c371b..0000000000 --- a/projects/regression.bat +++ /dev/null @@ -1,6 +0,0 @@ -cd ..\bin -editbin /nologo /subsystem:console openttd.exe -cscript /nologo ai\regression\run.vbs -set RESULT=%ERRORLEVEL% -editbin /nologo /subsystem:windows openttd.exe -exit %RESULT% diff --git a/projects/regression_vs140.vcxproj b/projects/regression_vs140.vcxproj deleted file mode 100644 index b1c9f4930a..0000000000 --- a/projects/regression_vs140.vcxproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Debug - Win32 - - - - {4712B013-437D-42CE-947F-DEBABA15261F} - regression - regression - - - - Makefile - v140 - - - - - - - - - - - - call regression.bat - call regression.bat - del ..\bin\tmp.regression - - - - {668328a0-b40e-4cdb-bd72-d0064424414a} - - - - - - diff --git a/projects/regression_vs141.vcxproj b/projects/regression_vs141.vcxproj deleted file mode 100644 index fda3f3312d..0000000000 --- a/projects/regression_vs141.vcxproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Debug - Win32 - - - - {4712B013-437D-42CE-947F-DEBABA15261F} - regression - regression - - - - Makefile - v141 - - - - - - - - - - - - call regression.bat - call regression.bat - del ..\bin\tmp.regression - - - - {668328a0-b40e-4cdb-bd72-d0064424414a} - - - - - - diff --git a/projects/regression_vs142.vcxproj b/projects/regression_vs142.vcxproj deleted file mode 100644 index 3ddcc6f37a..0000000000 --- a/projects/regression_vs142.vcxproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - - Debug - Win32 - - - - {4712B013-437D-42CE-947F-DEBABA15261F} - regression - regression - - - - Makefile - v142 - - - - - - - - - - - - call regression.bat - call regression.bat - del ..\bin\tmp.regression - - - - {668328a0-b40e-4cdb-bd72-d0064424414a} - - - - - - diff --git a/projects/settings_vs140.vcxproj b/projects/settings_vs140.vcxproj deleted file mode 100644 index b5f5151821..0000000000 --- a/projects/settings_vs140.vcxproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v140 - - - - - - - - - ..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble ..\src\table\company_settings.ini ..\src\table\currency_settings.ini ..\src\table\gameopt_settings.ini ..\src\table\misc_settings.ini ..\src\table\settings.ini ..\src\table\win32_settings.ini ..\src\table\window_settings.ini - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - - - - - - - - - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settings_vs140.vcxproj.filters b/projects/settings_vs140.vcxproj.filters deleted file mode 100644 index 8caf9fa0a6..0000000000 --- a/projects/settings_vs140.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - - - - - diff --git a/projects/settings_vs140.vcxproj.filters.in b/projects/settings_vs140.vcxproj.filters.in deleted file mode 100644 index 08f90670d2..0000000000 --- a/projects/settings_vs140.vcxproj.filters.in +++ /dev/null @@ -1,15 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - -!!FILES!! - - - - - - diff --git a/projects/settings_vs140.vcxproj.in b/projects/settings_vs140.vcxproj.in deleted file mode 100644 index dcbbfbd352..0000000000 --- a/projects/settings_vs140.vcxproj.in +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v140 - - - - - - - - - !!FILTERS!! - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - -!!FILES!! - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settings_vs141.vcxproj b/projects/settings_vs141.vcxproj deleted file mode 100644 index b3f6871945..0000000000 --- a/projects/settings_vs141.vcxproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v141 - - - - - - - - - ..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble ..\src\table\company_settings.ini ..\src\table\currency_settings.ini ..\src\table\gameopt_settings.ini ..\src\table\misc_settings.ini ..\src\table\settings.ini ..\src\table\win32_settings.ini ..\src\table\window_settings.ini - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - - - - - - - - - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settings_vs141.vcxproj.filters b/projects/settings_vs141.vcxproj.filters deleted file mode 100644 index 8caf9fa0a6..0000000000 --- a/projects/settings_vs141.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - - - - - diff --git a/projects/settings_vs141.vcxproj.filters.in b/projects/settings_vs141.vcxproj.filters.in deleted file mode 100644 index 08f90670d2..0000000000 --- a/projects/settings_vs141.vcxproj.filters.in +++ /dev/null @@ -1,15 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - -!!FILES!! - - - - - - diff --git a/projects/settings_vs141.vcxproj.in b/projects/settings_vs141.vcxproj.in deleted file mode 100644 index 1701c99f5f..0000000000 --- a/projects/settings_vs141.vcxproj.in +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v141 - - - - - - - - - !!FILTERS!! - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - -!!FILES!! - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settings_vs142.vcxproj b/projects/settings_vs142.vcxproj deleted file mode 100644 index e0ed933091..0000000000 --- a/projects/settings_vs142.vcxproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v142 - - - - - - - - - ..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble ..\src\table\company_settings.ini ..\src\table\currency_settings.ini ..\src\table\gameopt_settings.ini ..\src\table\misc_settings.ini ..\src\table\settings.ini ..\src\table\win32_settings.ini ..\src\table\window_settings.ini - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - - - - - - - - - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settings_vs142.vcxproj.filters b/projects/settings_vs142.vcxproj.filters deleted file mode 100644 index 8caf9fa0a6..0000000000 --- a/projects/settings_vs142.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - INI - - - - - - - diff --git a/projects/settings_vs142.vcxproj.filters.in b/projects/settings_vs142.vcxproj.filters.in deleted file mode 100644 index 08f90670d2..0000000000 --- a/projects/settings_vs142.vcxproj.filters.in +++ /dev/null @@ -1,15 +0,0 @@ - - - - - {21deca6c-8df4-4f34-9dad-17d7781cd5a0} - - - -!!FILES!! - - - - - - diff --git a/projects/settings_vs142.vcxproj.in b/projects/settings_vs142.vcxproj.in deleted file mode 100644 index 4463c573d7..0000000000 --- a/projects/settings_vs142.vcxproj.in +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Debug - Win32 - - - - settings - {0817F629-589E-4A3B-B81A-8647BC571E35} - settings - - - - Makefile - v142 - - - - - - - - - !!FILTERS!! - - - ..\objs\settings\table\ - ..\objs\settings\table\ - $(SettingsCommandLine) - $(SettingsCommandLine) - del ..\objs\settings\table\settings.h - ..\objs\settings\table\settings.h - - -!!FILES!! - - - - - - - - {e9548de9-f089-49b7-93a6-30be2cc311c7} - false - - - - - - diff --git a/projects/settingsgen_vs140.vcxproj b/projects/settingsgen_vs140.vcxproj deleted file mode 100644 index 12ce280f3a..0000000000 --- a/projects/settingsgen_vs140.vcxproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Debug - Win32 - - - - settingsgen - {E9548DE9-F089-49B7-93A6-30BE2CC311C7} - settings - - - - Application - MultiByte - v140 - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\objs\settings\ - ..\objs\settings\ - settings_gen - - - - - - - - %(Inputs) - - - MinSpace - Size - SETTINGSGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - All - $(IntDir)$(TargetName).pdb - Level3 - true - ProgramDatabase - MultiThreadedDebug - - - $(OutDir)settings_gen.exe - true - false - - - Console - 5.01 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/settingsgen_vs140.vcxproj.filters b/projects/settingsgen_vs140.vcxproj.filters deleted file mode 100644 index c8afe0c8ed..0000000000 --- a/projects/settingsgen_vs140.vcxproj.filters +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {a4678737-b3b3-4be5-9db1-fa6ccd164c59} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - diff --git a/projects/settingsgen_vs141.vcxproj b/projects/settingsgen_vs141.vcxproj deleted file mode 100644 index 2b356f2eab..0000000000 --- a/projects/settingsgen_vs141.vcxproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Debug - Win32 - - - - settingsgen - {E9548DE9-F089-49B7-93A6-30BE2CC311C7} - settings - - - - Application - MultiByte - v141 - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\objs\settings\ - ..\objs\settings\ - settings_gen - - - - - - - - %(Inputs) - - - MinSpace - Size - SETTINGSGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - All - $(IntDir)$(TargetName).pdb - Level3 - true - ProgramDatabase - MultiThreadedDebug - - - $(OutDir)settings_gen.exe - true - false - - - Console - 5.01 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/settingsgen_vs141.vcxproj.filters b/projects/settingsgen_vs141.vcxproj.filters deleted file mode 100644 index c8afe0c8ed..0000000000 --- a/projects/settingsgen_vs141.vcxproj.filters +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {a4678737-b3b3-4be5-9db1-fa6ccd164c59} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - diff --git a/projects/settingsgen_vs142.vcxproj b/projects/settingsgen_vs142.vcxproj deleted file mode 100644 index fb2f7a731e..0000000000 --- a/projects/settingsgen_vs142.vcxproj +++ /dev/null @@ -1,84 +0,0 @@ - - - - - Debug - Win32 - - - - settingsgen - {E9548DE9-F089-49B7-93A6-30BE2CC311C7} - settings - - - - Application - MultiByte - v142 - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\objs\settings\ - ..\objs\settings\ - settings_gen - - - - - - - - %(Inputs) - - - /std:c++latest /Zc:__cplusplus %(AdditionalOptions) - MinSpace - Size - SETTINGSGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - All - $(IntDir)$(TargetName).pdb - Level3 - true - ProgramDatabase - MultiThreadedDebug - - - $(OutDir)settings_gen.exe - true - false - - - Console - 5.01 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/settingsgen_vs142.vcxproj.filters b/projects/settingsgen_vs142.vcxproj.filters deleted file mode 100644 index c8afe0c8ed..0000000000 --- a/projects/settingsgen_vs142.vcxproj.filters +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {a4678737-b3b3-4be5-9db1-fa6ccd164c59} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - diff --git a/projects/strgen_vs140.vcxproj b/projects/strgen_vs140.vcxproj deleted file mode 100644 index b972d873eb..0000000000 --- a/projects/strgen_vs140.vcxproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - Win32 - - - - strgen - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1} - strgen - - - - Application - false - MultiByte - v140 - - - - - - - - - - $(SolutionDir)..\objs\strgen\ - $(SolutionDir)..\objs\strgen\ - false - AllRules.ruleset - - - - - - .\Debug/strgen.tlb - - - - - /MP %(AdditionalOptions) - MinSpace - Size - STRGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - Default - MultiThreadedDebug - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - true - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x041d - - - true - true - $(IntDir)strgen.pdb - Console - false - - - MachineX86 - 5.01 - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/strgen_vs140.vcxproj.filters b/projects/strgen_vs140.vcxproj.filters deleted file mode 100644 index 58864ee691..0000000000 --- a/projects/strgen_vs140.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {5894294c-d4dc-41f0-be31-e56cff4e0405} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - - - diff --git a/projects/strgen_vs141.vcxproj b/projects/strgen_vs141.vcxproj deleted file mode 100644 index addc6f10a5..0000000000 --- a/projects/strgen_vs141.vcxproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - Win32 - - - - strgen - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1} - strgen - - - - Application - false - MultiByte - v141 - - - - - - - - - - $(SolutionDir)..\objs\strgen\ - $(SolutionDir)..\objs\strgen\ - false - AllRules.ruleset - - - - - - .\Debug/strgen.tlb - - - - - /MP %(AdditionalOptions) - MinSpace - Size - STRGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - Default - MultiThreadedDebug - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - true - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x041d - - - true - true - $(IntDir)strgen.pdb - Console - false - - - MachineX86 - 5.01 - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/strgen_vs141.vcxproj.filters b/projects/strgen_vs141.vcxproj.filters deleted file mode 100644 index 58864ee691..0000000000 --- a/projects/strgen_vs141.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {5894294c-d4dc-41f0-be31-e56cff4e0405} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - - - diff --git a/projects/strgen_vs142.vcxproj b/projects/strgen_vs142.vcxproj deleted file mode 100644 index 554109b045..0000000000 --- a/projects/strgen_vs142.vcxproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - Win32 - - - - strgen - {A133A442-BD0A-4ADE-B117-AD7545E4BDD1} - strgen - - - - Application - false - MultiByte - v142 - - - - - - - - - - $(SolutionDir)..\objs\strgen\ - $(SolutionDir)..\objs\strgen\ - false - NativeMinimumRules.ruleset - - - - - - .\Debug/strgen.tlb - - - - - /MP %(AdditionalOptions) - MinSpace - Size - STRGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - Default - MultiThreadedDebug - - - All - $(IntDir) - $(IntDir) - $(IntDir)$(TargetName).pdb - Level3 - true - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x041d - - - true - true - $(IntDir)strgen.pdb - Console - false - - - MachineX86 - 5.01 - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/strgen_vs142.vcxproj.filters b/projects/strgen_vs142.vcxproj.filters deleted file mode 100644 index 58864ee691..0000000000 --- a/projects/strgen_vs142.vcxproj.filters +++ /dev/null @@ -1,35 +0,0 @@ - - - - - {5894294c-d4dc-41f0-be31-e56cff4e0405} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - - - - - - - diff --git a/projects/version_vs140.vcxproj b/projects/version_vs140.vcxproj deleted file mode 100644 index 6e71a88201..0000000000 --- a/projects/version_vs140.vcxproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Debug - Win32 - - - - version - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC} - version - - - - Makefile - MultiByte - v140 - - - - - - - - - - $(SolutionDir)..\objs\version\ - $(SolutionDir)..\objs\version\ - cscript "$(ProjectDir)/determineversion.vbs" - cscript "$(ProjectDir)/determineversion.vbs" - ..\src\rev.cpp - del ..\src\rev.cpp - - - - - - - - - diff --git a/projects/version_vs141.vcxproj b/projects/version_vs141.vcxproj deleted file mode 100644 index 5d8ee8c74f..0000000000 --- a/projects/version_vs141.vcxproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Debug - Win32 - - - - version - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC} - version - - - - Makefile - MultiByte - v141 - - - - - - - - - - $(SolutionDir)..\objs\version\ - $(SolutionDir)..\objs\version\ - cscript "$(ProjectDir)/determineversion.vbs" - cscript "$(ProjectDir)/determineversion.vbs" - ..\src\rev.cpp - del ..\src\rev.cpp - - - - - - - - - diff --git a/projects/version_vs142.vcxproj b/projects/version_vs142.vcxproj deleted file mode 100644 index 31971e35c9..0000000000 --- a/projects/version_vs142.vcxproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - - Debug - Win32 - - - - version - {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC} - version - - - - Makefile - MultiByte - v142 - - - - - - - - - - $(SolutionDir)..\objs\version\ - $(SolutionDir)..\objs\version\ - cscript "$(ProjectDir)/determineversion.vbs" - cscript "$(ProjectDir)/determineversion.vbs" - ..\src\rev.cpp - del ..\src\rev.cpp - - - - - - - - - diff --git a/source.list b/source.list deleted file mode 100644 index b023b9ba4b..0000000000 --- a/source.list +++ /dev/null @@ -1,1191 +0,0 @@ -# Source Files -airport.cpp -animated_tile.cpp -articulated_vehicles.cpp -autoreplace.cpp -bmp.cpp -cargoaction.cpp -cargomonitor.cpp -cargopacket.cpp -cargotype.cpp -cheat.cpp -command.cpp -console.cpp -console_cmds.cpp -cpu.cpp -crashlog.cpp -currency.cpp -date.cpp -debug.cpp -dedicated.cpp -depot.cpp -disaster_vehicle.cpp -driver.cpp -economy.cpp -effectvehicle.cpp -elrail.cpp -engine.cpp -fileio.cpp -fios.cpp -fontcache.cpp -fontdetection.cpp -base_consist.cpp -gamelog.cpp -genworld.cpp -gfx.cpp -gfxinit.cpp -gfx_layout.cpp -goal.cpp -ground_vehicle.cpp -heightmap.cpp -highscore.cpp -hotkeys.cpp -ini.cpp -ini_load.cpp -landscape.cpp -linkgraph/demands.cpp -linkgraph/flowmapper.cpp -linkgraph/linkgraph.cpp -linkgraph/linkgraphjob.cpp -linkgraph/linkgraphschedule.cpp -linkgraph/mcf.cpp -linkgraph/refresh.cpp -map.cpp -misc.cpp -mixer.cpp -music.cpp -network/network.cpp -network/network_admin.cpp -network/network_client.cpp -network/network_command.cpp -network/network_content.cpp -network/network_gamelist.cpp -network/network_server.cpp -network/network_udp.cpp -openttd.cpp -order_backup.cpp -pbs.cpp -progress.cpp -rail.cpp -rev.cpp -road.cpp -roadstop.cpp -screenshot_gui.cpp -screenshot.cpp -settings.cpp -signal.cpp -signs.cpp -sound.cpp -sprite.cpp -spritecache.cpp -station.cpp -strgen/strgen_base.cpp -string.cpp -stringfilter.cpp -strings.cpp -story.cpp -subsidy.cpp -textbuf.cpp -texteff.cpp -tgp.cpp -tile_map.cpp -tilearea.cpp -townname.cpp -#if WIN32 -#else - #if OS2 - os/os2/os2.cpp - 3rdparty/os2/getaddrinfo.c - 3rdparty/os2/getaddrinfo.h - 3rdparty/os2/getnameinfo.c - 3rdparty/os2/getnameinfo.h - #else - #if OSX - os/macosx/crashlog_osx.cpp - #else - os/unix/crashlog_unix.cpp - #end - os/unix/unix.cpp - #end -#end -vehicle.cpp -vehiclelist.cpp -viewport.cpp -#if USE_SSE - viewport_sprite_sorter_sse4.cpp -#end -waypoint.cpp -widget.cpp -window.cpp - -# Header Files -#if ALLEGRO - music/allegro_m.h - sound/allegro_s.h - video/allegro_v.h -#end -aircraft.h -airport.h -animated_tile_func.h -articulated_vehicles.h -autoreplace_base.h -autoreplace_func.h -autoreplace_gui.h -autoreplace_type.h -autoslope.h -base_media_base.h -base_media_func.h -base_station_base.h -bitmap_type.h -bmp.h -bridge.h -cargo_type.h -cargoaction.h -cargomonitor.h -cargopacket.h -cargotype.h -cheat_func.h -cheat_type.h -clear_func.h -cmd_helper.h -command_func.h -command_type.h -company_base.h -company_func.h -company_gui.h -company_manager_face.h -company_type.h -console_func.h -console_gui.h -console_internal.h -console_type.h -cpu.h -crashlog.h -currency.h -date_func.h -date_gui.h -date_type.h -debug.h -video/dedicated_v.h -depot_base.h -depot_func.h -depot_map.h -depot_type.h -direction_func.h -direction_type.h -disaster_vehicle.h -music/dmusic.h -driver.h -economy_base.h -economy_func.h -economy_type.h -effectvehicle_base.h -effectvehicle_func.h -elrail_func.h -engine_base.h -engine_func.h -engine_gui.h -engine_type.h -error.h -fileio_func.h -fileio_type.h -fios.h -fontcache.h -fontdetection.h -framerate_type.h -base_consist.h -gamelog.h -gamelog_internal.h -genworld.h -gfx_func.h -gfx_layout.h -gfx_type.h -gfxinit.h -goal_base.h -goal_type.h -graph_gui.h -ground_vehicle.hpp -group.h -group_gui.h -group_type.h -gui.h -guitimer_func.h -heightmap.h -highscore.h -hotkeys.h -house.h -house_type.h -industry.h -industry_type.h -industrytype.h -ini_type.h -landscape.h -landscape_type.h -language.h -linkgraph/demands.h -linkgraph/flowmapper.h -linkgraph/init.h -linkgraph/linkgraph.h -linkgraph/linkgraph_base.h -linkgraph/linkgraph_gui.h -linkgraph/linkgraph_type.h -linkgraph/linkgraphjob.h -linkgraph/linkgraphjob_base.h -linkgraph/linkgraphschedule.h -linkgraph/mcf.h -linkgraph/refresh.h -livery.h -map_func.h -map_type.h -mixer.h -network/network.h -network/network_admin.h -network/network_base.h -network/network_client.h -network/network_content.h -network/network_content_gui.h -network/network_func.h -network/network_gamelist.h -network/network_gui.h -network/network_internal.h -network/network_server.h -network/network_type.h -network/network_udp.h -newgrf.h -newgrf_airport.h -newgrf_airporttiles.h -newgrf_animation_base.h -newgrf_animation_type.h -newgrf_callbacks.h -newgrf_canal.h -newgrf_cargo.h -newgrf_class.h -newgrf_class_func.h -newgrf_commons.h -newgrf_config.h -newgrf_debug.h -newgrf_engine.h -newgrf_generic.h -newgrf_house.h -newgrf_industries.h -newgrf_industrytiles.h -newgrf_object.h -newgrf_profiling.h -newgrf_properties.h -newgrf_railtype.h -newgrf_roadtype.h -newgrf_sound.h -newgrf_spritegroup.h -newgrf_station.h -newgrf_storage.h -newgrf_text.h -newgrf_town.h -newgrf_townname.h -news_func.h -news_gui.h -news_type.h -music/midi.h -music/midifile.hpp -music/null_m.h -sound/null_s.h -video/null_v.h -object.h -object_base.h -object_type.h -openttd.h -order_backup.h -order_base.h -order_func.h -order_type.h -pbs.h -progress.h -querystring_gui.h -rail.h -rail_gui.h -rail_type.h -rev.h -road.h -road_cmd.h -road_func.h -road_gui.h -road_internal.h -road_type.h -roadstop_base.h -roadveh.h -safeguards.h -screenshot.h -screenshot_gui.h -sound/sdl_s.h -video/sdl_v.h -video/sdl2_v.h -settings_func.h -settings_gui.h -settings_internal.h -settings_type.h -ship.h -signal_func.h -signal_type.h -signs_base.h -signs_func.h -signs_type.h -slope_func.h -slope_type.h -smallmap_gui.h -sortlist_type.h -sound_func.h -sound_type.h -sprite.h -spritecache.h -station_base.h -station_func.h -station_gui.h -station_kdtree.h -station_type.h -statusbar_gui.h -stdafx.h -story_base.h -story_type.h -strgen/strgen.h -string_base.h -string_func.h -string_type.h -os/windows/string_uniscribe.h -stringfilter_type.h -strings_func.h -strings_type.h -subsidy_base.h -subsidy_func.h -subsidy_type.h -tar_type.h -terraform_gui.h -textbuf_gui.h -textbuf_type.h -texteff.hpp -textfile_gui.h -textfile_type.h -tgp.h -tile_cmd.h -tile_type.h -tilearea_type.h -tilehighlight_func.h -tilehighlight_type.h -tilematrix_type.hpp -timetable.h -toolbar_gui.h -town.h -town_type.h -town_kdtree.h -townname_func.h -townname_type.h -track_func.h -track_type.h -train.h -transparency.h -transparency_gui.h -transport_type.h -tunnelbridge.h -vehicle_base.h -vehicle_func.h -vehicle_gui.h -vehicle_gui_base.h -vehicle_type.h -vehiclelist.h -viewport_func.h -viewport_kdtree.h -viewport_sprite_sorter.h -viewport_type.h -water.h -waypoint_base.h -waypoint_func.h -widget_type.h -os/windows/win32.h -music/win32_m.h -sound/win32_s.h -video/win32_v.h -window_func.h -window_gui.h -window_type.h -sound/xaudio2_s.h -zoom_func.h -zoom_type.h -#if WIN32 -#else - music/bemidi.h - music/cocoa_m.h - music/extmidi.h - music/fluidsynth.h - music/os2_m.h - os/macosx/macos.h - os/macosx/osx_stdafx.h - os/macosx/splash.h - os/macosx/string_osx.h - sound/cocoa_s.h - video/cocoa/cocoa_keys.h - video/cocoa/cocoa_v.h -#end - -# Core Source Code -core/alloc_func.cpp -core/alloc_func.hpp -core/alloc_type.hpp -core/backup_type.hpp -core/bitmath_func.cpp -core/bitmath_func.hpp -core/endian_func.hpp -core/endian_type.hpp -core/enum_type.hpp -core/geometry_func.cpp -core/geometry_func.hpp -core/geometry_type.hpp -core/kdtree.hpp -core/math_func.cpp -core/math_func.hpp -core/mem_func.hpp -core/multimap.hpp -core/overflowsafe_type.hpp -core/pool_func.cpp -core/pool_func.hpp -core/pool_type.hpp -core/random_func.cpp -core/random_func.hpp -core/smallmap_type.hpp -core/smallmatrix_type.hpp -core/smallstack_type.hpp -core/smallvec_type.hpp -core/string_compare_type.hpp - -# GUI Source Code -aircraft_gui.cpp -airport_gui.cpp -autoreplace_gui.cpp -bootstrap_gui.cpp -bridge_gui.cpp -build_vehicle_gui.cpp -cheat_gui.cpp -company_gui.cpp -console_gui.cpp -date_gui.cpp -depot_gui.cpp -dock_gui.cpp -engine_gui.cpp -error_gui.cpp -fios_gui.cpp -framerate_gui.cpp -genworld_gui.cpp -goal_gui.cpp -graph_gui.cpp -group_gui.cpp -highscore_gui.cpp -industry_gui.cpp -intro_gui.cpp -linkgraph/linkgraph_gui.cpp -main_gui.cpp -misc_gui.cpp -music_gui.cpp -network/network_chat_gui.cpp -network/network_content_gui.cpp -network/network_gui.cpp -newgrf_debug_gui.cpp -newgrf_gui.cpp -news_gui.cpp -object_gui.cpp -order_gui.cpp -osk_gui.cpp -rail_gui.cpp -road_gui.cpp -roadveh_gui.cpp -settings_gui.cpp -ship_gui.cpp -signs_gui.cpp -smallmap_gui.cpp -station_gui.cpp -statusbar_gui.cpp -story_gui.cpp -subsidy_gui.cpp -terraform_gui.cpp -textfile_gui.cpp -timetable_gui.cpp -toolbar_gui.cpp -town_gui.cpp -train_gui.cpp -transparency_gui.cpp -tree_gui.cpp -vehicle_gui.cpp -viewport_gui.cpp -waypoint_gui.cpp - -# Widgets -widgets/airport_widget.h -widgets/ai_widget.h -widgets/autoreplace_widget.h -widgets/bootstrap_widget.h -widgets/bridge_widget.h -widgets/build_vehicle_widget.h -widgets/cheat_widget.h -widgets/company_widget.h -widgets/console_widget.h -widgets/date_widget.h -widgets/depot_widget.h -widgets/dock_widget.h -widgets/dropdown.cpp -widgets/dropdown_func.h -widgets/dropdown_type.h -widgets/dropdown_widget.h -widgets/engine_widget.h -widgets/error_widget.h -widgets/fios_widget.h -widgets/framerate_widget.h -widgets/genworld_widget.h -widgets/goal_widget.h -widgets/graph_widget.h -widgets/group_widget.h -widgets/highscore_widget.h -widgets/industry_widget.h -widgets/intro_widget.h -widgets/link_graph_legend_widget.h -widgets/main_widget.h -widgets/misc_widget.h -widgets/music_widget.h -widgets/network_chat_widget.h -widgets/network_content_widget.h -widgets/network_widget.h -widgets/newgrf_debug_widget.h -widgets/newgrf_widget.h -widgets/news_widget.h -widgets/object_widget.h -widgets/order_widget.h -widgets/osk_widget.h -widgets/rail_widget.h -widgets/road_widget.h -widgets/screenshot_widget.h -widgets/settings_widget.h -widgets/sign_widget.h -widgets/smallmap_widget.h -widgets/station_widget.h -widgets/statusbar_widget.h -widgets/story_widget.h -widgets/subsidy_widget.h -widgets/terraform_widget.h -widgets/timetable_widget.h -widgets/toolbar_widget.h -widgets/town_widget.h -widgets/transparency_widget.h -widgets/tree_widget.h -widgets/vehicle_widget.h -widgets/viewport_widget.h -widgets/waypoint_widget.h - -# Command handlers -aircraft_cmd.cpp -autoreplace_cmd.cpp -clear_cmd.cpp -company_cmd.cpp -depot_cmd.cpp -group_cmd.cpp -industry_cmd.cpp -misc_cmd.cpp -object_cmd.cpp -order_cmd.cpp -rail_cmd.cpp -road_cmd.cpp -roadveh_cmd.cpp -ship_cmd.cpp -signs_cmd.cpp -station_cmd.cpp -terraform_cmd.cpp -timetable_cmd.cpp -town_cmd.cpp -train_cmd.cpp -tree_cmd.cpp -tunnelbridge_cmd.cpp -vehicle_cmd.cpp -void_cmd.cpp -water_cmd.cpp -waypoint_cmd.cpp - -# Save/Load handlers -saveload/afterload.cpp -saveload/ai_sl.cpp -saveload/airport_sl.cpp -saveload/animated_tile_sl.cpp -saveload/autoreplace_sl.cpp -saveload/cargomonitor_sl.cpp -saveload/cargopacket_sl.cpp -saveload/cheat_sl.cpp -saveload/company_sl.cpp -saveload/depot_sl.cpp -saveload/economy_sl.cpp -saveload/engine_sl.cpp -saveload/game_sl.cpp -saveload/gamelog_sl.cpp -saveload/goal_sl.cpp -saveload/group_sl.cpp -saveload/industry_sl.cpp -saveload/labelmaps_sl.cpp -saveload/linkgraph_sl.cpp -saveload/map_sl.cpp -saveload/misc_sl.cpp -saveload/newgrf_sl.cpp -saveload/newgrf_sl.h -saveload/object_sl.cpp -saveload/oldloader.cpp -saveload/oldloader.h -saveload/oldloader_sl.cpp -saveload/order_sl.cpp -saveload/saveload.cpp -saveload/saveload.h -saveload/saveload_filter.h -saveload/saveload_internal.h -saveload/signs_sl.cpp -saveload/station_sl.cpp -saveload/storage_sl.cpp -saveload/strings_sl.cpp -saveload/story_sl.cpp -saveload/subsidy_sl.cpp -saveload/town_sl.cpp -saveload/vehicle_sl.cpp -saveload/waypoint_sl.cpp - -# Tables -table/airport_defaults.h -table/airport_movement.h -table/airporttile_ids.h -table/airporttiles.h -table/animcursors.h -table/autorail.h -table/bridge_land.h -table/build_industry.h -table/cargo_const.h -table/clear_land.h -table/control_codes.h -table/elrail_data.h -table/engines.h -table/genland.h -table/heightmap_colours.h -table/industry_land.h -table/landscape_sprite.h -table/newgrf_debug_data.h -table/object_land.h -table/palette_convert.h -table/palettes.h -table/pricebase.h -table/railtypes.h -table/road_land.h -table/roadveh_movement.h -table/roadtypes.h -../objs/settings/table/settings.h -table/sprites.h -table/station_land.h -table/strgen_tables.h -table/string_colours.h -../objs/langs/table/strings.h -table/town_land.h -table/townname.h -table/track_land.h -table/train_cmd.h -table/tree_land.h -table/unicode.h -table/water_land.h - -# MD5 -3rdparty/md5/md5.cpp -3rdparty/md5/md5.h - -# Compat -3rdparty/optional/optional.hpp -3rdparty/optional/ottd_optional.h - -# Script -script/script_config.cpp -script/script_config.hpp -script/script_fatalerror.hpp -script/script_info.cpp -script/script_info.hpp -script/script_info_dummy.cpp -script/script_instance.cpp -script/script_instance.hpp -script/script_scanner.cpp -script/script_scanner.hpp -script/script_storage.hpp -script/script_suspend.hpp -script/squirrel.cpp -script/squirrel.hpp -script/squirrel_class.hpp -script/squirrel_helper.hpp -script/squirrel_helper_type.hpp -script/squirrel_std.cpp -script/squirrel_std.hpp - -# Squirrel -3rdparty/squirrel/squirrel/sqapi.cpp -3rdparty/squirrel/squirrel/sqbaselib.cpp -3rdparty/squirrel/squirrel/sqclass.cpp -3rdparty/squirrel/squirrel/sqcompiler.cpp -3rdparty/squirrel/squirrel/sqdebug.cpp -3rdparty/squirrel/squirrel/sqfuncstate.cpp -3rdparty/squirrel/squirrel/sqlexer.cpp -3rdparty/squirrel/squirrel/sqmem.cpp -3rdparty/squirrel/squirrel/sqobject.cpp -3rdparty/squirrel/squirrel/sqstate.cpp -3rdparty/squirrel/sqstdlib/sqstdaux.cpp -3rdparty/squirrel/sqstdlib/sqstdmath.cpp -3rdparty/squirrel/squirrel/sqtable.cpp -3rdparty/squirrel/squirrel/sqvm.cpp - -# Squirrel headers -3rdparty/squirrel/squirrel/sqarray.h -3rdparty/squirrel/squirrel/sqclass.h -3rdparty/squirrel/squirrel/sqclosure.h -3rdparty/squirrel/squirrel/sqcompiler.h -3rdparty/squirrel/squirrel/sqfuncproto.h -3rdparty/squirrel/squirrel/sqfuncstate.h -3rdparty/squirrel/squirrel/sqlexer.h -3rdparty/squirrel/squirrel/sqobject.h -3rdparty/squirrel/squirrel/sqopcodes.h -3rdparty/squirrel/squirrel/sqpcheader.h -3rdparty/squirrel/squirrel/sqstate.h -3rdparty/squirrel/include/sqstdaux.h -3rdparty/squirrel/include/sqstdmath.h -3rdparty/squirrel/include/sqstdstring.h -3rdparty/squirrel/squirrel/sqstring.h -3rdparty/squirrel/squirrel/sqtable.h -3rdparty/squirrel/include/squirrel.h -3rdparty/squirrel/squirrel/squserdata.h -3rdparty/squirrel/squirrel/squtils.h -3rdparty/squirrel/squirrel/sqvm.h - -# AI Core -ai/ai.hpp -ai/ai_config.cpp -ai/ai_config.hpp -ai/ai_core.cpp -ai/ai_gui.cpp -ai/ai_gui.hpp -ai/ai_info.cpp -ai/ai_info.hpp -ai/ai_instance.cpp -ai/ai_instance.hpp -ai/ai_scanner.cpp -ai/ai_scanner.hpp - -# AI API -script/api/ai_changelog.hpp - -# Game API -script/api/game_changelog.hpp - -# Game Core -game/game.hpp -game/game_config.cpp -game/game_config.hpp -game/game_core.cpp -game/game_info.cpp -game/game_info.hpp -game/game_instance.cpp -game/game_instance.hpp -game/game_scanner.cpp -game/game_scanner.hpp -game/game_text.cpp -game/game_text.hpp - -# Script API -script/api/script_accounting.hpp -script/api/script_admin.hpp -script/api/script_airport.hpp -script/api/script_base.hpp -script/api/script_basestation.hpp -script/api/script_bridge.hpp -script/api/script_bridgelist.hpp -script/api/script_cargo.hpp -script/api/script_cargolist.hpp -script/api/script_cargomonitor.hpp -script/api/script_client.hpp -script/api/script_clientlist.hpp -script/api/script_company.hpp -script/api/script_companymode.hpp -script/api/script_controller.hpp -script/api/script_date.hpp -script/api/script_depotlist.hpp -script/api/script_engine.hpp -script/api/script_enginelist.hpp -script/api/script_error.hpp -script/api/script_event.hpp -script/api/script_event_types.hpp -script/api/script_execmode.hpp -script/api/script_game.hpp -script/api/script_gamesettings.hpp -script/api/script_goal.hpp -script/api/script_group.hpp -script/api/script_grouplist.hpp -script/api/script_industry.hpp -script/api/script_industrylist.hpp -script/api/script_industrytype.hpp -script/api/script_industrytypelist.hpp -script/api/script_info_docs.hpp -script/api/script_infrastructure.hpp -script/api/script_list.hpp -script/api/script_log.hpp -script/api/script_map.hpp -script/api/script_marine.hpp -script/api/script_news.hpp -script/api/script_object.hpp -script/api/script_order.hpp -script/api/script_priorityqueue.hpp -script/api/script_rail.hpp -script/api/script_railtypelist.hpp -script/api/script_road.hpp -script/api/script_roadtypelist.hpp -script/api/script_sign.hpp -script/api/script_signlist.hpp -script/api/script_station.hpp -script/api/script_stationlist.hpp -script/api/script_story_page.hpp -script/api/script_storypagelist.hpp -script/api/script_storypageelementlist.hpp -script/api/script_subsidy.hpp -script/api/script_subsidylist.hpp -script/api/script_testmode.hpp -script/api/script_text.hpp -script/api/script_tile.hpp -script/api/script_tilelist.hpp -script/api/script_town.hpp -script/api/script_townlist.hpp -script/api/script_tunnel.hpp -script/api/script_types.hpp -script/api/script_vehicle.hpp -script/api/script_vehiclelist.hpp -script/api/script_viewport.hpp -script/api/script_waypoint.hpp -script/api/script_waypointlist.hpp -script/api/script_window.hpp - -# Script API Implementation -script/api/script_accounting.cpp -script/api/script_admin.cpp -script/api/script_airport.cpp -script/api/script_base.cpp -script/api/script_basestation.cpp -script/api/script_bridge.cpp -script/api/script_bridgelist.cpp -script/api/script_cargo.cpp -script/api/script_cargolist.cpp -script/api/script_cargomonitor.cpp -script/api/script_client.cpp -script/api/script_clientlist.cpp -script/api/script_company.cpp -script/api/script_companymode.cpp -script/api/script_controller.cpp -script/api/script_date.cpp -script/api/script_depotlist.cpp -script/api/script_engine.cpp -script/api/script_enginelist.cpp -script/api/script_error.cpp -script/api/script_event.cpp -script/api/script_event_types.cpp -script/api/script_execmode.cpp -script/api/script_game.cpp -script/api/script_gamesettings.cpp -script/api/script_goal.cpp -script/api/script_group.cpp -script/api/script_grouplist.cpp -script/api/script_industry.cpp -script/api/script_industrylist.cpp -script/api/script_industrytype.cpp -script/api/script_industrytypelist.cpp -script/api/script_infrastructure.cpp -script/api/script_list.cpp -script/api/script_log.cpp -script/api/script_map.cpp -script/api/script_marine.cpp -script/api/script_news.cpp -script/api/script_object.cpp -script/api/script_order.cpp -script/api/script_priorityqueue.cpp -script/api/script_rail.cpp -script/api/script_railtypelist.cpp -script/api/script_road.cpp -script/api/script_roadtypelist.cpp -script/api/script_sign.cpp -script/api/script_signlist.cpp -script/api/script_station.cpp -script/api/script_stationlist.cpp -script/api/script_story_page.cpp -script/api/script_storypagelist.cpp -script/api/script_storypageelementlist.cpp -script/api/script_subsidy.cpp -script/api/script_subsidylist.cpp -script/api/script_testmode.cpp -script/api/script_text.cpp -script/api/script_tile.cpp -script/api/script_tilelist.cpp -script/api/script_town.cpp -script/api/script_townlist.cpp -script/api/script_tunnel.cpp -script/api/script_vehicle.cpp -script/api/script_vehiclelist.cpp -script/api/script_viewport.cpp -script/api/script_waypoint.cpp -script/api/script_waypointlist.cpp -script/api/script_window.cpp - -# Blitters -#if DEDICATED -#else - blitter/32bpp_anim.cpp - blitter/32bpp_anim.hpp - #if USE_SSE - blitter/32bpp_anim_sse2.cpp - blitter/32bpp_anim_sse2.hpp - blitter/32bpp_anim_sse4.cpp - blitter/32bpp_anim_sse4.hpp - #end - blitter/32bpp_base.cpp - blitter/32bpp_base.hpp - blitter/32bpp_optimized.cpp - blitter/32bpp_optimized.hpp - blitter/32bpp_simple.cpp - blitter/32bpp_simple.hpp - #if USE_SSE - blitter/32bpp_sse_func.hpp - blitter/32bpp_sse_type.h - blitter/32bpp_sse2.cpp - blitter/32bpp_sse2.hpp - blitter/32bpp_sse4.cpp - blitter/32bpp_sse4.hpp - blitter/32bpp_ssse3.cpp - blitter/32bpp_ssse3.hpp - #end - blitter/8bpp_base.cpp - blitter/8bpp_base.hpp - blitter/8bpp_optimized.cpp - blitter/8bpp_optimized.hpp - blitter/8bpp_simple.cpp - blitter/8bpp_simple.hpp -#end -blitter/base.hpp -blitter/common.hpp -blitter/factory.hpp -blitter/null.cpp -blitter/null.hpp - -# Drivers -music/music_driver.hpp -sound/sound_driver.hpp -video/video_driver.hpp - -# Sprite loaders -spriteloader/grf.cpp -spriteloader/grf.hpp -spriteloader/spriteloader.hpp - -# NewGRF -newgrf.cpp -newgrf_airport.cpp -newgrf_airporttiles.cpp -newgrf_canal.cpp -newgrf_cargo.cpp -newgrf_commons.cpp -newgrf_config.cpp -newgrf_engine.cpp -newgrf_generic.cpp -newgrf_house.cpp -newgrf_industries.cpp -newgrf_industrytiles.cpp -newgrf_object.cpp -newgrf_profiling.cpp -newgrf_railtype.cpp -newgrf_roadtype.cpp -newgrf_sound.cpp -newgrf_spritegroup.cpp -newgrf_station.cpp -newgrf_storage.cpp -newgrf_text.cpp -newgrf_town.cpp -newgrf_townname.cpp - -# Map Accessors -bridge_map.cpp -bridge_map.h -clear_map.h -industry_map.h -object_map.h -rail_map.h -road_map.cpp -road_map.h -station_map.h -tile_map.h -town_map.h -tree_map.h -tunnel_map.cpp -tunnel_map.h -tunnelbridge_map.h -void_map.h -water_map.h - -# Misc -misc/array.hpp -misc/binaryheap.hpp -misc/blob.hpp -misc/countedobj.cpp -misc/countedptr.hpp -misc/dbg_helpers.cpp -misc/dbg_helpers.h -misc/fixedsizearray.hpp -misc/getoptdata.cpp -misc/getoptdata.h -misc/hashtable.hpp -misc/str.hpp - -# Network Core -network/core/address.cpp -network/core/address.h -network/core/config.h -network/core/core.cpp -network/core/core.h -network/core/game.h -network/core/host.cpp -network/core/host.h -network/core/os_abstraction.h -network/core/packet.cpp -network/core/packet.h -network/core/tcp.cpp -network/core/tcp.h -network/core/tcp_admin.cpp -network/core/tcp_admin.h -network/core/tcp_connect.cpp -network/core/tcp_content.cpp -network/core/tcp_content.h -network/core/tcp_game.cpp -network/core/tcp_game.h -network/core/tcp_http.cpp -network/core/tcp_http.h -network/core/tcp_listen.h -network/core/udp.cpp -network/core/udp.h - -# Pathfinder -pathfinder/follow_track.hpp -pathfinder/pathfinder_func.h -pathfinder/pathfinder_type.h -pathfinder/pf_performance_timer.hpp - -# NPF -pathfinder/npf/aystar.cpp -pathfinder/npf/aystar.h -pathfinder/npf/npf.cpp -pathfinder/npf/npf_func.h -pathfinder/npf/queue.cpp -pathfinder/npf/queue.h - -# YAPF -pathfinder/yapf/nodelist.hpp -pathfinder/yapf/yapf.h -pathfinder/yapf/yapf.hpp -pathfinder/yapf/yapf_base.hpp -pathfinder/yapf/yapf_cache.h -pathfinder/yapf/yapf_common.hpp -pathfinder/yapf/yapf_costbase.hpp -pathfinder/yapf/yapf_costcache.hpp -pathfinder/yapf/yapf_costrail.hpp -pathfinder/yapf/yapf_destrail.hpp -pathfinder/yapf/yapf_node.hpp -pathfinder/yapf/yapf_node_rail.hpp -pathfinder/yapf/yapf_node_road.hpp -pathfinder/yapf/yapf_node_ship.hpp -pathfinder/yapf/yapf_rail.cpp -pathfinder/yapf/yapf_road.cpp -pathfinder/yapf/yapf_ship.cpp -pathfinder/yapf/yapf_type.hpp - -# Video -video/dedicated_v.cpp -video/null_v.cpp -#if DEDICATED -#else - #if ALLEGRO - video/allegro_v.cpp - #end - #if SDL - video/sdl_v.cpp - #end - #if SDL2 - video/sdl2_v.cpp - #end - #if WIN32 - video/win32_v.cpp - #end -#end - -# Music -#if DEDICATED -#else - #if ALLEGRO - music/allegro_m.cpp - #end - #if DIRECTMUSIC - music/dmusic.cpp - #end -#end -music/null_m.cpp -music/midifile.cpp -#if DEDICATED -#else - #if WIN32 - music/win32_m.cpp - #else - music/extmidi.cpp - #end - #if HAIKU - music/bemidi.cpp - #end - #if FLUIDSYNTH - music/fluidsynth.cpp - #end -#end - -# Sound -sound/null_s.cpp -#if DEDICATED -#else - #if ALLEGRO - sound/allegro_s.cpp - #end - #if SDL - sound/sdl_s.cpp - #end - #if SDL2 - sound/sdl2_s.cpp - #end - #if WIN32 - sound/win32_s.cpp - #if USE_XAUDIO2 - sound/xaudio2_s.cpp - #end - #end -#end - -#if OSX -# OSX Files - os/macosx/macos.mm - - #if COCOA - video/cocoa/cocoa_v.mm - video/cocoa/event.mm - video/cocoa/wnd_quartz.mm - music/cocoa_m.cpp - sound/cocoa_s.cpp - os/macosx/splash.cpp - os/macosx/string_osx.cpp - #end -#end - -# Windows files -#if WIN32 - os/windows/crashlog_win.cpp - os/windows/ottdres.rc - os/windows/string_uniscribe.cpp - os/windows/win32.cpp -#end - -# Threading -thread.h From 203a77c1dc722df677302e84c6d5c0d4cb06d8ee Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 11:45:52 +0200 Subject: [PATCH 02/41] Codechange: move regression outside of bin and make it work via CMake script The tst_stationlist savegame had to be changed to start the correct AI. In the old setup, all regression AIs had the same name, which made it impossible to run both regressions in parallel. With the new setup this is possible. Although all files are available to run the regression, it won't really work till CMake is introduced (which will happen in a few commits from here) --- bin/ai/regression/completeness.sh | 67 -------- bin/ai/regression/run.sh | 69 -------- bin/ai/regression/run.vbs | 152 ------------------ bin/ai/regression/tst_stationlist/test.sav | Bin 94348 -> 0 bytes cmake/scripts/Regression.cmake | 97 +++++++++++ .../regression => regression}/regression.cfg | 0 .../regression/info.nut | 0 .../regression}/main.nut | 0 .../regression}/require.nut | 0 .../regression}/result.txt | 0 .../regression/test.sav | Bin regression/stationlist/info.nut | 13 ++ .../stationlist}/main.nut | 30 ++-- .../stationlist}/result.txt | 0 regression/stationlist/test.sav | Bin 0 -> 94728 bytes 15 files changed, 125 insertions(+), 303 deletions(-) delete mode 100755 bin/ai/regression/completeness.sh delete mode 100755 bin/ai/regression/run.sh delete mode 100644 bin/ai/regression/run.vbs delete mode 100644 bin/ai/regression/tst_stationlist/test.sav create mode 100644 cmake/scripts/Regression.cmake rename {bin/ai/regression => regression}/regression.cfg (100%) rename bin/ai/regression/regression_info.nut => regression/regression/info.nut (100%) rename {bin/ai/regression/tst_regression => regression/regression}/main.nut (100%) rename {bin/ai/regression/tst_regression => regression/regression}/require.nut (100%) rename {bin/ai/regression/tst_regression => regression/regression}/result.txt (100%) rename bin/ai/regression/empty.sav => regression/regression/test.sav (100%) create mode 100644 regression/stationlist/info.nut rename {bin/ai/regression/tst_stationlist => regression/stationlist}/main.nut (89%) rename {bin/ai/regression/tst_stationlist => regression/stationlist}/result.txt (100%) create mode 100644 regression/stationlist/test.sav diff --git a/bin/ai/regression/completeness.sh b/bin/ai/regression/completeness.sh deleted file mode 100755 index 46cee4ed3e..0000000000 --- a/bin/ai/regression/completeness.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -if ! [ -f ai/regression/completeness.sh ]; then - echo "Make sure you are in the root of OpenTTD before starting this script." - exit 1 -fi - -cat ai/regression/tst_*/main.nut | tr ';' '\n' | awk ' -/^function/ { - for (local in locals) { - delete locals[local] - } - if (match($0, "function Regression::Start") || match($0, "function Regression::Stop")) next - locals["this"] = "AIControllerSquirrel" -} - -/local/ { - gsub(".*local", "local") - if (match($4, "^AI")) { - sub("\\(.*", "", $4) - locals[$2] = $4 - } -} - -/Valuate/ { - gsub(".*Valuate\\(", "") - gsub("\\).*", "") - gsub(",.*", "") - gsub("\\.", "::") - print $0 -} - -/\./ { - for (local in locals) { - if (match($0, local ".")) { - fname = substr($0, index($0, local ".")) - sub("\\(.*", "", fname) - sub("\\.", "::", fname) - sub(local, locals[local], fname) - print fname - if (match(locals[local], "List")) { - sub(locals[local], "AIAbstractList", fname) - print fname - } - } - } - # We want to remove everything before the FIRST occurrence of AI. - # If we do not remove any other occurrences of AI from the string - # we will remove everything before the LAST occurrence of AI, so - # do some little magic to make it work the way we want. - sub("AI", "AXXXXY") - gsub("AI", "AXXXXX") - sub(".*AXXXXY", "AI") - if (match($0, "^AI") && match($0, ".")) { - sub("\\(.*", "", $0) - sub("\\.", "::", $0) - print $0 - } -} -' | sed 's/ //g' | sort | uniq > tmp.in_regression - -grep 'DefSQ.*Method' ../src/script/api/ai/*.hpp.sq | grep -v 'AIError::' | grep -v 'AIAbstractList::Valuate' | grep -v '::GetClassName' | sed 's/^[^,]*, &//g;s/,[^,]*//g' | sort > tmp.in_api - -diff -u tmp.in_regression tmp.in_api | grep -v '^+++' | grep '^+' | sed 's/^+//' - -rm -f tmp.in_regression tmp.in_api - diff --git a/bin/ai/regression/run.sh b/bin/ai/regression/run.sh deleted file mode 100755 index 7574b0b388..0000000000 --- a/bin/ai/regression/run.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -if ! [ -f ai/regression/run.sh ]; then - echo "Make sure you are in the root of OpenTTD before starting this script." - exit 1 -fi - -if [ -f scripts/game_start.scr ]; then - mv scripts/game_start.scr scripts/game_start.scr.regression -fi - -params="" -gdb="" -if [ "$1" != "-r" ]; then - params="-snull -mnull -vnull:ticks=30000" -fi -if [ "$1" = "-g" ]; then - gdb="gdb --ex run --args " -fi - -if [ -d "ai/regression/tst_$1" ]; then - tests="ai/regression/tst_$1" -elif [ -d "ai/regression/tst_$2" ]; then - tests="ai/regression/tst_$2" -else - tests=ai/regression/tst_* -fi - -ret=0 -for tst in $tests; do - echo -n "Running $tst... " - - # Make sure that only one info.nut is present for each test run. Otherwise openttd gets confused. - cp ai/regression/regression_info.nut $tst/info.nut - - sav=$tst/test.sav - if ! [ -f $sav ]; then - sav=ai/regression/empty.sav - fi - - if [ -n "$gdb" ]; then - $gdb ./openttd -x -c ai/regression/regression.cfg $params -g $sav - else - ./openttd -x -c ai/regression/regression.cfg $params -g $sav -d script=2 -d misc=9 2>&1 | awk '{ gsub("0x(\\(nil\\)|0+)(x0)?", "0x00000000", $0); gsub("^dbg: \\[script\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' | grep -v '^dbg: \[.*\]' > $tst/tmp.regression - fi - - if [ -z "$gdb" ]; then - res="`diff -ub $tst/result.txt $tst/tmp.regression`" - if [ -z "$res" ]; then - echo "passed!" - else - echo "failed! Difference:" - echo "$res" - ret=1 - fi - fi - - rm $tst/info.nut - - if [ "$1" != "-k" ]; then - rm -f $tst/tmp.regression - fi -done - -if [ -f scripts/game_start.scr.regression ]; then - mv scripts/game_start.scr.regression scripts/game_start.scr -fi - -exit $ret diff --git a/bin/ai/regression/run.vbs b/bin/ai/regression/run.vbs deleted file mode 100644 index b4bdef4c17..0000000000 --- a/bin/ai/regression/run.vbs +++ /dev/null @@ -1,152 +0,0 @@ -Option Explicit - -' This file is part of OpenTTD. -' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -Dim FSO -Set FSO = CreateObject("Scripting.FileSystemObject") - -Function GetTestList() - Dim retests, i, tests, dir - Set retests = New RegExp - Set GetTestList = CreateObject("Scripting.Dictionary") - - retests.Pattern = "ai/regression/tst_*" - retests.Global = True - For i = 0 To WScript.Arguments.Count - 1 - Dim test - test = "ai/regression/tst_" & WScript.Arguments.Item(i) - If FSO.FolderExists(test) Then - retests.Pattern = test - Exit For - End If - Next - - For Each dir In FSO.GetFolder("ai/regression/").SubFolders - Dim name - name = "ai/regression/" & dir.Name - If retests.Test(name) Then - GetTestList.Add name, name - End If - Next -End Function - -Function GetParams() - GetParams = "-snull -mnull -vnull:ticks=30000" - If WScript.Arguments.Count = 0 Then Exit Function - If WScript.Arguments.Item(0) <> "-r" Then Exit Function - GetParams = "" -End Function - -Sub FilterFile(filename) - Dim lines, filter, file - - Set file = FSO.OpenTextFile(filename, 1) - If Not file.AtEndOfStream Then - lines = file.ReadAll - End If - file.Close - - Set filter = New RegExp - filter.Global = True - filter.Multiline = True - filter.Pattern = "0x(\(nil\)|0+)(x0)?" - lines = filter.Replace(lines, "0x00000000") - filter.Pattern = "^dbg: \[script\]" - lines = filter.Replace(lines, "") - filter.Pattern = "^ " - lines = filter.Replace(lines, "ERROR: ") - filter.Pattern = "ERROR: \[1\] \[P\] " - lines = filter.Replace(lines, "") - filter.Pattern = "^dbg: .*\r\n" - lines = filter.Replace(lines, "") - - Set file = FSO.OpenTextFile(filename, 2) - file.Write lines - file.Close -End Sub - -Function CompareFiles(filename1, filename2) - Dim file, lines1, lines2 - Set file = FSO.OpenTextFile(filename1, 1) - If Not file.AtEndOfStream Then - lines1 = file.ReadAll - End IF - file.Close - Set file = FSO.OpenTextFile(filename2, 1) - If Not file.AtEndOfStream Then - lines2 = file.ReadAll - End IF - file.Close - CompareFiles = (lines1 = lines2) -End Function - -Function RunTest(test, params, ret) - Dim WshShell, oExec, sav, command - Set WshShell = CreateObject("WScript.Shell") - - ' Make sure that only one info.nut is present for each test run. Otherwise openttd gets confused. - FSO.CopyFile "ai/regression/regression_info.nut", test & "/info.nut" - - sav = test & "/test.sav" - If Not FSO.FileExists(sav) Then - sav = "ai/regression/empty.sav" - End If - - command = ".\openttd -x -c ai/regression/regression.cfg " & params & " -g " & sav & " -d script=2 -d misc=9" - ' 2>&1 must be after >tmp.regression, else stderr is not redirected to the file - WshShell.Run "cmd /c " & command & " >"& test & "/tmp.regression 2>&1", 0, True - - FilterFile test & "/tmp.regression" - - If CompareFiles(test & "/result.txt", test & "/tmp.regression") Then - RunTest = "passed!" - Else - RunTest = "failed!" - ret = 1 - End If - - FSO.DeleteFile test & "/info.nut" - - If WScript.Arguments.Count > 0 Then - If WScript.Arguments.Item(0) = "-k" Then - Exit Function - End If - End If - - FSO.DeleteFile test & "/tmp.regression" -End Function - -On Error Resume Next -WScript.StdOut.WriteLine "" -If Err.Number <> 0 Then - WScript.Echo "This script must be started with cscript." - WScript.Quit 1 -End If -On Error Goto 0 - -If Not FSO.FileExists("ai/regression/run.vbs") Then - WScript.Echo "Make sure you are in the root of OpenTTD before starting this script." - WScript.Quit 1 -End If - -If FSO.FileExists("scripts/game_start.scr") Then - FSO.MoveFile "scripts/game_start.scr", "scripts/game_start.scr.regression" -End If - -Dim params, test, ret -params = GetParams() -ret = 0 - -For Each test in GetTestList() - WScript.StdOut.Write "Running " & test & "... " - WScript.StdOut.WriteLine RunTest(test, params, ret) -Next - -If FSO.FileExists("scripts/game_start.scr.regression") Then - FSO.MoveFile "scripts/game_start.scr.regression", "scripts/game_start.scr" -End If - -WScript.Quit ret diff --git a/bin/ai/regression/tst_stationlist/test.sav b/bin/ai/regression/tst_stationlist/test.sav deleted file mode 100644 index ef551c74ff8f74202cb30e88b6c063442b44ed78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94348 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

m)7|^p?)j=0PRJTUonc0|i)};Y~r~cVU zJJD(TpjVmd?>W{*Yd3)Xz%q*0%fyr8PSCKpd=X4m;zrMq^u|2{!jMqa<5eZTYmTQS-}*4iAGD-jYHE&HXJ@= z5}!cg9aE%y+$7w`|9YraHe-7Re0m-6pUI?1x?aFT`^^A%2&a($KiojjvXN5ub!Gfj z01VHMn8tTa%}HXFzXk2+(egM3&7F$iJ6k&<=3LKK2%RSR-M*At#{0Tb_Fi59Fwxu0 zILnaur|>Tcex&UJS11aXn#BtN=|xxhJk(ZC^mfV^X5Y`Abt!?V zmZIwXvhNBXV~u)+RASL{(tjX96*>=4K}0Ac+b<(7RD!fGEZ0Q^rS zA^i!(;r0C9dD?_qndOx8mRrIt@4yu$Z6L{mosS0BgDJ>DeGQVX<m40leCM6e|}&v|?@IGA~>5wue}B)>Xm63m(2)f+sFhokuiL8Hv#J1VdtyrE*5yTIhj$>OX2)KwLt@a|Gd+GZpV-$V#3fk2mA z?AJeR>#P`8jrqN992DL+F~5SOE8voU%jNn#JcZd3_A*Y3yDZDu_m*W%U^|PFc5ys=!Y-{B?}PE3!Q=sV~?xPRi2Mz zeZNCb5Y?bPs_der1@{lx18`eV$+l2UI;bcT)`Blh!tYOh`Za0@cXfY+ac5(dgHbc! zVlW+*sOGxf41vN z)0$UrVGnw&@%$i&Ttb74UR|~TG@-ho_4&WyA}4(OT8%p>u-nJb?O|(4%6;7kScNF} z>S;mJdk_p8g8prU#0$jv0C8TAY>557?30>jdqtKVrH0bRMtm2WfhX>Yv z>s7Z#>>Id6wsdN<$vY-9ah0NXjpunGLj z>IZjO$II9&AsY`3L$guPqJ)V5^W4m-W4wtEpVeF`W8@fyl|r+B{YCTOa$T)YOH%O^ zaJcOhdsJ-tK;#RRes0)MRNGO}Y#1Kbd6=VOZ^;nnINecn?b!VnwA}_;)~;Gnn-u>8 z-h)lRq8U&^+jb(W|50FC3@F0DN~)8ng$qG90Q_<(*RA>C;hHz4F;c0R_(p0@kq@$m zUr0nsTm*8hGNcHhRfg!|df1>bIW@7{Vo{XQZLU(eK#JQ$Z5lLntDO0;w;b*9( zbU@N{M@W*E-f$h5$Yjr5>zSzTk%H&4YmdBkS~+0|5@ieEn^R(~Mw4q!pj^HUjN@3- z?pHw{bt%QDSk;VPo16nIHF2S2O)QveF<$bM_WHRBICt)R{*90{b{m0o7`K86OQ z;m)nS@E*Y6cuGrz>lo?9c+TFWyEJ}z6zu^Fqs1&gb#8J1f9_sC**&?iYmSLpB? zP+zSi-oWF+9;k_i7FwzG+H~>?l#;s6YFd;q4j__MvCpRzj$6P7wGzp3HuJr362$9S zYf)8l!~#}ig7k;Jq)9U`%XuiTe4A_zKlD3NT)qFT!3Cd@$Oi;!bcS>H@04r>%?S-S z#{C^4Kp`lxeKEiVd@fG)rtU5as6L#k1&m&_)Y6gLl{m?%onAr=`XS-al;I{0ysgIy z7C5Gmv_Js2;vS{=tZgWDSW6(cE6^d`>mCM>WEu3OIb?Q4~smeGR@PEC?CU1o|{Wi~Xbc(yy#@HjiOWwuBPzo@|vT@gE z4cnYscYv+8-9WhECmeR!&e!^l!~q|vCfn125Oh$J@lt!{{ntT}QFos0=$DbpC+i#n zXdh2GPJo?BG6m~3o@y#pDB<>F2WU^5^99r5=qtONloME2*dO0Sz|_^yy7|F8l>auh zT7&ya9<=SS+Z;?f)9?v~Mze>^{eqDttQxP;o+wme(u-f%>Z%%jCdBY zw5JRPI}fRXE#K$4#2g%9mLmY3Vpw~}?+Z9l^?Mu9@)iXsh2KDWVhoGr7Te;9ttzlKGy@YNkV<(Sk|h5+yVF=ds5jm?S) ztaE6E3T=jcNURCG896Wj^PdP6?f^*c%^sLNTABT(&4+VihM5Z(0HEe%iSwu!~kAcZ6XGVB+vJXls z=Z>{T;LnP)a8Jh(zK@bWvN4v1v`g&xeSvYhEqo+H_DWe#0ad1|wv18{3p4^~%nyow zDv|Ohb@v&-2AEBl{n)S7kPpNqQ~33fHZcXIuI-I$T4rE;W$oQRXouLT}!ai%LK9c219)sdxOEkU-ibf#*HDfaqVvlM zSytqhvvAK1|bHV zGjT2HrR-Yp>bQvKY!_uaAn#4OlL6Qp-`~Hj z0NT{ecy|5RNB$aD)Xmqd9QwVSQ%vgLPBe=m@AA-+p%9Drp$l^y5>pcYS5cWw3v$On zhH&6|V9m5+eFf42yn_msLKGAfxt^?6zuT#!>ddU`{vr+wtMtY%8ssQsx2Bw2l4j%j zwTn`J9ONPYML^^cS?H`Ok38+?6^A&WHSqh|rzxO>Qq+(48W8*4U$MdhNuJFKTQXc! z^&yRO{>3pW4p3FX_DN{rB<<0N`SyZ~x*By1WfUh9Ml8iQMs-@BsFuPGCJ2>Zl6U-W z#%<4H4U6KzB0v1eZvmGsjVJe$Tx#L1H|159WHAG3Rz|8T4meouH7z^?^=8JivC5aw zXm$R1)|yj`&r;si+L6?_o3WDB(Ur!t8<_3c#y4>Xz@}Nwu4}H4I)|dwV!~{SQ<_2? z3}Y|#-%yubaAra`4IDmmf4QCKNNC&}%vd8|Ui&5K;d%-QX1XN^Z?&u{$gzq&=D?kf zH)0H{v-nyuK8Y$c7;AHPO^zW7^rX5<}OCT(i^OzA*ZKDPKUk zB)f>*xTdZ}5J`@&?ZYaBIw!hR!TB~l4Q^YxdR7?t%n!eS>)2|#WXmjg25GeR|5$8D zdZ8k|qisDA@ikAR{6^-(T^=742CI%NpZ)>tdl}JeWG6n{M4OPFy&UKo!SOv%2cZCBkRkvqiPn5GJm3FGGR$2&{C!3o6%iv zWyYp{NKEuYQc=BAio%~dUJR>tIOymkJzu&spiK)=sQHS8F&A0f2qLG+VUubidhiTJ z0AOY0d0ra4$qwjrxC}k##4H4HemND!{h_bBL_NPz4vzZ_#IRR=)Df5HY96Mu_f%h$ zav;e_n4P2siO`Ww0_t$D)lvWz?qt|wkzVh zyS4mdceQ7Q^~js1q(ki=q92pM>Ijp*68>1QJxZyc=SX!C&+PXTXfHZ}zMi_S9`kdf z*jW$$uF(|qHb=5CprO%Qsafw0w;}XqpSk>WyRHrk#a7x4Ow_mX>NhE4C7aosPu}0D zj*ZpLDLlb>{xYL=6XRn47DBM-f}Vr7`+fP-J=KcE8re*dgsdy|8H@NRUrt>*AWIvE zEr?@bJbZuTT`8mkB4;w-_?b0jMR2G;(j)LiCY;ei&@diPJyt#hJOLn6Qz@vcx7eb@ z_&V}J0fr7;f>6++s5Tf1{cxD7b^0Up2JCvxCDfRDAxIX4K`e=0eZ%{s`-Ps%V5<>PV?4R%BCNjJqFoUTT1l0WGN6Nzk1=wCQ+*QT>M_6eN3LEnnPk+pC>^# z9vLq9KG=sbm7!2G^ko>Oz4`7MeO~zW@OkcqKdI4YlyTeDbkP& zJ^rJRHWvz~sRopKL_VisX2Vn-Dy34?jCBuht_{pcfQ4;k8-&)sM^W`ZAD{j(-c8{5 zLqA`PB)OjsTfEUIt1?PRQ&qo02q2=aA|>0fpkGB2TZ9rMgr9ovw^ z8UcCS(@(9tKy`EsEBnasEJ<}9^XI*!D}AEYNrO%E->Wqzzm~rh`|4Epd4MnRDZ~MJ zBunf2UszujAF!eD*3aLDM)fSt=uo^+XUr`1;t>^qYt*}fa0m%RXE83Qxj3m%--b52 zOgJd;*XS!w9@oTe$WT@NJqUKW?VyPU9s{JM8ebWsFPr0q$@6BxG*AAO9 zSd+>OBctGfUl-8&sW{kQ$HV~oIea|mprXbYDku~1)kEz;VcEv`;!s{iO81}^+OV zfaF`!rj%LC^O?|`i`G1|M9L_iPLGewdK3ct9Tjyvmz;dD9<`^|tD_0A)aE_(s0QID zewV-b>E1s#{D9KJF?Q0SSP(P^*lJa=y$wN?Io5S^>cP<2X*Xn+HCmd=ZSB34l%$&GG|6yF8@MAn=AAz23dTfI zghr#T1S`^IA9JcunhF8;f1D`@moFN6HO{DcCf#*q$aKwJ(UP10x>C*nCRlU1-Tr+fdc93K$1o?0gPYIQO(#166@CtHzcAE3&x(HyrmYsMWzRTc0_tv&((M zZ{`jravA3aE}g3qi%T4MX#+NK4XHNde9PvH%Rf(lm>4qo_T%?1${>_AoxjRv7Ri4< zh&}rNHRJ*f(W5`*^c5@mtc zaFQM+L-owLM(o05HR;d>jqUN$bAZfXN*;PY>!1`g7>3PL5m8Uv`K~Sot9#e#BT zU&p3pW;X1AkwyP{5*EZx91UHS_E~Me_v*FxnHvonqTq03*GBH9aUJzlv6b%4SAB+# zRn+$Lvh&(l1FbN#wzR$>zdGh8=oz2x{@rtyST-~TUi)BkKJ6&LSWyaQG@rF8uy|&G zN($|c?X~Dr`5UeEb-M=R`wi?Na5s8fx{9G23n~EjyKis`uPBSXg-Q((Phs&}yaOB- z^5uPN>P?%n$I);)+}H%Wk_9&8ziFwKoxN|4%253jIq;-$2(wDb6Rm`V6>I_uV~v+@-uG?A=T=hIc_6PVx00;HPhF|4 zLs}T=?rM=CE*79yuo$;gtum0e7h>D(s&Sy($y125MO44T$=fcz@?-*tLDn0@)`o$E zjV!fqsOUNJtTZZrP+1;o+S%i=sv}f3BCk4NlJXwF^yPJ3V>Ku#rkTA1e|>hg z%}K_2P3sdylydT2Y^4(o>)<`a0U6U?ChvuDPTpOW*N>*6$6$a~Fg zM;0KTZAdRa>Uw?K0TCKa##QogFYvycne*)55sNI1qmO8AB*`&P^KWYh!GEJNM5pgXHi1T=6E)&@cEh4jhDH$cq@^)gdCM6wzN-i zrzdwTi9*?xqfXI+j5=k3H4qF9^H6u++7$pEygT)*#K{V%e_e7Y+3)^D$za->aAZDd z2|zE?;`v<#;V)$Uk+Yr}2_yjYuG|^Y?dW^YcUb=+Go}+Bc`Z}2Q}tz6oY!^NDbVBT z0y2D=@|k^Lst!!n*zYkfRo0q{=snMpQGqR+A3B#4RksQqaeivIZmiIrkBPz8JY!r` z{~`fO4vqG*C6#qoR6s-oXCz34N)4PJ`Z>M4S8WsyW%#Vt*6KLJ4xfh*KuvLYW;j21 z#4^%`*7J>1{-?3nXnhGIxd@0UnJ|vj<4LLByqLx8;YP9>h?SL>7vB#XYd?zAnv5)r zD6VAG!7e*y|5Kl3{tl8?UI63{H%D+^EV0!~$qA)jo7S^5kmh;sJips<8l|BWLol`X zXbb%4Atp_WL)9fbl=;4QPvt}uB!t27r7m2VjIw4j7vU_4axhTJj?RP;#?j|C(a2LC z7w!$;T>!*Z-&5pLYIdNb1rA<@JaG}ot3l18Ixd==Kyj;0_@EgQbc3wFkn@Qgz~{J+C#Dg@yY@Vo%?AS z-}rp{nO>~uZ49?Q0$32Q_V3GR9nPu{=YD&}KlE3fKO)Twj7?(&RvFZO)5xbw?ByNF z730K&Z?zTfj|PczymIj*lxdoJM8p{@x3jSb zDtaL+q%ap1f#25fmAg8TqMLp(dWzUT^m;$3H zAz0Xb1>s)M!)6y2KFi~s1Yd;37U-0q5L)o_$dFSh310`SI>Eb`135T-BHHU%*J;3; zD0*|;0MAhza4cYIB(KNGY*9@&XOR~L}oa6C{-nzO(BNc9tfJNdv7 z@X&iprWtu4JjlsLA~%kO{lOp+8Le7kW7r4u9?i`n{Fk6*WY!Y|v3Ln8;(0WWA!0^p zQAuSx5>@>GO_q3jFk*O_wmTNn>7WsiTdqF*hxw1_Yy!@6bNnSvs&njH-JOar-v1=T zty4RnNfhCLavn!v7`iDL_a5`wAu*<;r=4#bc5nvDC?tb!^abn{m(D8S{SU^;DOkwB zcFH2rmOon+MY9b0cUGuqDLza|IRU%8-*qA;%i!v4<$&6}Tg|xdkqQ`DeeE~udCm8Y z8EUOhB!y9(3v0VI6@QxOsDve`{py&^Lm{2TCeBdI%g1vUN5`pqVY=jz(Np7g(MN2J8xQ;n(F*>bL1ct5>_WA5-coHTaEfaRsn- zvutx85Y_+z*0b8s=sNu;9Cb`GPUss6%iGH$F7*;_muhiN=f$+LP3FobQ-qcUxx=~t zJ^2S807||tz&LYzcM}n)UMzHE`G>h2z_CG&;r&Axy@K@!>Jl+%SK%Ex5JOmgRB5SH$+V(8IUzdMj zc8Up5EZ?*q-8bKCbn`r`(_k1D_&JjE2~NM(^hI_+=1 zBd)`4h1k9m|L__iy_Uq$9neCSd-UXMMwWX!o%j^-b0^ zgv4yT2|fF#qLv|pkr8L3-rF^o`h~iAmAB?YiYaJ8Rv8V`jI3KHT>1tYm1%rW;4`{Z zcWu=sJ6*j%Fn8Q)Q)$~xi~A0P-zUB5$?EVEJ_5;IWDbtiFe%V_@p8z6 zKPc@vSE`k+f0IT`KFjDN2!@A=nhmA3!5+e?wtUA#IWeUk=~;vw;$mq0kDnyybdzg# znCE&TmI$j2r2&DL@h{PmtIInLg7_tzd*$z7&KV93$Jj&_65Z!|F~^VM{M6~HE|M9R^yEpu*vFQiB-j?_#@i-$;OTikxqKr-;IX z$!f)t=|Ej+FZEWwt$~Cd7U1oYJ_!cai7j&8ZONBP?*rSi-o#DzrNfbYfNMUx)ipNy zhFaQ{y%eum#j>dD|1?;hn!hH0=*f{EcUCJW1Xm?ew7qXC+tAI zQ zOnyDOJgizytc#?ypx>N|76VNd>1)*llIy8im^Us8UGfkZo3(}=jbOVKk!4CuzZs%d zHrja1@lVw6JC-e5oRT*w)hyOZT^l8yeUW%^WWdQSQE1l=Cy!?|{^uio)#8K(#MM-; zh`YeZG4jXlVJXOu=jNfxdV0G;#t4Y3F4(v)(lA+k-Xv#2RtYZ)*1`V39*iQ|*-^8- z5O9e`>BAj&m;2GGui#o#&@E+cA6>T9`dw5Q^MUa;!;3`?jg>Dxd18vFOtk)OgYpms zB1K6!(E}l}a1f|~J6~e3#+<2-Je%+5E~on^iRLT-R&_}>=dw9CKK_dyQ%C#D%;wg5 z{3`zCOmH5$<6?R$gyE2n`G>+?F)Zw_=#A;sHn-{$w@`M=uI z!xrKA`yCwV*KQ0pqSJ=+=076vue%pEu%YO6^J4EGL(q z`rWf9`jNqAtK@D&63{8+ct6p2*w5<7A)qYllHm?IqX%Qjm86iKslkq~n6TjJ9Z*mfe};kIFBbKFIq?(oCksrj%&QOL5@?(Yip)LH+{; zFR0MKj9ayJsd%;oCrz8%GZc%ihzCs&g}<>xeg-Xw2=s-@3rc5PV1%IF=!!v@P2p;* zWwzrd@ri*EV^QP<5+1)TxWj6ii?gx~IW37$3S|U5G%<=pZ=jx+uq)VhzLm#`vz8O* zlK+sNh*uQfDCsOdjv46`nt|c@CNJfv;)Z~27d5wRXN3KFe(Z<=SXp>VJ`g1E*!wPr za1F}qIT7fDb5Ea^mo7~^2!~u=q*Ow;34dgfB?aHmgBPzcD^fJk#>#bCdjF0C zTPDGVt{jmHUI|uzuhXF6(@(H6(4|$Ams&nzEyUp^Bd!TQ2RN1AMibR6%zy2Ta<%$I z9a2v@;9|R^$0^WI9MqtxCzNio}f6IT)dQ(c711pAs$ze+v#Qy7fQxr~*wF47vdSEAa>(~!${^I;Zs))S-O zLLf_`s1toO#(hG{#n(izKXXqlMNi4(t9&N7OCZxHzi!+x4UqlVBP|*B8}HsPU|6HE zcgp)g)_{^(oV#WFaxBce>*$~Y#0mTvMQ{O^t~J`6BrzP(ocp+{OYQRxgtol6IY~Jz zz(%E>tbkjoml&B%W>5ihX#L2Z%Z;nJ2Hm_=S!N)#dg+GSo4+n1fx_UTuxxT8Vhzd_ zN|goLooL-#G(Kcritgd(w@SL>MUrtAx^qq2gOjWGaf;~i_DoN-_;tlxZp-KspGHWS z0eM#3)b2v%s4Qd)qH#EZV8+0FSWRd!eE|*S2$sbAK>p@Z!TCB>!PQ3o0T*s8X5D;LNS?nm2lvN?t2-qp!%H7i(bbFnaIf_RI8s-We{)q!QVTzT7*!B!7_ z86&(V{E~^v=^ZUUj1Nq~@p8S$WjDT0`i5JKC7Ol6u>+lT4|(GNn|q6=>b}2{92a~u zf2){)yE#MrxsDl{2_I`?^)Z$3Y<-{0$IrEN>qEO#atH_aYWXpCD;yC5ZIlIhd=r(S@M^Dvssq(PPSeE+B zv5@$NJXTLq-DYBN(l!xwFqj&yLvwbrB^DE;*?mw_l{(P>p0)_;k=~sAu0eYI%du+r z+w@5wQEm;S%}0B#6@uej^p~q8gGuw^tlZovP|7TR(QgH7sPD_hB4}1LG=}UbN5{&x z>dJY0)qmlVVOK!QYHG9Y$sfwrzmF}4 zHuW4zS<*QLYls#!;9D=c-cQNxU}+bSEt`ks522s z%4FK;H71lRYZL^6ii=_KO>1>MZZw$xJ*AiE1TvI9$9yHxr*%;d>nu=GzPA2H38){X zxcW;jS||-ULo!h~NG$V@pfl2?+$KEm=Y^NBCq4MepzV zSPtU^Bw5B*(gDOn+X;3F#kSt?a0_ipa{PUVG{nJ<`c30twRV>q!rzA}SE*LhICCB_ zC3&FqC$SF259wE)4azFNS9gnS#c+M6mxv9l`c?z`BG&?$y6Gn8vJrBTY4N&unpGOT zX9RQ@(5Cm!szkpu)DRgB8gMru!34Z!d3nRJCrW?H0_7lZr^}!{YO=;43lN7Qc|)GxqL1 zl6o%+VgAwb?pz3OH841Tsf&|>@Da$4ZIKSUfO>$tA`YrweR^E<%bewKzc&T=MvrN- z!EQv}z8XL__ElU7V#$vNwSu-Tc)@Gku_OV@B`^D8D%g&@zg~LuRbQ3kyP|^I(bc6m zGh4PHkJVJQ7)38M+i?W2#63K`g4;uUR}&Z&%_;&~1|xX~jLDtYP=I`2v%bGn0tk@( z1DSKf0Up<$uSWXLFD*10qAWKgyXl#H{eaV{l-(;8f19T}H6vw)0u@^gC?E{T7(4ag zFv|vHLdzE(LF4yFA}V;+0=7N^+EfA}w)gW94E0gh@!QErl4hHmh~oAdFKFqK?*=S+ z8mmg;QPNUE0$%iA%fA%ZMrd&uXH2++pSkd#h)EJ-;%b7@=e*iWzB*NcoM=Ye(Un=Y zS(1X2HJWeent{wbZc)IkzIG(%+r%^)AE+S>h%V$PX@C^rqJvCdjN%V$KTh6A@V9^RmFv2S>olNk362zq)OF55v+*+#2Dv6) zPcpdxkhtm`j1=M4U~#mJQHEb5_s!y*d*RTk7#DN{GuoIJwW0Fo~0E<@37Ir z()*HY4D_}e9GJxZC46%~HJ_Fg<0_GG`r{m^QSx+ao>DggW0%Rp)!Qw=e`Xi>rVSnC2l z54kGe*0=xRwAA^QMKRUvITD%({KX@Yt#V8S*RdP6zeak>qFXbJmRipipgxYGFvp*| z1{K7~&FmNg?d|D2=h~F&lVN}LuvE2+N32c(HX7?Ig&$Bv08W_e{lp{|x3e=ndo8~Q z8#V4XCY+B*YfNj|Pqo}SO)faFS!+L|+QSKUfXChKsl2Q3X)rkeWBRpO%1tem9Hdx$ zb;GVt)M**vEU;c2Bj*-z{&`gt1%a~qS}xGV`0O7h*Pb(>t*7{7EHSkg%kj@ zs0X%QThs+;>_JV9!MiN;oIDi|8~X!|i@L*pDDepK1N4ozvx zPV)B6TZAFt%HpA_dxALdpk618NnUUkXarmaf)*Ho6q!f%8nIc+yjpWxZENrXfFx z_9I_p(4p^}K%XtApokQ(;UwRRS<$GQLf;GBEGJw?*Y#c3b@@8i(YJl~@E-hEgHzEJ zjXHaP$q4qPYV*MQu?7AyeDT~YA^GFU6GrV`g;KhQqZ^r-7^T_@LU*u4c=OcTg8o_m zD<33Nz4!K-94Y=;n)Y>TY9W(d5S%)}Mp}Ap^BAVr4zygLO9Ig^ed}+Ckhovz?BXZ0 z3NZ^apdK$$Ih*IHpUWEbI%@<%x4hwL`xl~(@R7zFfsO2?8p_1f}CC)7a>3D-3+na z5=!te$k_p0p_eGd)RTua$J?cD|d%$D)CrKxeQ zBS2KZ3q4n0@7iuuVN%3)OcTuSi<{G`AF_Y=4)1Iv*Q3ZsbmFM)eF*5AEHcEO659M+ zHH^Z6(zN?Id%Rn}aq7+@rJ!6VO%1Y?6|^RP=&{nn-gA868=)3#RF|N9eCSb#7MBA^ zx@=Lk5nZx(d^QY5kE~dwEDb;umH}!N)>CrgpZceq{YO z>K{tU41ZiN4pZ`sIEJq5(m;&5(M=AV*Ew_0wExQqo; z8cQzqw_^TZCahXIi$KMPi58782`b{ogAgoG)s2y(`}O<2 zvg0jJM#(NB{B5!vcjPv6VC1Rq38JhB>>*UB$0hFn%4TqVSN1La$&EWGPhofO*v zGREKn84%=cxex;Acf%dZD~mub=OLEJzDzH_lqVMz5b}OJS8{qy#|tUi7_NPx4@e%5 zl^p4w5L_>&7HsU~#9NhA>MSva0+^)Oc~0)ylwlcj~&E62sSa<4AwhX4s-sEoR^RKl6^ z+`FXXj`29DfQp&McAl(V56?W9peywUWF}mGB!&+Vi^{oT6o>3qnb@l5Ua-m8mO%rj z>?B7C{~|#SFU#nzQW#v`jS%CcvM3-L)k@zWEkV-EYn;cZKDQ3#9Phs&;nq> z5?(F7@vVaWG3G6qmAcQt+nFf`xk-0UG4B}pb_WVIPz@?+e=*t1mBl!%*n1075qtdH zcWd{%OGr=7rIE-IJy$pM7b#lvRd4mPh^Qs2MY1JKSq0ehjRCGv!><5tRL6jBfE24s zc@)4_dmHws91QOphamD&vdNyR^<#@kI6c%z?9T*%j;v3Naw@d0$d z;kx7<{%e2W(@ImiToEf%_*=E!0vQ2L{cKiSyc8^YhfCBY`L?|>pDizLHk8?KQ$ew# z;}$Y=-aPDo%^q^ztx#NUoEqz#`GUmmkM<8^D|xW16O)m+~;(|w34Mc0T|5~4b; zQ!+OLt+XY|UE@B)t%+8SFfPGYW`zEncB&dM)oMJk+Y?x)v>c1OlhAhJI#tuwXx{Z9 zYB8B>V@ttn zcWVQJF#_KVxC}jKYRZal%GLOiE2WgF>fKN((HRfNN!FYAyc|sYhDZc`@tRhJO)L4q zGAwraZC*eU*Sm2N45)c*Ise<$z3*+>vyU)A;oR=TUC#Llh{lgx5rlx^CgkFpAdO0K zk(?4$2c4dq8yH*N!_hMTy4{*AmeoZT{I`{JTyo~wcjs&YU^trry&Pe0SKPRg+SGq3 zB}Z{o&V4@7GXreg+D~`eON5R7&`wsA1K`7tRsojCLguEbHdYZ-O$5_=jMPecOeSJ} ztbxa8tIg3B#vZAH9E}@ad3t2fq|8GEF@RNm(4Oy-xJ7Is3rasp~s1VK1oTQLO7 zM%cQzTzQl0+8WM^hN`nhduP)Db#|jNlJ4C@^{+QO&)wE4Lx2VlsR4lD)O%)u(?A!P zt`p8Bydo9QiM+a?!U^n^(m6JHDVsH^fuSZWbKC+FN2D-LmEW4P5lS5oLwpS?n{oxycK@M_DspTz_wE?qMxKPcTq+Jzw`2W=vUHTg!3*=2 z-vLTSug4k4w!?2rRmih=cf-!f?VwK+9v@~AGxdd(07Joo3MoCjvRxf@oPc;qjzn;H zeFJHzEZb4Zc8|;!u%1@gX98VFQ?WbRqZNc}V~T7X=^BC>MlFr7%Jb7#T3O?_DX$7> zgW_Ej{?RM>P@^Qw1Wg+S+5M9uOR&L5H?*P>K(~CB^pB6Q2}o+UxfkfmGmcve@<^^j z(YWh+6&9vJZ~VU+^;+czwfc_|XO#^V4!YvPO`aM1JPjcUW}gmD(~9M#JH_cAN(!N$ zF^WQ1+)PK1tFGs#vnub_CE1P4y4~rCV>ZJZ>1c1f1%O_Ef>}2Le%~Q*Xd+?df=NnUNsd7cvA^U?K{;}7j2ujqE4EO@BS*=Ux4`L}y{_PZV zj3n4(%GbL7-}nyrC9{yV|B(tW=v>wLAdQuCXAgUQpgsPTK)h?Qy$C(ZpjrZ8Pf<5!HJbJ}rjEQZ!t;Z8~AJ zxFJ&Kp=ofO;uXt*u93+OQZj&dmtPDxGs7t~!8dXr*?^WJWyccf@N5Bu`!?j)8GTB7 zKn4y*%57#=>&jW%7hx~9Ag+4`w3^t$r*}yJ>6RqaeYZ>?Pu3is zNd|(Hg$%~V?`gL6{Xn8DrQ|l_A^j60-;2l$b1cZz7EtZ~PSRqGPF+sN+5?8Ce{1#k zf`^*NQLh`ksN=l!RF$07(&bxxvGF?TKk+fu#oQ`=<3$OU!I#?lf~tuXO_iVCH|Hq=v}U81mC}?r<~l3K@kC z^+SR|2qE?0p*&!xL(%cx%=5x@E%H>~)C5X$1Hy zP&6Mk{H^=uj*4~<4A<;l5OJg}%L4pO;zE&#icuZT|7Xw3?Nu`ZwpC3%NxMyc^^WLb$w{)CQgJZo7a=&Mv)WQ8 ze_zvCY)>f{?yf2&BwPM>GKCO$BEoY7FzU~$bMYtx>z6omZcXpK%)`!ng|jo44iG=y z`|;ieni`CpFpp90hPQRGG$)BrfKp%3s#pYzpv##)0PAezrH*FmjC`kV0vq&8(-ETHwt{~O- zvYz75+dHwQ8LBHq;ln#e?l6NH55ncSsPsS*^o=OG(2Ke8u0!xF^XKByEG3U*Qvk5Z z0C<9@h!x;c?W`QSP=RZ|EQA2Ry6mz*d>U8IzI%H%jlg|BOoAdH#|wo8 zohphCYEic~zZl}17M|@M$A-fZ6&f;a1ktas_U=DZWuhuU4vmXvHC?nVeoh22u$wnu z_K~tqMbUo+RuCaZyAFMv1W+#w$+4}upKqQ$K{DU=M8&EC92AzAFG80jL9M^$%r6v#+?3buQXQvwZ5mLT>rN6%jw&Ztf#Wkp49504AJJhFF;(PJ|uE@Bd8GWlOTt_PpT~H z3uJmUsA$G4+-D`Q6!J{{%y-V9X84Gh8+{VZ+gUXTJiOa)Q8VXj5F1O{l)=RU5+6@H z-ewSrZm>X$w;!C$Ekdy*>GG1gf5QA#CcGU(N_6~t6^Q{@1%S)|8--Aco9R<0x4Dc9 zLx;m9c@(~oG&fSLU0n2A!k#a+UadVT3C-$tB#*db_bwl!bzU_J;Z4$5dfx%~VS?sR zSa5EB9dox=e9?%5l;YTI3?E*6wP7P#xQv;nOS0bZa^h1Q+;B0l^6Sy|i&Zj^KpMhN z!|l&UFIsC7lUF0ff})0?>I*SKqRc;9Gh^}0YcUU=qT zYR6K0J9UGzqAWn1*wFI<8FMoznEuC3K^w1r%A7XWSSS>n2ittP_9VXA(nx~Preanj z&5=D>2LWXitRwCw@bQF4J)e4DM+}g1gH>|GtQPxj=ZJSx^!o?c=Geq$CDu=X&uY|F z{B(?JpsYwUDxU9Eo_t_R z13I-bP`WOyHDEYJHCL%8j1=C)tk~~1A2gBRF%7UH_H9#B&Q!K6LkC8esHq=o&f1xT zRpw{;Wdq=_Y&`@{MhbyJyQWoC5!vKs&nu@HpukT8TYEJklO=3fS;Hj-o?$f=}ey#Oo=^Dl$O3bX>Fc@ z9Y*IU{;tr>l|=a#$(!s-b+<7eJQr`$ZvC*hy#Em>0Ox7Wc3j}SxQP7_f>8Q9A9i

iSA6q*L7609m{Z@gb5e$vi_IaROS~lK^RE5 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

UJ+!7DS;A! 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 T2!+>XJ}?c70ssI200CKA>Q=<2 literal 0 HcmV?d00001 From 85315e2e3132dd7aff9ee96c1ba8d282350d9d5e Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 11:51:19 +0200 Subject: [PATCH 03/41] Codechange: rework how grf and ob[msg] are generated For grfs, it now uses CMake scripts to do its job, and both grf files are split into their own folder to make more clear what is going on. Additionally, it no longer builds in-source (although the resulting grf is copied back in the source folder). For ob[msg] it now uses CMake scripts to generate the translation files; the result is no longer stored in-source (but in the build folder). Although all files are available to create the GRFs and basesets, it won't really work till CMake is introduced (which will happen in a few commits from here) --- cmake/scripts/Baseset.cmake | 53 +++++++ cmake/scripts/CreateGRF.cmake | 44 ++++++ media/baseset/CMakeLists.txt | 87 +++++++++++ media/baseset/no_music.obm | 2 +- media/baseset/no_sound.obs | 2 +- {bin => media}/baseset/openttd.grf | Bin .../{extra_grf => baseset/openttd}/2ccmap.nfo | 0 media/baseset/openttd/CMakeLists.txt | 9 ++ .../openttd}/airport_preview.nfo | 0 .../openttd}/airport_preview.png | Bin .../openttd}/airports.nfo | 0 .../openttd}/airports.png | Bin .../openttd}/aqueduct.nfo | 0 .../openttd}/aqueduct.png | Bin .../openttd}/autorail.nfo | 0 .../openttd}/autorail.png | Bin .../openttd}/canal_locks.png | Bin .../{extra_grf => baseset/openttd}/canals.nfo | 0 .../{extra_grf => baseset/openttd}/canals.png | Bin .../{extra_grf => baseset/openttd}/chars.nfo | 0 .../{extra_grf => baseset/openttd}/chars.png | Bin .../openttd}/elrails.nfo | 0 .../openttd}/elrails.png | Bin .../{extra_grf => baseset/openttd}/flags.nfo | 0 .../{extra_grf => baseset/openttd}/flags.png | Bin .../openttd}/foundations.nfo | 0 .../openttd}/foundations.png | Bin media/{extra_grf => baseset/openttd}/mono.nfo | 0 media/{extra_grf => baseset/openttd}/mono.png | Bin .../{extra_grf => baseset/openttd}/oneway.nfo | 0 .../{extra_grf => baseset/openttd}/oneway.png | Bin .../openttd}/openttd.nfo | 0 .../openttd}/openttdgui.nfo | 0 .../openttd}/openttdgui.png | Bin .../openttd}/openttdgui_build_tram.png | Bin .../openttd}/openttdgui_convert_road.png | Bin .../openttd}/openttdgui_convert_tram.png | Bin .../openttd}/openttdgui_group_livery.png | Bin .../openttd}/palette.nfo | 0 .../openttd}/roadstops.nfo | 0 .../openttd}/roadstops.png | Bin .../openttd}/signals.nfo | 0 .../openttd}/signals.png | Bin .../openttd}/sloped_tracks.nfo | 0 .../openttd}/sloped_tracks.png | Bin .../openttd}/tramtracks.nfo | 0 .../openttd}/tramtracks.png | Bin .../openttd}/tramtracks_bare_depot.png | Bin .../openttd}/tunnel_portals.nfo | 0 .../openttd}/tunnel_portals.png | Bin {bin => media}/baseset/opntitle.dat | Bin media/baseset/orig_dos.obg | 4 +- media/baseset/orig_dos.obm | 2 +- media/baseset/orig_dos.obs | 2 +- media/baseset/orig_dos_de.obg | 4 +- {bin => media}/baseset/orig_extra.grf | Bin media/baseset/orig_extra/CMakeLists.txt | 14 ++ .../orig_extra}/airports_orig_extra.nfo | 0 .../orig_extra}/canals_extra.nfo | 0 .../orig_extra}/chars_orig_extra.nfo | 0 .../orig_extra}/fix_graphics.nfo | 0 .../orig_extra}/fix_graphics.png | Bin .../orig_extra}/orig_extra.nfo | 0 .../orig_extra}/rivers/arctic.nfo | 0 .../orig_extra}/rivers/arctic_brown.png | Bin .../orig_extra}/rivers/arctic_snowy.png | Bin .../orig_extra}/rivers/rapids.nfo | 0 .../orig_extra}/rivers/rapids.png | Bin .../orig_extra}/rivers/temperate.nfo | 0 .../orig_extra}/rivers/temperate.png | Bin .../orig_extra}/rivers/toyland.nfo | 0 .../orig_extra}/rivers/toyland.png | Bin .../orig_extra}/rivers/tropic.nfo | 0 .../orig_extra}/rivers/tropic_desert.png | Bin .../orig_extra}/rivers/tropic_forest.png | Bin .../orig_extra}/shore.nfo | 0 .../orig_extra}/shore.png | Bin media/baseset/orig_tto.obm | 2 +- media/baseset/orig_win.obg | 4 +- media/baseset/orig_win.obm | 2 +- media/baseset/orig_win.obs | 2 +- media/baseset/translations.awk | 67 -------- media/baseset/translations.vbs | 145 ------------------ media/extra_grf/assemble_nfo.awk | 30 ---- 84 files changed, 220 insertions(+), 255 deletions(-) create mode 100644 cmake/scripts/Baseset.cmake create mode 100644 cmake/scripts/CreateGRF.cmake create mode 100644 media/baseset/CMakeLists.txt rename {bin => media}/baseset/openttd.grf (100%) rename media/{extra_grf => baseset/openttd}/2ccmap.nfo (100%) create mode 100644 media/baseset/openttd/CMakeLists.txt rename media/{extra_grf => baseset/openttd}/airport_preview.nfo (100%) rename media/{extra_grf => baseset/openttd}/airport_preview.png (100%) rename media/{extra_grf => baseset/openttd}/airports.nfo (100%) rename media/{extra_grf => baseset/openttd}/airports.png (100%) rename media/{extra_grf => baseset/openttd}/aqueduct.nfo (100%) rename media/{extra_grf => baseset/openttd}/aqueduct.png (100%) rename media/{extra_grf => baseset/openttd}/autorail.nfo (100%) rename media/{extra_grf => baseset/openttd}/autorail.png (100%) rename media/{extra_grf => baseset/openttd}/canal_locks.png (100%) rename media/{extra_grf => baseset/openttd}/canals.nfo (100%) rename media/{extra_grf => baseset/openttd}/canals.png (100%) rename media/{extra_grf => baseset/openttd}/chars.nfo (100%) rename media/{extra_grf => baseset/openttd}/chars.png (100%) rename media/{extra_grf => baseset/openttd}/elrails.nfo (100%) rename media/{extra_grf => baseset/openttd}/elrails.png (100%) rename media/{extra_grf => baseset/openttd}/flags.nfo (100%) rename media/{extra_grf => baseset/openttd}/flags.png (100%) rename media/{extra_grf => baseset/openttd}/foundations.nfo (100%) rename media/{extra_grf => baseset/openttd}/foundations.png (100%) rename media/{extra_grf => baseset/openttd}/mono.nfo (100%) rename media/{extra_grf => baseset/openttd}/mono.png (100%) rename media/{extra_grf => baseset/openttd}/oneway.nfo (100%) rename media/{extra_grf => baseset/openttd}/oneway.png (100%) rename media/{extra_grf => baseset/openttd}/openttd.nfo (100%) rename media/{extra_grf => baseset/openttd}/openttdgui.nfo (100%) rename media/{extra_grf => baseset/openttd}/openttdgui.png (100%) rename media/{extra_grf => baseset/openttd}/openttdgui_build_tram.png (100%) rename media/{extra_grf => baseset/openttd}/openttdgui_convert_road.png (100%) rename media/{extra_grf => baseset/openttd}/openttdgui_convert_tram.png (100%) rename media/{extra_grf => baseset/openttd}/openttdgui_group_livery.png (100%) rename media/{extra_grf => baseset/openttd}/palette.nfo (100%) rename media/{extra_grf => baseset/openttd}/roadstops.nfo (100%) rename media/{extra_grf => baseset/openttd}/roadstops.png (100%) rename media/{extra_grf => baseset/openttd}/signals.nfo (100%) rename media/{extra_grf => baseset/openttd}/signals.png (100%) rename media/{extra_grf => baseset/openttd}/sloped_tracks.nfo (100%) rename media/{extra_grf => baseset/openttd}/sloped_tracks.png (100%) rename media/{extra_grf => baseset/openttd}/tramtracks.nfo (100%) rename media/{extra_grf => baseset/openttd}/tramtracks.png (100%) rename media/{extra_grf => baseset/openttd}/tramtracks_bare_depot.png (100%) rename media/{extra_grf => baseset/openttd}/tunnel_portals.nfo (100%) rename media/{extra_grf => baseset/openttd}/tunnel_portals.png (100%) rename {bin => media}/baseset/opntitle.dat (100%) rename {bin => media}/baseset/orig_extra.grf (100%) create mode 100644 media/baseset/orig_extra/CMakeLists.txt rename media/{extra_grf => baseset/orig_extra}/airports_orig_extra.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/canals_extra.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/chars_orig_extra.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/fix_graphics.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/fix_graphics.png (100%) rename media/{extra_grf => baseset/orig_extra}/orig_extra.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/arctic.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/arctic_brown.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/arctic_snowy.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/rapids.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/rapids.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/temperate.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/temperate.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/toyland.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/toyland.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/tropic.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/tropic_desert.png (100%) rename media/{extra_grf => baseset/orig_extra}/rivers/tropic_forest.png (100%) rename media/{extra_grf => baseset/orig_extra}/shore.nfo (100%) rename media/{extra_grf => baseset/orig_extra}/shore.png (100%) delete mode 100644 media/baseset/translations.awk delete mode 100644 media/baseset/translations.vbs delete mode 100644 media/extra_grf/assemble_nfo.awk diff --git a/cmake/scripts/Baseset.cmake b/cmake/scripts/Baseset.cmake new file mode 100644 index 0000000000..4329dbdf8c --- /dev/null +++ b/cmake/scripts/Baseset.cmake @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.5) + +# +# Create a single baseset meta file with the correct translations. +# + +set(ARGC 1) +set(ARG_READ NO) + +# Read all the arguments given to CMake; we are looking for -- and everything +# that follows. Those are our language files. +while(ARGC LESS CMAKE_ARGC) + set(ARG ${CMAKE_ARGV${ARGC}}) + + if (ARG_READ) + list(APPEND LANG_SOURCE_FILES "${ARG}") + endif (ARG_READ) + + if (ARG STREQUAL "--") + set(ARG_READ YES) + endif (ARG STREQUAL "--") + + math(EXPR ARGC "${ARGC} + 1") +endwhile() + +# Place holder format is @_@ +file(STRINGS "${BASESET_SOURCE_FILE}" PLACE_HOLDER REGEX "^@") +string(REGEX REPLACE "@([^_]+).*@" "\\1" INI_KEY "${PLACE_HOLDER}") +string(REGEX REPLACE "@[^_]+_(.*)@" "\\1" STR_ID "${PLACE_HOLDER}") +string(REGEX REPLACE "@(.*)@" "\\1" PLACE_HOLDER "${PLACE_HOLDER}") + +# Get the translations +foreach(LANGFILE IN LISTS LANG_SOURCE_FILES) + file(STRINGS "${LANGFILE}" LANGLINES REGEX "^(##isocode|${STR_ID})" ENCODING UTF-8) + string(FIND "${LANGLINES}" "${STR_ID}" HAS_STR_ID) + if (HAS_STR_ID LESS 0) + continue() + endif (HAS_STR_ID LESS 0) + string(REGEX REPLACE "##isocode ([^;]+).*" "\\1" ISOCODE "${LANGLINES}") + if ("${ISOCODE}" STREQUAL "en_GB") + string(REGEX REPLACE "[^:]*:(.*)" "${INI_KEY} = \\1" LANGLINES "${LANGLINES}") + else() + string(REGEX REPLACE "[^:]*:(.*)" "${INI_KEY}.${ISOCODE} = \\1" LANGLINES "${LANGLINES}") + endif() + list(APPEND ${PLACE_HOLDER} ${LANGLINES}) +endforeach(LANGFILE) +list(SORT ${PLACE_HOLDER}) +string(REPLACE ";" "\n" ${PLACE_HOLDER} "${${PLACE_HOLDER}}") + +# Get the grf md5 +file(MD5 ${BASESET_EXTRAGRF_FILE} ORIG_EXTRA_GRF_MD5) + +configure_file(${BASESET_SOURCE_FILE} ${BASESET_BINARY_FILE}) diff --git a/cmake/scripts/CreateGRF.cmake b/cmake/scripts/CreateGRF.cmake new file mode 100644 index 0000000000..f5811daf9f --- /dev/null +++ b/cmake/scripts/CreateGRF.cmake @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.5) + +# +# Create a single GRF file based on sprites/.nfo and sprites/*.png +# files. +# + +if (NOT NFORENUM_EXECUTABLE) + message(FATAL_ERROR "Script needs NFORENUM_EXECUTABLE defined") +endif (NOT NFORENUM_EXECUTABLE) +if (NOT GRFCODEC_EXECUTABLE) + message(FATAL_ERROR "Script needs GRFCODEC_EXECUTABLE defined") +endif (NOT GRFCODEC_EXECUTABLE) +if (NOT GRF_SOURCE_FOLDER) + message(FATAL_ERROR "Script needs GRF_SOURCE_FOLDER defined") +endif (NOT GRF_SOURCE_FOLDER) +if (NOT GRF_BINARY_FILE) + message(FATAL_ERROR "Script needs GRF_BINARY_FILE defined") +endif (NOT GRF_BINARY_FILE) + +get_filename_component(GRF_SOURCE_FOLDER_NAME "${GRF_SOURCE_FOLDER}" NAME) + +file(WRITE sprites/${GRF_SOURCE_FOLDER_NAME}.nfo "") +file(READ ${GRF_SOURCE_FOLDER}/${GRF_SOURCE_FOLDER_NAME}.nfo NFO_LINES) +# Replace ; with \;, and make a list out of this based on \n +string(REPLACE ";" "\\;" NFO_LINES "${NFO_LINES}") +string(REPLACE "\n" ";" NFO_LINES "${NFO_LINES}") + +foreach(NFO_LINE IN LISTS NFO_LINES) + # Recover the ; that was really in the text (and not a newline) + string(REPLACE "\\;" ";" NFO_LINE "${NFO_LINE}") + + if (NFO_LINE MATCHES "^#include") + string(REGEX REPLACE "^#include \"(.*)\"$" "\\1" INCLUDE_FILE ${NFO_LINE}) + file(READ ${GRF_SOURCE_FOLDER}/${INCLUDE_FILE} INCLUDE_LINES) + file(APPEND sprites/${GRF_SOURCE_FOLDER_NAME}.nfo "${INCLUDE_LINES}") + else (NFO_LINE MATCHES "^#include") + file(APPEND sprites/${GRF_SOURCE_FOLDER_NAME}.nfo "${NFO_LINE}\n") + endif (NFO_LINE MATCHES "^#include") +endforeach(NFO_LINE) + +execute_process(COMMAND ${NFORENUM_EXECUTABLE} -s sprites/${GRF_SOURCE_FOLDER_NAME}.nfo) +execute_process(COMMAND ${GRFCODEC_EXECUTABLE} -n -s -e -p1 ${GRF_SOURCE_FOLDER_NAME}.grf) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${GRF_SOURCE_FOLDER_NAME}.grf ${GRF_BINARY_FILE}) diff --git a/media/baseset/CMakeLists.txt b/media/baseset/CMakeLists.txt new file mode 100644 index 0000000000..309ac7a498 --- /dev/null +++ b/media/baseset/CMakeLists.txt @@ -0,0 +1,87 @@ +add_subdirectory(openttd) +add_subdirectory(orig_extra) + +set(BASESET_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/orig_dos.obg + ${CMAKE_CURRENT_SOURCE_DIR}/orig_dos_de.obg + ${CMAKE_CURRENT_SOURCE_DIR}/orig_win.obg + ${CMAKE_CURRENT_SOURCE_DIR}/no_music.obm + ${CMAKE_CURRENT_SOURCE_DIR}/orig_dos.obm + ${CMAKE_CURRENT_SOURCE_DIR}/orig_tto.obm + ${CMAKE_CURRENT_SOURCE_DIR}/orig_win.obm + ${CMAKE_CURRENT_SOURCE_DIR}/no_sound.obs + ${CMAKE_CURRENT_SOURCE_DIR}/orig_dos.obs + ${CMAKE_CURRENT_SOURCE_DIR}/orig_win.obs +) +set(BASESET_OTHER_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/openttd.grf + ${CMAKE_CURRENT_SOURCE_DIR}/opntitle.dat + ${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf +) + +# Done by the subdirectories, if nforenum / grfcodec is installed +if (NFORENUM_FOUND AND GRFCODEC_FOUND) + set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/openttd.grf PROPERTIES GENERATED TRUE) + set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf PROPERTIES GENERATED TRUE) + + list(APPEND BASESET_BINARY_FILES openttd.grf) + list(APPEND BASESET_BINARY_FILES orig_extra.grf) +endif (NFORENUM_FOUND AND GRFCODEC_FOUND) + +set(BASESET_EXTRAGRF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf) + +# Walk over all the baseset files, and generate a command to configure them +foreach(BASESET_SOURCE_FILE IN LISTS BASESET_SOURCE_FILES) + get_filename_component(BASESET_SOURCE_FILE_NAME "${BASESET_SOURCE_FILE}" NAME) + set(BASESET_BINARY_FILE "${CMAKE_BINARY_DIR}/baseset/${BASESET_SOURCE_FILE_NAME}") + + get_target_property(LANG_SOURCE_FILES language_files LANG_SOURCE_FILES) + + add_custom_command_timestamp(OUTPUT ${BASESET_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} + -DBASESET_SOURCE_FILE=${BASESET_SOURCE_FILE} + -DBASESET_BINARY_FILE=${BASESET_BINARY_FILE} + -DBASESET_EXTRAGRF_FILE=${BASESET_EXTRAGRF_FILE} + -P ${CMAKE_SOURCE_DIR}/cmake/scripts/Baseset.cmake + -- + ${LANG_SOURCE_FILES} + MAIN_DEPENDENCY ${BASESET_SOURCE_FILE} + DEPENDS ${LANG_SOURCE_FILES} + ${BASESET_EXTRAGRF_FILE} + ${CMAKE_SOURCE_DIR}/cmake/scripts/Baseset.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating ${BASESET_SOURCE_FILE_NAME} baseset metadata file" + ) + + list(APPEND BASESET_BINARY_FILES ${BASESET_BINARY_FILE}) +endforeach(BASESET_SOURCE_FILE) + +# Walk over all the other baseset files, and generate a command to copy them +foreach(BASESET_OTHER_SOURCE_FILE IN LISTS BASESET_OTHER_SOURCE_FILES) + get_filename_component(BASESET_OTHER_SOURCE_FILE_NAME "${BASESET_OTHER_SOURCE_FILE}" NAME) + set(BASESET_OTHER_BINARY_FILE "${CMAKE_BINARY_DIR}/baseset/${BASESET_OTHER_SOURCE_FILE_NAME}") + + add_custom_command(OUTPUT ${BASESET_OTHER_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${BASESET_OTHER_SOURCE_FILE} + ${BASESET_OTHER_BINARY_FILE} + MAIN_DEPENDENCY ${BASESET_OTHER_SOURCE_FILE} + COMMENT "Copying ${BASESET_OTHER_SOURCE_FILE_NAME} baseset file" + ) + + list(APPEND BASESET_BINARY_FILES ${BASESET_OTHER_BINARY_FILE}) +endforeach(BASESET_OTHER_SOURCE_FILE) + +# Create a new target which generates all baseset metadata files +add_custom_target_timestamp(baseset_files + DEPENDS + ${BASESET_BINARY_FILES} +) + +add_library(basesets + INTERFACE +) +add_dependencies(basesets + baseset_files +) +add_library(openttd::basesets ALIAS basesets) diff --git a/media/baseset/no_music.obm b/media/baseset/no_music.obm index e395ba0b0e..3b8b9657ae 100644 --- a/media/baseset/no_music.obm +++ b/media/baseset/no_music.obm @@ -5,7 +5,7 @@ name = NoMusic shortname = NULL version = 0 fallback = true -!! description STR_BASEMUSIC_NONE_DESCRIPTION +@description_STR_BASEMUSIC_NONE_DESCRIPTION@ [files] theme = diff --git a/media/baseset/no_sound.obs b/media/baseset/no_sound.obs index fd2430de54..3b546d5bb4 100644 --- a/media/baseset/no_sound.obs +++ b/media/baseset/no_sound.obs @@ -5,7 +5,7 @@ name = NoSound shortname = NULL version = 2 fallback = true -!! description STR_BASESOUNDS_NONE_DESCRIPTION +@description_STR_BASESOUNDS_NONE_DESCRIPTION@ [files] samples = diff --git a/bin/baseset/openttd.grf b/media/baseset/openttd.grf similarity index 100% rename from bin/baseset/openttd.grf rename to media/baseset/openttd.grf diff --git a/media/extra_grf/2ccmap.nfo b/media/baseset/openttd/2ccmap.nfo similarity index 100% rename from media/extra_grf/2ccmap.nfo rename to media/baseset/openttd/2ccmap.nfo diff --git a/media/baseset/openttd/CMakeLists.txt b/media/baseset/openttd/CMakeLists.txt new file mode 100644 index 0000000000..42d62dd7cc --- /dev/null +++ b/media/baseset/openttd/CMakeLists.txt @@ -0,0 +1,9 @@ +# In case both NFORenum and GRFCodec are found, generate the GRF. +# Otherwise, just use them from the cache (read: git). +# This is mainly because not many people have both of these tools installed, +# so it is cheaper to cache them in git, and only regenerate when you are +# working on it / have the tools installed. +if (NFORENUM_FOUND AND GRFCODEC_FOUND) + include(CreateGrfCommand REQUIRED) + create_grf_command() +endif (NFORENUM_FOUND AND GRFCODEC_FOUND) diff --git a/media/extra_grf/airport_preview.nfo b/media/baseset/openttd/airport_preview.nfo similarity index 100% rename from media/extra_grf/airport_preview.nfo rename to media/baseset/openttd/airport_preview.nfo diff --git a/media/extra_grf/airport_preview.png b/media/baseset/openttd/airport_preview.png similarity index 100% rename from media/extra_grf/airport_preview.png rename to media/baseset/openttd/airport_preview.png diff --git a/media/extra_grf/airports.nfo b/media/baseset/openttd/airports.nfo similarity index 100% rename from media/extra_grf/airports.nfo rename to media/baseset/openttd/airports.nfo diff --git a/media/extra_grf/airports.png b/media/baseset/openttd/airports.png similarity index 100% rename from media/extra_grf/airports.png rename to media/baseset/openttd/airports.png diff --git a/media/extra_grf/aqueduct.nfo b/media/baseset/openttd/aqueduct.nfo similarity index 100% rename from media/extra_grf/aqueduct.nfo rename to media/baseset/openttd/aqueduct.nfo diff --git a/media/extra_grf/aqueduct.png b/media/baseset/openttd/aqueduct.png similarity index 100% rename from media/extra_grf/aqueduct.png rename to media/baseset/openttd/aqueduct.png diff --git a/media/extra_grf/autorail.nfo b/media/baseset/openttd/autorail.nfo similarity index 100% rename from media/extra_grf/autorail.nfo rename to media/baseset/openttd/autorail.nfo diff --git a/media/extra_grf/autorail.png b/media/baseset/openttd/autorail.png similarity index 100% rename from media/extra_grf/autorail.png rename to media/baseset/openttd/autorail.png diff --git a/media/extra_grf/canal_locks.png b/media/baseset/openttd/canal_locks.png similarity index 100% rename from media/extra_grf/canal_locks.png rename to media/baseset/openttd/canal_locks.png diff --git a/media/extra_grf/canals.nfo b/media/baseset/openttd/canals.nfo similarity index 100% rename from media/extra_grf/canals.nfo rename to media/baseset/openttd/canals.nfo diff --git a/media/extra_grf/canals.png b/media/baseset/openttd/canals.png similarity index 100% rename from media/extra_grf/canals.png rename to media/baseset/openttd/canals.png diff --git a/media/extra_grf/chars.nfo b/media/baseset/openttd/chars.nfo similarity index 100% rename from media/extra_grf/chars.nfo rename to media/baseset/openttd/chars.nfo diff --git a/media/extra_grf/chars.png b/media/baseset/openttd/chars.png similarity index 100% rename from media/extra_grf/chars.png rename to media/baseset/openttd/chars.png diff --git a/media/extra_grf/elrails.nfo b/media/baseset/openttd/elrails.nfo similarity index 100% rename from media/extra_grf/elrails.nfo rename to media/baseset/openttd/elrails.nfo diff --git a/media/extra_grf/elrails.png b/media/baseset/openttd/elrails.png similarity index 100% rename from media/extra_grf/elrails.png rename to media/baseset/openttd/elrails.png diff --git a/media/extra_grf/flags.nfo b/media/baseset/openttd/flags.nfo similarity index 100% rename from media/extra_grf/flags.nfo rename to media/baseset/openttd/flags.nfo diff --git a/media/extra_grf/flags.png b/media/baseset/openttd/flags.png similarity index 100% rename from media/extra_grf/flags.png rename to media/baseset/openttd/flags.png diff --git a/media/extra_grf/foundations.nfo b/media/baseset/openttd/foundations.nfo similarity index 100% rename from media/extra_grf/foundations.nfo rename to media/baseset/openttd/foundations.nfo diff --git a/media/extra_grf/foundations.png b/media/baseset/openttd/foundations.png similarity index 100% rename from media/extra_grf/foundations.png rename to media/baseset/openttd/foundations.png diff --git a/media/extra_grf/mono.nfo b/media/baseset/openttd/mono.nfo similarity index 100% rename from media/extra_grf/mono.nfo rename to media/baseset/openttd/mono.nfo diff --git a/media/extra_grf/mono.png b/media/baseset/openttd/mono.png similarity index 100% rename from media/extra_grf/mono.png rename to media/baseset/openttd/mono.png diff --git a/media/extra_grf/oneway.nfo b/media/baseset/openttd/oneway.nfo similarity index 100% rename from media/extra_grf/oneway.nfo rename to media/baseset/openttd/oneway.nfo diff --git a/media/extra_grf/oneway.png b/media/baseset/openttd/oneway.png similarity index 100% rename from media/extra_grf/oneway.png rename to media/baseset/openttd/oneway.png diff --git a/media/extra_grf/openttd.nfo b/media/baseset/openttd/openttd.nfo similarity index 100% rename from media/extra_grf/openttd.nfo rename to media/baseset/openttd/openttd.nfo diff --git a/media/extra_grf/openttdgui.nfo b/media/baseset/openttd/openttdgui.nfo similarity index 100% rename from media/extra_grf/openttdgui.nfo rename to media/baseset/openttd/openttdgui.nfo diff --git a/media/extra_grf/openttdgui.png b/media/baseset/openttd/openttdgui.png similarity index 100% rename from media/extra_grf/openttdgui.png rename to media/baseset/openttd/openttdgui.png diff --git a/media/extra_grf/openttdgui_build_tram.png b/media/baseset/openttd/openttdgui_build_tram.png similarity index 100% rename from media/extra_grf/openttdgui_build_tram.png rename to media/baseset/openttd/openttdgui_build_tram.png diff --git a/media/extra_grf/openttdgui_convert_road.png b/media/baseset/openttd/openttdgui_convert_road.png similarity index 100% rename from media/extra_grf/openttdgui_convert_road.png rename to media/baseset/openttd/openttdgui_convert_road.png diff --git a/media/extra_grf/openttdgui_convert_tram.png b/media/baseset/openttd/openttdgui_convert_tram.png similarity index 100% rename from media/extra_grf/openttdgui_convert_tram.png rename to media/baseset/openttd/openttdgui_convert_tram.png diff --git a/media/extra_grf/openttdgui_group_livery.png b/media/baseset/openttd/openttdgui_group_livery.png similarity index 100% rename from media/extra_grf/openttdgui_group_livery.png rename to media/baseset/openttd/openttdgui_group_livery.png diff --git a/media/extra_grf/palette.nfo b/media/baseset/openttd/palette.nfo similarity index 100% rename from media/extra_grf/palette.nfo rename to media/baseset/openttd/palette.nfo diff --git a/media/extra_grf/roadstops.nfo b/media/baseset/openttd/roadstops.nfo similarity index 100% rename from media/extra_grf/roadstops.nfo rename to media/baseset/openttd/roadstops.nfo diff --git a/media/extra_grf/roadstops.png b/media/baseset/openttd/roadstops.png similarity index 100% rename from media/extra_grf/roadstops.png rename to media/baseset/openttd/roadstops.png diff --git a/media/extra_grf/signals.nfo b/media/baseset/openttd/signals.nfo similarity index 100% rename from media/extra_grf/signals.nfo rename to media/baseset/openttd/signals.nfo diff --git a/media/extra_grf/signals.png b/media/baseset/openttd/signals.png similarity index 100% rename from media/extra_grf/signals.png rename to media/baseset/openttd/signals.png diff --git a/media/extra_grf/sloped_tracks.nfo b/media/baseset/openttd/sloped_tracks.nfo similarity index 100% rename from media/extra_grf/sloped_tracks.nfo rename to media/baseset/openttd/sloped_tracks.nfo diff --git a/media/extra_grf/sloped_tracks.png b/media/baseset/openttd/sloped_tracks.png similarity index 100% rename from media/extra_grf/sloped_tracks.png rename to media/baseset/openttd/sloped_tracks.png diff --git a/media/extra_grf/tramtracks.nfo b/media/baseset/openttd/tramtracks.nfo similarity index 100% rename from media/extra_grf/tramtracks.nfo rename to media/baseset/openttd/tramtracks.nfo diff --git a/media/extra_grf/tramtracks.png b/media/baseset/openttd/tramtracks.png similarity index 100% rename from media/extra_grf/tramtracks.png rename to media/baseset/openttd/tramtracks.png diff --git a/media/extra_grf/tramtracks_bare_depot.png b/media/baseset/openttd/tramtracks_bare_depot.png similarity index 100% rename from media/extra_grf/tramtracks_bare_depot.png rename to media/baseset/openttd/tramtracks_bare_depot.png diff --git a/media/extra_grf/tunnel_portals.nfo b/media/baseset/openttd/tunnel_portals.nfo similarity index 100% rename from media/extra_grf/tunnel_portals.nfo rename to media/baseset/openttd/tunnel_portals.nfo diff --git a/media/extra_grf/tunnel_portals.png b/media/baseset/openttd/tunnel_portals.png similarity index 100% rename from media/extra_grf/tunnel_portals.png rename to media/baseset/openttd/tunnel_portals.png diff --git a/bin/baseset/opntitle.dat b/media/baseset/opntitle.dat similarity index 100% rename from bin/baseset/opntitle.dat rename to media/baseset/opntitle.dat diff --git a/media/baseset/orig_dos.obg b/media/baseset/orig_dos.obg index d56a63712f..ebb27ee7b5 100644 --- a/media/baseset/orig_dos.obg +++ b/media/baseset/orig_dos.obg @@ -6,7 +6,7 @@ name = original_dos shortname = TTDD version = 1 palette = DOS -!! description STR_BASEGRAPHICS_DOS_DESCRIPTION +@description_STR_BASEGRAPHICS_DOS_DESCRIPTION@ [files] base = TRG1.GRF @@ -22,7 +22,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 TRGC.GRF = ed446637e034104c5559b32c18afe78d TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 -ORIG_EXTRA.GRF = +ORIG_EXTRA.GRF = ${ORIG_EXTRA_GRF_MD5} [origin] default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/media/baseset/orig_dos.obm b/media/baseset/orig_dos.obm index 0b51c2db84..49c0f67703 100644 --- a/media/baseset/orig_dos.obm +++ b/media/baseset/orig_dos.obm @@ -5,7 +5,7 @@ name = original_dos shortname = TTDD version = 1 -!! description STR_BASEMUSIC_DOS_DESCRIPTION +@description_STR_BASEMUSIC_DOS_DESCRIPTION@ [files] theme = gm.cat diff --git a/media/baseset/orig_dos.obs b/media/baseset/orig_dos.obs index 60afc854f0..c500fe0e4d 100644 --- a/media/baseset/orig_dos.obs +++ b/media/baseset/orig_dos.obs @@ -5,7 +5,7 @@ name = original_dos shortname = TTDO version = 0 -!! description STR_BASESOUNDS_DOS_DESCRIPTION +@description_STR_BASESOUNDS_DOS_DESCRIPTION@ [files] samples = SAMPLE.CAT diff --git a/media/baseset/orig_dos_de.obg b/media/baseset/orig_dos_de.obg index 388d685025..b8251ab7b2 100644 --- a/media/baseset/orig_dos_de.obg +++ b/media/baseset/orig_dos_de.obg @@ -6,7 +6,7 @@ name = original_dos_de shortname = TTDD version = 0 palette = DOS -!! description STR_BASEGRAPHICS_DOS_DE_DESCRIPTION +@description_STR_BASEGRAPHICS_DOS_DE_DESCRIPTION@ [files] base = TRG1.GRF @@ -22,7 +22,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8 TRGC.GRF = ed446637e034104c5559b32c18afe78d TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 TRGT.GRF = fcde1d7e8a74197d72a62695884b909e -ORIG_EXTRA.GRF = +ORIG_EXTRA.GRF = ${ORIG_EXTRA_GRF_MD5} [origin] default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/bin/baseset/orig_extra.grf b/media/baseset/orig_extra.grf similarity index 100% rename from bin/baseset/orig_extra.grf rename to media/baseset/orig_extra.grf diff --git a/media/baseset/orig_extra/CMakeLists.txt b/media/baseset/orig_extra/CMakeLists.txt new file mode 100644 index 0000000000..f865a8dd0d --- /dev/null +++ b/media/baseset/orig_extra/CMakeLists.txt @@ -0,0 +1,14 @@ +# In case both NFORenum and GRFCodec are found, generate the GRF. +# Otherwise, just use them from the cache (read: git). +# This is mainly because not many people have both of these tools installed, +# so it is cheaper to cache them in git, and only regenerate when you are +# working on it / have the tools installed. +if (NFORENUM_FOUND AND GRFCODEC_FOUND) + include(CreateGrfCommand REQUIRED) + create_grf_command( + # We share some files with 'openttd' grf + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/airports.png + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/canals.png + ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/chars.png + ) +endif (NFORENUM_FOUND AND GRFCODEC_FOUND) diff --git a/media/extra_grf/airports_orig_extra.nfo b/media/baseset/orig_extra/airports_orig_extra.nfo similarity index 100% rename from media/extra_grf/airports_orig_extra.nfo rename to media/baseset/orig_extra/airports_orig_extra.nfo diff --git a/media/extra_grf/canals_extra.nfo b/media/baseset/orig_extra/canals_extra.nfo similarity index 100% rename from media/extra_grf/canals_extra.nfo rename to media/baseset/orig_extra/canals_extra.nfo diff --git a/media/extra_grf/chars_orig_extra.nfo b/media/baseset/orig_extra/chars_orig_extra.nfo similarity index 100% rename from media/extra_grf/chars_orig_extra.nfo rename to media/baseset/orig_extra/chars_orig_extra.nfo diff --git a/media/extra_grf/fix_graphics.nfo b/media/baseset/orig_extra/fix_graphics.nfo similarity index 100% rename from media/extra_grf/fix_graphics.nfo rename to media/baseset/orig_extra/fix_graphics.nfo diff --git a/media/extra_grf/fix_graphics.png b/media/baseset/orig_extra/fix_graphics.png similarity index 100% rename from media/extra_grf/fix_graphics.png rename to media/baseset/orig_extra/fix_graphics.png diff --git a/media/extra_grf/orig_extra.nfo b/media/baseset/orig_extra/orig_extra.nfo similarity index 100% rename from media/extra_grf/orig_extra.nfo rename to media/baseset/orig_extra/orig_extra.nfo diff --git a/media/extra_grf/rivers/arctic.nfo b/media/baseset/orig_extra/rivers/arctic.nfo similarity index 100% rename from media/extra_grf/rivers/arctic.nfo rename to media/baseset/orig_extra/rivers/arctic.nfo diff --git a/media/extra_grf/rivers/arctic_brown.png b/media/baseset/orig_extra/rivers/arctic_brown.png similarity index 100% rename from media/extra_grf/rivers/arctic_brown.png rename to media/baseset/orig_extra/rivers/arctic_brown.png diff --git a/media/extra_grf/rivers/arctic_snowy.png b/media/baseset/orig_extra/rivers/arctic_snowy.png similarity index 100% rename from media/extra_grf/rivers/arctic_snowy.png rename to media/baseset/orig_extra/rivers/arctic_snowy.png diff --git a/media/extra_grf/rivers/rapids.nfo b/media/baseset/orig_extra/rivers/rapids.nfo similarity index 100% rename from media/extra_grf/rivers/rapids.nfo rename to media/baseset/orig_extra/rivers/rapids.nfo diff --git a/media/extra_grf/rivers/rapids.png b/media/baseset/orig_extra/rivers/rapids.png similarity index 100% rename from media/extra_grf/rivers/rapids.png rename to media/baseset/orig_extra/rivers/rapids.png diff --git a/media/extra_grf/rivers/temperate.nfo b/media/baseset/orig_extra/rivers/temperate.nfo similarity index 100% rename from media/extra_grf/rivers/temperate.nfo rename to media/baseset/orig_extra/rivers/temperate.nfo diff --git a/media/extra_grf/rivers/temperate.png b/media/baseset/orig_extra/rivers/temperate.png similarity index 100% rename from media/extra_grf/rivers/temperate.png rename to media/baseset/orig_extra/rivers/temperate.png diff --git a/media/extra_grf/rivers/toyland.nfo b/media/baseset/orig_extra/rivers/toyland.nfo similarity index 100% rename from media/extra_grf/rivers/toyland.nfo rename to media/baseset/orig_extra/rivers/toyland.nfo diff --git a/media/extra_grf/rivers/toyland.png b/media/baseset/orig_extra/rivers/toyland.png similarity index 100% rename from media/extra_grf/rivers/toyland.png rename to media/baseset/orig_extra/rivers/toyland.png diff --git a/media/extra_grf/rivers/tropic.nfo b/media/baseset/orig_extra/rivers/tropic.nfo similarity index 100% rename from media/extra_grf/rivers/tropic.nfo rename to media/baseset/orig_extra/rivers/tropic.nfo diff --git a/media/extra_grf/rivers/tropic_desert.png b/media/baseset/orig_extra/rivers/tropic_desert.png similarity index 100% rename from media/extra_grf/rivers/tropic_desert.png rename to media/baseset/orig_extra/rivers/tropic_desert.png diff --git a/media/extra_grf/rivers/tropic_forest.png b/media/baseset/orig_extra/rivers/tropic_forest.png similarity index 100% rename from media/extra_grf/rivers/tropic_forest.png rename to media/baseset/orig_extra/rivers/tropic_forest.png diff --git a/media/extra_grf/shore.nfo b/media/baseset/orig_extra/shore.nfo similarity index 100% rename from media/extra_grf/shore.nfo rename to media/baseset/orig_extra/shore.nfo diff --git a/media/extra_grf/shore.png b/media/baseset/orig_extra/shore.png similarity index 100% rename from media/extra_grf/shore.png rename to media/baseset/orig_extra/shore.png diff --git a/media/baseset/orig_tto.obm b/media/baseset/orig_tto.obm index c572bcf34b..ced9cf5807 100644 --- a/media/baseset/orig_tto.obm +++ b/media/baseset/orig_tto.obm @@ -5,7 +5,7 @@ name = original_tto shortname = TTOD version = 1 -!! description STR_BASEMUSIC_TTO_DESCRIPTION +@description_STR_BASEMUSIC_TTO_DESCRIPTION@ [files] theme = gm-tto.cat diff --git a/media/baseset/orig_win.obg b/media/baseset/orig_win.obg index f01624a25d..b1cc8437e2 100644 --- a/media/baseset/orig_win.obg +++ b/media/baseset/orig_win.obg @@ -6,7 +6,7 @@ name = original_windows shortname = TTDW version = 0 palette = Windows -!! description STR_BASEGRAPHICS_WIN_DESCRIPTION +@description_STR_BASEGRAPHICS_WIN_DESCRIPTION@ [files] base = TRG1R.GRF @@ -22,7 +22,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32 TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 -ORIG_EXTRA.GRF = +ORIG_EXTRA.GRF = ${ORIG_EXTRA_GRF_MD5} [origin] default = You can find it on your Transport Tycoon Deluxe CD-ROM. diff --git a/media/baseset/orig_win.obm b/media/baseset/orig_win.obm index 11e363fabd..de269d65c8 100644 --- a/media/baseset/orig_win.obm +++ b/media/baseset/orig_win.obm @@ -5,7 +5,7 @@ name = original_windows shortname = TTDW version = 1 -!! description STR_BASEMUSIC_WIN_DESCRIPTION +@description_STR_BASEMUSIC_WIN_DESCRIPTION@ [files] theme = GM_TT00.GM diff --git a/media/baseset/orig_win.obs b/media/baseset/orig_win.obs index 7b02372207..66dd619a8a 100644 --- a/media/baseset/orig_win.obs +++ b/media/baseset/orig_win.obs @@ -5,7 +5,7 @@ name = original_windows shortname = TTDO version = 0 -!! description STR_BASESOUNDS_WIN_DESCRIPTION +@description_STR_BASESOUNDS_WIN_DESCRIPTION@ [files] samples = SAMPLE.CAT diff --git a/media/baseset/translations.awk b/media/baseset/translations.awk deleted file mode 100644 index af5f2b4a8d..0000000000 --- a/media/baseset/translations.awk +++ /dev/null @@ -1,67 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -# -# Awk script to extract translations for baseset descriptions -# from lang files for insertion into .obg/obs/obm files. -# If there is no translation, there is no output. -# -# The input file is scanned for the pattern -# !! -# -# The lang files (passed as variable 'langfiles') are scanned for and -# the translations are added to the output file: -# . = -# - -# Simple insertion sort since not all AWKs have a sort implementation -function isort(A) { - n = 0 - for (val in A) { - n++; - } - - for (i = 2; i <= n; i++) { - j = i; - hold = A[j] - while (A[j - 1] > hold) { - j--; - A[j + 1] = A[j] - } - A[j] = hold - } - - return n -} - -/^!!/ { - ini_key = $2; - str_id = $3; - - file = langfiles - while ((getline < file) > 0) { - if (match($0, "##isocode") > 0) { - lang = $2; - } else if (match($0, "^" str_id " *:") > 0) { - sub("^[^:]*:", "", $0) - i++; - if (lang == "en_GB") { - texts[i] = ini_key " = "$0; - } else { - texts[i] = ini_key "." lang " = "$0; - } - } - } - close(file); - - count = isort(texts); - for (i = 1; i <= count; i++) { - print texts[i] - } - - next -} - -{ print } diff --git a/media/baseset/translations.vbs b/media/baseset/translations.vbs deleted file mode 100644 index c167886930..0000000000 --- a/media/baseset/translations.vbs +++ /dev/null @@ -1,145 +0,0 @@ -Option Explicit - -' This file is part of OpenTTD. -' OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -' OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -' See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -Dim FSO -Set FSO = CreateObject("Scripting.FileSystemObject") - -Dim inputfile, outputfile, langpath, extra_grf -inputfile = WScript.Arguments(0) -outputfile = WScript.Arguments(1) -langpath = WScript.Arguments(2) - -If WScript.Arguments.Length > 3 Then - extra_grf = WScript.Arguments(3) -End If - -Function GetExtraGrfHash - Dim WSO, exe, line - - Set WSO = WScript.CreateObject("WScript.Shell") - Set exe = WSO.Exec("certutil -hashfile " & extra_grf & " MD5") - - Do Until exe.StdOut.AtEndOfStream - line = exe.StdOut.ReadLine - If Len(line) = 32 Then GetExtraGrfHash = line - Loop - - Set WSO = Nothing -End Function - -' Simple insertion sort, copied from translations.awk -Sub ISort(a) - Dim i, j, n, hold - n = UBound(a) - - For i = 1 To n - j = i - hold = a(j) - Do While a(j - 1) > hold - j = j - 1 - a(j + 1) = a(j) - - If j = 0 Then Exit Do - Loop - a(j) = hold - Next -End Sub - -Sub Lookup(ini_key, str_id, outfile) - Dim folder, file, line, p, lang, i - - ' Ensure only complete string matches - str_id = str_id & " " - - Set folder = FSO.GetFolder(langpath) - - Dim output() - ReDim output(folder.Files.Count) - - For Each file In folder.Files - If UCase(FSO.GetExtensionName(file.Name)) = "TXT" Then - Dim f - Set f = CreateObject("ADODB.Stream") - f.Charset = "utf-8" - f.LineSeparator = 10 ' Assume lines end with \n even for \r\n files - f.Open - f.LoadFromFile(file.Path) - - Do Until f.EOS - line = Replace(f.ReadText(-2), Chr(13), "") ' Read a line and remove any \r - - If InStr(1, line, "##isocode ") = 1 Then - p = Split(line) - lang = p(1) - ElseIf InStr(1, line, str_id) = 1 Then - p = Split(line, ":", 2) - If lang = "en_GB" Then - output(i) = ini_key & " = " & p(1) - Else - output(i) = ini_key & "." & lang & " = " & p(1) - End If - i = i + 1 - End If - Loop - - f.Close - End If - Next - - ReDim Preserve output(i - 1) - ISort output - - For Each line In output - outfile.WriteText line, 1 - Next - -End Sub - -Dim line, p - -Dim infile -Set infile = FSO.OpenTextFile(inputfile) - -Dim outfile -Set outfile = CreateObject("ADODB.Stream") -outfile.Charset = "utf-8" -outfile.Open - -Do Until infile.atEndOfStream - - line = infile.ReadLine() - - If InStr(1, line, "ORIG_EXTRA.GRF ") = 1 Then - p = Split(line, "=") - If Trim(p(1)) = "" Then - outfile.WriteText "ORIG_EXTRA.GRF = " & GetExtraGrfHash(), 1 - Else - outfile.WriteText line, 1 - End If - ElseIf InStr(1, line, "!! ") = 1 Then - p = Split(line) - Lookup p(1), p(2), outfile - Else - outfile.WriteText line, 1 - End If - -Loop - -' UTF-8 Text ADO Stream includes BOM, so we need to remove it -Dim outfile_noBOM -Set outfile_noBOM = CreateObject("ADODB.Stream") -outfile_noBOM.Type = 1 -outfile_noBOM.Open - -' Copy Text stream to Binary stream, skiping the BOM -outfile.Position = 3 -outfile.CopyTo outfile_noBOM -outfile.Close - -' Write the Binary stream -outfile_noBOM.SaveToFile outputfile, 2 -outfile_noBOM.Close diff --git a/media/extra_grf/assemble_nfo.awk b/media/extra_grf/assemble_nfo.awk deleted file mode 100644 index f39e6b6b43..0000000000 --- a/media/extra_grf/assemble_nfo.awk +++ /dev/null @@ -1,30 +0,0 @@ -# This file is part of OpenTTD. -# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. -# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - -BEGIN { - # Very basic variant function; barely any error checking. - # Just use the first argument as the file to start from when assembling everything - path = ARGV[1]; - gsub("[^/\\\\]*$", "", path); - assemble(ARGV[1]); -} - -# Recursive function for assembling by means of resolving the #includes. -function assemble(filename) { - while ((getline < filename) > 0) { - if (NF == 2 && $1 == "#include" ) { - # Remove the quotes. - gsub("[\"'<>]", "", $2); - assemble(path $2); - } else { - print $0; - } - } - - if (close(filename) < 0) { - print "Could not open " filename > "/dev/stderr"; - exit -1; - } -} From 56d54cf60eb5814f77dfcce91cf12879f01e1d1b Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 11:57:55 +0200 Subject: [PATCH 04/41] Add: introduce CMake for project management CMake works on all our supported platforms, like MSVC, Mingw, GCC, Clang, and many more. It allows for a single way of doing things, so no longer we need shell scripts and vbs scripts to work on all our supported platforms. Additionally, CMake allows to generate project files for like MSVC, KDevelop, etc. This heavily reduces the lines of code we need to support multiple platforms from a project perspective. Addtiionally, this heavily improves our detection of libraries, etc. --- .gitignore | 7 - CMakeLists.txt | 226 ++++ cmake/AddCustomXXXTimestamp.cmake | 145 +++ cmake/CompileFlags.cmake | 120 ++ cmake/CreateGrfCommand.cmake | 50 + cmake/CreateRegression.cmake | 86 ++ cmake/Endian.cmake | 14 + cmake/FindAllegro.cmake | 65 + cmake/FindEditbin.cmake | 13 + cmake/FindFluidsynth.cmake | 65 + cmake/FindFontconfig.cmake | 101 ++ cmake/FindGrfcodec.cmake | 13 + cmake/FindICU.cmake | 64 + cmake/FindIconv.cmake | 133 ++ cmake/FindLZO.cmake | 89 ++ cmake/FindSSE.cmake | 17 + cmake/FindXDG_basedir.cmake | 65 + cmake/FindXaudio2.cmake | 18 + cmake/LinkPackage.cmake | 18 + cmake/Options.cmake | 84 ++ cmake/SourceList.cmake | 63 + cmake/Static.cmake | 14 + cmake/scripts/FindVersion.cmake | 134 ++ media/baseset/CMakeLists.txt | 4 +- media/baseset/openttd/CMakeLists.txt | 6 +- media/baseset/orig_extra/CMakeLists.txt | 6 +- os/windows/openttd.manifest | 29 + src/3rdparty/CMakeLists.txt | 3 + src/3rdparty/md5/CMakeLists.txt | 4 + src/3rdparty/os2/CMakeLists.txt | 7 + src/3rdparty/squirrel/CMakeLists.txt | 3 + src/3rdparty/squirrel/include/CMakeLists.txt | 6 + src/3rdparty/squirrel/sqstdlib/CMakeLists.txt | 4 + src/3rdparty/squirrel/squirrel/CMakeLists.txt | 30 + src/CMakeLists.txt | 479 ++++++++ src/ai/CMakeLists.txt | 14 + src/blitter/CMakeLists.txt | 55 + src/core/CMakeLists.txt | 30 + src/core/endian_type.hpp | 28 +- src/depend/depend.cpp | 1084 ----------------- src/game/CMakeLists.txt | 14 + src/lang/CMakeLists.txt | 122 ++ src/linkgraph/CMakeLists.txt | 22 + src/misc/CMakeLists.txt | 14 + src/music/CMakeLists.txt | 54 + src/network/CMakeLists.txt | 28 + src/network/core/CMakeLists.txt | 27 + src/os/CMakeLists.txt | 4 + src/os/macosx/CMakeLists.txt | 11 + src/os/os2/CMakeLists.txt | 4 + src/os/unix/CMakeLists.txt | 9 + src/os/windows/CMakeLists.txt | 8 + src/os/windows/ottdres.rc.in | 14 +- src/pathfinder/CMakeLists.txt | 9 + src/pathfinder/npf/CMakeLists.txt | 8 + src/pathfinder/yapf/CMakeLists.txt | 20 + src/rev.cpp.in | 12 +- src/saveload/CMakeLists.txt | 43 + src/script/CMakeLists.txt | 23 + src/script/api/CMakeLists.txt | 140 +++ src/settingsgen/CMakeLists.txt | 13 + src/sound/CMakeLists.txt | 37 + src/spriteloader/CMakeLists.txt | 5 + src/stdafx.h | 11 +- src/strgen/CMakeLists.txt | 25 + src/table/CMakeLists.txt | 83 ++ src/video/CMakeLists.txt | 35 + src/video/cocoa/CMakeLists.txt | 8 + src/widgets/CMakeLists.txt | 61 + 69 files changed, 3116 insertions(+), 1144 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/AddCustomXXXTimestamp.cmake create mode 100644 cmake/CompileFlags.cmake create mode 100644 cmake/CreateGrfCommand.cmake create mode 100644 cmake/CreateRegression.cmake create mode 100644 cmake/Endian.cmake create mode 100644 cmake/FindAllegro.cmake create mode 100644 cmake/FindEditbin.cmake create mode 100644 cmake/FindFluidsynth.cmake create mode 100644 cmake/FindFontconfig.cmake create mode 100644 cmake/FindGrfcodec.cmake create mode 100644 cmake/FindICU.cmake create mode 100644 cmake/FindIconv.cmake create mode 100644 cmake/FindLZO.cmake create mode 100644 cmake/FindSSE.cmake create mode 100644 cmake/FindXDG_basedir.cmake create mode 100644 cmake/FindXaudio2.cmake create mode 100644 cmake/LinkPackage.cmake create mode 100644 cmake/Options.cmake create mode 100644 cmake/SourceList.cmake create mode 100644 cmake/Static.cmake create mode 100644 cmake/scripts/FindVersion.cmake create mode 100644 os/windows/openttd.manifest create mode 100644 src/3rdparty/CMakeLists.txt create mode 100644 src/3rdparty/md5/CMakeLists.txt create mode 100644 src/3rdparty/os2/CMakeLists.txt create mode 100644 src/3rdparty/squirrel/CMakeLists.txt create mode 100644 src/3rdparty/squirrel/include/CMakeLists.txt create mode 100644 src/3rdparty/squirrel/sqstdlib/CMakeLists.txt create mode 100644 src/3rdparty/squirrel/squirrel/CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/ai/CMakeLists.txt create mode 100644 src/blitter/CMakeLists.txt create mode 100644 src/core/CMakeLists.txt delete mode 100644 src/depend/depend.cpp create mode 100644 src/game/CMakeLists.txt create mode 100644 src/lang/CMakeLists.txt create mode 100644 src/linkgraph/CMakeLists.txt create mode 100644 src/misc/CMakeLists.txt create mode 100644 src/music/CMakeLists.txt create mode 100644 src/network/CMakeLists.txt create mode 100644 src/network/core/CMakeLists.txt create mode 100644 src/os/CMakeLists.txt create mode 100644 src/os/macosx/CMakeLists.txt create mode 100644 src/os/os2/CMakeLists.txt create mode 100644 src/os/unix/CMakeLists.txt create mode 100644 src/os/windows/CMakeLists.txt create mode 100644 src/pathfinder/CMakeLists.txt create mode 100644 src/pathfinder/npf/CMakeLists.txt create mode 100644 src/pathfinder/yapf/CMakeLists.txt create mode 100644 src/saveload/CMakeLists.txt create mode 100644 src/script/CMakeLists.txt create mode 100644 src/script/api/CMakeLists.txt create mode 100644 src/settingsgen/CMakeLists.txt create mode 100644 src/sound/CMakeLists.txt create mode 100644 src/spriteloader/CMakeLists.txt create mode 100644 src/strgen/CMakeLists.txt create mode 100644 src/table/CMakeLists.txt create mode 100644 src/video/CMakeLists.txt create mode 100644 src/video/cocoa/CMakeLists.txt create mode 100644 src/widgets/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 3e74133dfe..156a9f7a66 100644 --- a/.gitignore +++ b/.gitignore @@ -21,18 +21,13 @@ bin/scripts/* !bin/scripts/*.example !bin/scripts/readme.txt -*.aps bundle/* bundles/* docs/aidocs/* docs/gamedocs/* docs/source/* -.kdev4 -.kdev4/* -*.kdev4 media/openttd.desktop media/openttd.desktop.install -objs/* projects/.vs projects/Debug projects/Release @@ -44,8 +39,6 @@ projects/*.vcproj.*.user projects/*.vcxproj.user projects/*.VC.db projects/*.VC.opendb -src/rev.cpp -src/os/windows/ottdres.rc /Makefile* !/Makefile.msvc diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..c1ffa9ecca --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,226 @@ +cmake_minimum_required(VERSION 3.5) + +project(OpenTTD) + +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "In-source builds not allowed. Please run \"cmake ..\" from the bin directory") +endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") + +include(Options) +set_options() +set_directory_options() + +include(Static) +set_static_if_needed() + +# Prefer -pthread over -lpthread, which is often the better option of the two. +set(CMAKE_THREAD_PREFER_PTHREAD YES) +# Make sure we have Threads available. +find_package(Threads REQUIRED) + +find_package(ZLIB) +find_package(LibLZMA) +find_package(LZO) +find_package(PNG) +if (NOT WIN32) + find_package(SDL2) + if (NOT SDL2_FOUND) + find_package(SDL) + endif( NOT SDL2_FOUND) + find_package(Allegro) + find_package(Fluidsynth) + find_package(Freetype) + find_package(Fontconfig) + find_package(ICU OPTIONAL_COMPONENTS i18n lx) + find_package(XDG_basedir) +endif (NOT WIN32) +if (APPLE) + find_package(Iconv) + + find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox) + find_library(AUDIOUNIT_LIBRARY AudioUnit) + find_library(COCOA_LIBRARY Cocoa) +endif (APPLE) + +if (MSVC) + find_package(Editbin REQUIRED) +endif (MSVC) + +find_package(SSE) +find_package(Xaudio2) + +find_package(Grfcodec) + +# IPO is only properly supported from CMake 3.9. Despite the fact we are +# CMake 3.5, still enable IPO if we detect we are 3.9+. +if (POLICY CMP0069) + cmake_policy(SET CMP0069 NEW) + include(CheckIPOSupported) + check_ipo_supported(RESULT IPO_FOUND) +endif (POLICY CMP0069) + +show_options() + +if (UNIX AND NOT APPLE AND NOT OPTION_DEDICATED) + if (NOT SDL_FOUND AND NOT SDL2_FOUND) + message(FATAL_ERROR "SDL or SDL2 is required for this platform") + endif (NOT SDL_FOUND AND NOT SDL2_FOUND) +endif (UNIX AND NOT APPLE AND NOT OPTION_DEDICATED) +if (APPLE) + if (NOT AUDIOTOOLBOX_LIBRARY) + message(FATAL_ERROR "AudioToolbox is required for this platform") + endif (NOT AUDIOTOOLBOX_LIBRARY) + if (NOT AUDIOUNIT_LIBRARY) + message(FATAL_ERROR "AudioUnit is required for this platform") + endif (NOT AUDIOUNIT_LIBRARY) + if (NOT COCOA_LIBRARY) + message(FATAL_ERROR "Cocoa is required for this platform") + endif (NOT COCOA_LIBRARY) +endif (APPLE) + +if (MSVC) + # C++17 for MSVC + set(CMAKE_CXX_STANDARD 17) +else (MSVC) + # C++11 for all other targets + set(CMAKE_CXX_STANDARD 11) +endif (MSVC) + +set(CMAKE_CXX_STANDARD_REQUIRED YES) +set(CMAKE_CXX_EXTENSIONS NO) + +list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp") +if (WIN32) + list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc") +endif (WIN32) + +# Generate a target to determine version, which is execute every 'make' run +add_custom_target(find_version + ${CMAKE_COMMAND} + -DFIND_VERSION_BINARY_DIR=${CMAKE_BINARY_DIR}/generated + -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + BYPRODUCTS ${GENERATED_SOURCE_FILES} +) + +include(SourceList) +include(Endian) +add_endian_definition() + +# Needed by rev.cpp +include_directories(${CMAKE_SOURCE_DIR}/src) +# Needed by everything that uses Squirrel +include_directories(${CMAKE_SOURCE_DIR}/src/3rdparty/squirrel/include) + +include(CompileFlags) +compile_flags() + +add_executable(openttd WIN32 ${GENERATED_SOURCE_FILES}) +# All other files are added via target_sources() + +include(AddCustomXXXTimestamp) +add_subdirectory(${CMAKE_SOURCE_DIR}/src) +add_subdirectory(${CMAKE_SOURCE_DIR}/media/baseset) + +add_dependencies(openttd + find_version) + +target_link_libraries(openttd + openttd::languages + openttd::settings + openttd::basesets + Threads::Threads +) + +if (IPO_FOUND) + set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE True) + set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL True) + set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO True) +endif (IPO_FOUND) +set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin") +process_compile_flags() + +if (APPLE OR UNIX) + add_definitions(-DUNIX) +endif (APPLE OR UNIX) + +include(LinkPackage) +link_package(PNG TARGET PNG::PNG ENCOURAGED) +link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED) +link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED) +link_package(LZO ENCOURAGED) +link_package(XDG_basedir) + +if (NOT OPTION_DEDICATED) + link_package(Fluidsynth) + link_package(SDL) + link_package(SDL2) + link_package(Allegro) + link_package(FREETYPE TARGET Freetype::Freetype) + link_package(Fontconfig TARGET Fontconfig::Fontconfig) + link_package(ICU_lx) + link_package(ICU_i18n) +endif (NOT OPTION_DEDICATED) + +if (APPLE) + link_package(Iconv TARGET Iconv::Iconv) + + target_link_libraries(openttd + ${AUDIOTOOLBOX_LIBRARY} + ${AUDIOUNIT_LIBRARY} + ${COCOA_LIBRARY} + ) + + add_definitions( + -DWITH_COCOA + -DENABLE_COCOA_QUARTZ + ) +endif (APPLE) + +if (NOT PERSONAL_DIR STREQUAL "(not set)") + add_definitions( + -DWITH_PERSONAL_DIR + -DPERSONAL_DIR="${PERSONAL_DIR}" + ) +endif (NOT PERSONAL_DIR STREQUAL "(not set)") + +if (NOT SHARED_DIR STREQUAL "(not set)") + add_definitions( + -DWITH_SHARED_DIR + -DSHARED_DIR="${SHARED_DIR}" + ) +endif (NOT SHARED_DIR STREQUAL "(not set)") + +if (NOT GLOBAL_DIR STREQUAL "(not set)") + add_definitions( + -DGLOBAL_DATA_DIR="${GLOBAL_DIR}" + ) +endif (NOT GLOBAL_DIR STREQUAL "(not set)") + +link_package(SSE) + +add_definitions_based_on_options() + +if (WIN32) + add_definitions( + -DUNICODE + -D_UNICODE + -DWITH_UNISCRIBE + ) + + target_link_libraries(openttd + ws2_32 + winmm + imm32 + ) +endif (WIN32) + +if (CMAKE_SIZEOF_VOID_P EQUAL 8) + add_definitions(-D_SQ64) +endif (CMAKE_SIZEOF_VOID_P EQUAL 8) + +include(CreateRegression) +create_regression() diff --git a/cmake/AddCustomXXXTimestamp.cmake b/cmake/AddCustomXXXTimestamp.cmake new file mode 100644 index 0000000000..ca93988731 --- /dev/null +++ b/cmake/AddCustomXXXTimestamp.cmake @@ -0,0 +1,145 @@ +macro(_parse_arguments_with_multi_hack ORIGINAL_COMMAND_LINE) + # cmake_parse_arguments() put all the MULTIS in a single variable; you + # lose the ability to see for example multiple COMMANDs. To be able to + # passthrough multiple MULTIS, we add a marker after every MULTI. This + # allows us to reassemble the correct amount again before giving it to + # the wrapped command with _reassemble_command_line(). + + set(COMMAND_LINE "${ORIGINAL_COMMAND_LINE}") + + foreach(MULTI IN LISTS MULTIS) + string(REPLACE "${MULTI}" "${MULTI};:::" COMMAND_LINE "${COMMAND_LINE}") + endforeach(MULTI) + + cmake_parse_arguments(PARAM "${OPTIONS}" "${SINGLES}" "${MULTIS}" ${COMMAND_LINE}) +endmacro() + +macro(_reassemble_command_line) + # Reassemble the command line as we original got it. + set(NEW_COMMAND_LINE ${PARAM_UNPARSED_ARGUMENTS}) + + foreach(OPTION IN LISTS OPTIONS) + if (PARAM_${OPTION}) + list(APPEND NEW_COMMAND_LINE "${OPTION}") + endif (PARAM_${OPTION}) + endforeach(OPTION) + + foreach(SINGLE IN LISTS SINGLES) + if (PARAM_${SINGLE}) + list(APPEND NEW_COMMAND_LINE "${SINGLE}" "${PARAM_${SINGLE}}") + endif (PARAM_${SINGLE}) + endforeach(SINGLE) + + foreach(MULTI IN LISTS MULTIS) + if (PARAM_${MULTI}) + # Replace our special marker with the name of the MULTI again. This + # restores for example multiple COMMANDs again. + string(REPLACE ":::" "${MULTI}" PARAM_${MULTI} "${PARAM_${MULTI}}") + list(APPEND NEW_COMMAND_LINE "${PARAM_${MULTI}}") + endif (PARAM_${MULTI}) + endforeach(MULTI) +endmacro() + +# Generated files can be older than their dependencies, causing useless +# regenerations. This function replaces each file in OUTPUT with a .timestamp +# file, adds a command to touch it and move the original file in BYPRODUCTS, +# before calling add_custom_command(). +# +# Note: Any add_custom_target() depending on files in original OUTPUT must use +# add_custom_target_timestamp() instead to have the correct dependencies. +# +# add_custom_command_timestamp(OUTPUT output1 [output2 ...] +# COMMAND command1 [ARGS] [args1...] +# [COMMAND command2 [ARGS] [args2...] ...] +# [MAIN_DEPENDENCY depend] +# [DEPENDS [depends...]] +# [BYPRODUCTS [files...]] +# [IMPLICIT_DEPENDS depend1 +# [ depend2] ...] +# [WORKING_DIRECTORY dir] +# [COMMENT comment] +# [VERBATIM] [APPEND] [USES_TERMINAL]) +function(add_custom_command_timestamp) + set(OPTIONS VERBATIM APPEND USES_TERMINAL) + set(SINGLES MAIN_DEPENDENCY WORKING_DIRECTORY COMMENT) + set(MULTIS OUTPUT COMMAND DEPENDS BYPRODUCTS IMPLICIT_DEPENDS) + + _parse_arguments_with_multi_hack("${ARGN}") + + # Create a list of all the OUTPUTs (by removing our magic marker) + string(REPLACE ":::;" "" OUTPUTS "${PARAM_OUTPUT}") + + # Reset the OUTPUT and BYPRODUCTS as an empty list (if needed). + # Because they are MULTIS, we need to add our special marker here. + set(PARAM_OUTPUT ":::") + if (NOT PARAM_BYPRODUCTS) + set(PARAM_BYPRODUCTS ":::") + endif () + + foreach(OUTPUT IN LISTS OUTPUTS) + # For every output, we add a 'cmake -E touch' entry to update the + # timestamp on each run. + get_filename_component(OUTPUT_FILENAME ${OUTPUT} NAME) + string(APPEND PARAM_COMMAND ";:::;${CMAKE_COMMAND};-E;touch;${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILENAME}.timestamp") + + # We change the OUTPUT to a '.timestamp' variant, and make the real + # output a byproduct. + list(APPEND PARAM_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILENAME}.timestamp) + list(APPEND PARAM_BYPRODUCTS ${OUTPUT}) + + # Mark this file as being a byproduct; we use this again with + # add_custom_target_timestamp() to know if we should point to the + # '.timestamp' variant or not. + set_source_files_properties(${OUTPUT} PROPERTIES BYPRODUCT ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_FILENAME}.timestamp) + endforeach(OUTPUT) + + # Reassemble and call the wrapped command + _reassemble_command_line() + add_custom_command(${NEW_COMMAND_LINE}) +endfunction(add_custom_command_timestamp) + +# Generated files can be older than their dependencies, causing useless +# regenerations. This function adds a .timestamp file for each file in DEPENDS +# replaced by add_custom_command_timestamp(), before calling add_custom_target(). +# +# add_custom_target_timestamp(Name [ALL] [command1 [args1...]] +# [COMMAND command2 [args2...] ...] +# [DEPENDS depend depend depend ... ] +# [BYPRODUCTS [files...]] +# [WORKING_DIRECTORY dir] +# [COMMENT comment] +# [VERBATIM] [USES_TERMINAL] +# [SOURCES src1 [src2...]]) +function(add_custom_target_timestamp) + set(OPTIONS VERBATIM USES_TERMINAL) + set(SINGLES WORKING_DIRECTORY COMMENT) + set(MULTIS COMMAND DEPENDS BYPRODUCTS SOURCES) + # ALL is missing, as the order is important here. It will be picked up + # by ${PARAM_UNPARSED_ARGUMENTS} when reassembling the command line. + + _parse_arguments_with_multi_hack("${ARGN}") + + # Create a list of all the DEPENDs (by removing our magic marker) + string(REPLACE ":::;" "" DEPENDS "${PARAM_DEPENDS}") + + # Reset the DEPEND as an empty list. + # Because it is a MULTI, we need to add our special marker here. + set(PARAM_DEPENDS ":::") + + foreach(DEPEND IN LISTS DEPENDS) + # Check if the output is produced by add_custom_command_timestamp() + get_source_file_property(BYPRODUCT ${DEPEND} BYPRODUCT) + + if (BYPRODUCT STREQUAL "NOTFOUND") + # If it is not, just keep it as DEPEND + list(APPEND PARAM_DEPENDS "${DEPEND}") + else (BYPRODUCT STREQUAL "NOTFOUND") + # If it is, the BYPRODUCT property points to the timestamp we want to depend on + list(APPEND PARAM_DEPENDS "${BYPRODUCT}") + endif (BYPRODUCT STREQUAL "NOTFOUND") + endforeach(DEPEND) + + # Reassemble and call the wrapped command + _reassemble_command_line() + add_custom_target(${NEW_COMMAND_LINE}) +endfunction(add_custom_target_timestamp) diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake new file mode 100644 index 0000000000..05c19abab9 --- /dev/null +++ b/cmake/CompileFlags.cmake @@ -0,0 +1,120 @@ +# Macro which contains all bits to setup the compile flags correctly. +# +# compile_flags() +# +macro(compile_flags) + if (MSVC) + # Switch to MT (static) instead of MD (dynamic) binary + + # For MSVC two generators are available + # - a command line generator (Ninja) using CMAKE_BUILD_TYPE to specify the + # configuration of the build tree + # - an IDE generator (Visual Studio) using CMAKE_CONFIGURATION_TYPES to + # specify all configurations that will be available in the generated solution + list(APPEND MSVC_CONFIGS "${CMAKE_BUILD_TYPE}" "${CMAKE_CONFIGURATION_TYPES}") + + # Set usage of static runtime for all configurations + foreach(MSVC_CONFIG ${MSVC_CONFIGS}) + string(TOUPPER "CMAKE_CXX_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) + string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") + endforeach() + + # "If /Zc:rvalueCast is specified, the compiler follows section 5.4 of the + # C++11 standard". We need C++11 for the way we use threads. + add_compile_options(/Zc:rvalueCast) + + # Add DPI manifest to project; other WIN32 targets get this via ottdres.rc + list(APPEND GENERATED_SOURCE_FILES "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest") + endif (MSVC) + + # Add some -D flags for Debug builds. We cannot use add_definitions(), because + # it does not appear to support the $<> tags. + add_compile_options( + "$<$:-D_DEBUG>" + "$<$:-D_FORTIFY_SOURCE=2>" + ) + + # Prepare a generator that checks if we are not a debug, and don't have asserts + # on. We need this later on to set some compile options for stable releases. + set(IS_STABLE_RELEASE "$>,$>>") + + if (MSVC) + add_compile_options(/W3) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + add_compile_options( + -W + -Wall + -Wcast-qual + -Wextra + -Wsign-compare + -Wundef + -Wpointer-arith + -Wwrite-strings + -Wredundant-decls + -Wformat-security + -Wformat=2 + -Winit-self + -Wnon-virtual-dtor + + # Often parameters are unused, which is fine. + -Wno-unused-parameter + # We use 'ABCD' multichar for SaveLoad chunks identifiers + -Wno-multichar + + # Compilers complains about that we break strict-aliasing. + # On most places we don't see how to fix it, and it doesn't + # break anything. So disable strict-aliasing to make the + # compiler all happy. + -fno-strict-aliasing + ) + + add_compile_options( + # When we are a stable release (Release build + USE_ASSERTS not set), + # assertations are off, which trigger a lot of warnings. We disable + # these warnings for these releases. + "$<${IS_STABLE_RELEASE}:-Wno-unused-variable>" + "$<${IS_STABLE_RELEASE}:-Wno-unused-but-set-parameter>" + "$<${IS_STABLE_RELEASE}:-Wno-unused-but-set-variable>" + ) + + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("-flifetime-dse=1" LIFETIME_DSE_FOUND) + + add_compile_options( + # GCC 4.2+ automatically assumes that signed overflows do + # not occur in signed arithmetics, whereas we are not + # sure that they will not happen. It furthermore complains + # about its own optimized code in some places. + "-fno-strict-overflow" + + # Prevent optimisation supposing enums are in a range specified by the standard + # For details, see http://gcc.gnu.org/PR43680 + "-fno-tree-vrp" + + # -flifetime-dse=2 (default since GCC 6) doesn't play + # well with our custom pool item allocator + "$<$:-flifetime-dse=1>" + ) + endif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + add_compile_options( + -Wall + # warning #873: function ... ::operator new ... has no corresponding operator delete ... + -wd873 + # warning #1292: unknown attribute "fallthrough" + -wd1292 + # warning #1899: multicharacter character literal (potential portability problem) + -wd1899 + # warning #2160: anonymous union qualifier is ignored + -wd2160 + ) + else () + message(FATAL_ERROR "No warning flags are set for this compiler yet; please consider creating a Pull Request to add support for this compiler.") + endif () + + if (NOT WIN32) + # rdynamic is used to get useful stack traces from crash reports. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic") + endif (NOT WIN32) +endmacro() diff --git a/cmake/CreateGrfCommand.cmake b/cmake/CreateGrfCommand.cmake new file mode 100644 index 0000000000..25e599f568 --- /dev/null +++ b/cmake/CreateGrfCommand.cmake @@ -0,0 +1,50 @@ +# Macro which contains all bits and pieces to create a single grf file based +# on NFO and PNG files. +# +# create_grf_command() +# +function(create_grf_command) + set(EXTRA_PNG_SOURCE_FILES ${ARGV}) + + get_filename_component(GRF_SOURCE_FOLDER_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) + get_filename_component(GRF_BINARY_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../${GRF_SOURCE_FOLDER_NAME}.grf ABSOLUTE) + file(GLOB_RECURSE GRF_PNG_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) + file(GLOB_RECURSE GRF_NFO_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.nfo) + set(GRF_PNG_SOURCE_FILES ${GRF_PNG_SOURCE_FILES} ${EXTRA_PNG_SOURCE_FILES}) + + # Copy over all the PNG files to the correct folder + foreach(GRF_PNG_SOURCE_FILE IN LISTS GRF_PNG_SOURCE_FILES) + get_filename_component(GRF_PNG_SOURCE_FILE_NAME "${GRF_PNG_SOURCE_FILE}" NAME) + set(GRF_PNG_BINARY_FILE "${CMAKE_CURRENT_BINARY_DIR}/sprites/${GRF_PNG_SOURCE_FILE_NAME}") + + add_custom_command(OUTPUT ${GRF_PNG_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${GRF_PNG_SOURCE_FILE} + ${GRF_PNG_BINARY_FILE} + MAIN_DEPENDENCY ${GRF_PNG_SOURCE_FILE} + COMMENT "Copying ${GRF_PNG_SOURCE_FILE_NAME} sprite file" + ) + + list(APPEND GRF_PNG_BINARY_FILES ${GRF_PNG_BINARY_FILE}) + endforeach(GRF_PNG_SOURCE_FILE) + + add_custom_command(OUTPUT ${GRF_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} + -DGRF_SOURCE_FOLDER=${CMAKE_CURRENT_SOURCE_DIR} + -DGRF_BINARY_FILE=${GRF_BINARY_FILE} + -DNFORENUM_EXECUTABLE=${NFORENUM_EXECUTABLE} + -DGRFCODEC_EXECUTABLE=${GRFCODEC_EXECUTABLE} + -P ${CMAKE_SOURCE_DIR}/cmake/scripts/CreateGRF.cmake + MAIN_DEPENDENCY ${GRF_NFO_SOURCE_FILES} + DEPENDS ${GRF_PNG_BINARY_FILES} + ${CMAKE_SOURCE_DIR}/cmake/scripts/CreateGRF.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating ${GRF_SOURCE_FOLDER_NAME}.grf" + ) + + # For conviance, if you want to only test building the GRF + add_custom_target(${GRF_SOURCE_FOLDER_NAME}.grf + DEPENDS + ${GRF_BINARY_FILE} + ) +endfunction() diff --git a/cmake/CreateRegression.cmake b/cmake/CreateRegression.cmake new file mode 100644 index 0000000000..443332368a --- /dev/null +++ b/cmake/CreateRegression.cmake @@ -0,0 +1,86 @@ +# Macro which contains all bits and pieces to create the regression tests. +# This creates both a standalone target 'regression', and it integrates with +# 'ctest'. The first is prefered, as it is more verbose, and takes care of +# dependencies correctly. +# +# create_regression() +# +macro(create_regression) + # Find all the files in the regression folder; they need to be copied to the + # build folder before we can run the regression + file(GLOB_RECURSE REGRESSION_SOURCE_FILES ${CMAKE_SOURCE_DIR}/regression/*) + foreach(REGRESSION_SOURCE_FILE IN LISTS REGRESSION_SOURCE_FILES) + string(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/regression/" "${CMAKE_BINARY_DIR}/ai/" REGRESSION_BINARY_FILE "${REGRESSION_SOURCE_FILE}") + string(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/regression/" "" REGRESSION_SOURCE_FILE_NAME "${REGRESSION_SOURCE_FILE}") + + if ("${REGRESSION_SOURCE_FILE_NAME}" STREQUAL "regression.cfg") + continue() + endif ("${REGRESSION_SOURCE_FILE_NAME}" STREQUAL "regression.cfg") + + add_custom_command(OUTPUT ${REGRESSION_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E copy + ${REGRESSION_SOURCE_FILE} + ${REGRESSION_BINARY_FILE} + MAIN_DEPENDENCY ${REGRESSION_SOURCE_FILE} + COMMENT "Copying ${REGRESSION_SOURCE_FILE_NAME} regression file" + ) + + list(APPEND REGRESSION_BINARY_FILES ${REGRESSION_BINARY_FILE}) + endforeach(REGRESSION_SOURCE_FILE) + + # Copy the regression configuration in a special folder, so all autogenerated + # folders end up in the same place after running regression. + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/regression/regression.cfg + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/regression/regression.cfg + ${CMAKE_BINARY_DIR}/regression/regression.cfg + MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/regression/regression.cfg + COMMENT "Copying ${REGRESSION_SOURCE_FILE_NAME} regression file" + ) + list(APPEND REGRESSION_BINARY_FILES ${CMAKE_BINARY_DIR}/regression/regression.cfg) + + # Create a new target which copies all regression files + add_custom_target(regression_files + ALL # this is needed because 'make test' doesn't resolve dependencies, and otherwise this is never executed + DEPENDS + ${REGRESSION_BINARY_FILES} + ) + + enable_testing() + + # Find all the tests we have, and create a target for them + file(GLOB REGRESSION_TESTS ${CMAKE_SOURCE_DIR}/regression/*) + foreach(REGRESSION_TEST IN LISTS REGRESSION_TESTS) + get_filename_component(REGRESSION_TEST_NAME "${REGRESSION_TEST}" NAME) + + if ("${REGRESSION_TEST_NAME}" STREQUAL "regression.cfg") + continue() + endif ("${REGRESSION_TEST_NAME}" STREQUAL "regression.cfg") + + add_custom_target(regression_${REGRESSION_TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DOPENTTD_EXECUTABLE=$ + -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} + -DREGRESSION_TEST=${REGRESSION_TEST_NAME} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" + DEPENDS openttd regression_files + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running regression test ${REGRESSION_TEST_NAME}" + ) + + # Also make sure that 'make test' runs the regression + add_test(NAME regression_${REGRESSION_TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DOPENTTD_EXECUTABLE=$ + -DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE} + -DREGRESSION_TEST=${REGRESSION_TEST_NAME} + -P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + + list(APPEND REGRESSION_TARGETS regression_${REGRESSION_TEST_NAME}) + endforeach(REGRESSION_TEST) + + # Create a new target which runs the regression + add_custom_target(regression + DEPENDS ${REGRESSION_TARGETS}) +endmacro() diff --git a/cmake/Endian.cmake b/cmake/Endian.cmake new file mode 100644 index 0000000000..00cb975445 --- /dev/null +++ b/cmake/Endian.cmake @@ -0,0 +1,14 @@ +# Add the definitions to indicate which endian we are building for. +# +# add_endian_definition() +# +function(add_endian_definition) + include(TestBigEndian) + TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + + if (IS_BIG_ENDIAN) + add_definitions(-DTTD_ENDIAN=TTD_BIG_ENDIAN) + else (IS_BIG_ENDIAN) + add_definitions(-DTTD_ENDIAN=TTD_LITTLE_ENDIAN) + endif (IS_BIG_ENDIAN) +endfunction() diff --git a/cmake/FindAllegro.cmake b/cmake/FindAllegro.cmake new file mode 100644 index 0000000000..85b2ffd392 --- /dev/null +++ b/cmake/FindAllegro.cmake @@ -0,0 +1,65 @@ +#[=======================================================================[.rst: +FindAllegro +------- + +Finds the allegro library. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Allegro_FOUND`` + True if the system has the allegro library. +``Allegro_INCLUDE_DIRS`` + Include directories needed to use allegro. +``Allegro_LIBRARIES`` + Libraries needed to link to allegro. +``Allegro_VERSION`` + The version of the allegro library which was found. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Allegro_INCLUDE_DIR`` + The directory containing ``allegro.h``. +``Allegro_LIBRARY`` + The path to the allegro library. + +#]=======================================================================] + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_Allegro QUIET allegro) + +find_path(Allegro_INCLUDE_DIR + NAMES allegro.h + PATHS ${PC_Allegro_INCLUDE_DIRS} +) + +find_library(Allegro_LIBRARY + NAMES alleg + PATHS ${PC_Allegro_LIBRARY_DIRS} +) + +set(Allegro_VERSION ${PC_Allegro_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Allegro + FOUND_VAR Allegro_FOUND + REQUIRED_VARS + Allegro_LIBRARY + Allegro_INCLUDE_DIR + VERSION_VAR Allegro_VERSION +) + +if (Allegro_FOUND) + set(Allegro_LIBRARIES ${Allegro_LIBRARY}) + set(Allegro_INCLUDE_DIRS ${Allegro_INCLUDE_DIR}) +endif () + +mark_as_advanced( + Allegro_INCLUDE_DIR + Allegro_LIBRARY +) diff --git a/cmake/FindEditbin.cmake b/cmake/FindEditbin.cmake new file mode 100644 index 0000000000..363bc00539 --- /dev/null +++ b/cmake/FindEditbin.cmake @@ -0,0 +1,13 @@ +# Autodetect editbin. Only useful for MSVC. + +get_filename_component(MSVC_COMPILE_DIRECTORY ${CMAKE_CXX_COMPILER} DIRECTORY) +find_program( + EDITBIN_EXECUTABLE editbin.exe + HINTS ${MSVC_COMPILE_DIRECTORY} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Editbin + FOUND_VAR EDITBIN_FOUND + REQUIRED_VARS EDITBIN_EXECUTABLE +) diff --git a/cmake/FindFluidsynth.cmake b/cmake/FindFluidsynth.cmake new file mode 100644 index 0000000000..063726dbe5 --- /dev/null +++ b/cmake/FindFluidsynth.cmake @@ -0,0 +1,65 @@ +#[=======================================================================[.rst: +FindFluidsynth +------- + +Finds the fluidsynth library. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Fluidsynth_FOUND`` + True if the system has the fluidsynth library. +``Fluidsynth_INCLUDE_DIRS`` + Include directories needed to use fluidsynth. +``Fluidsynth_LIBRARIES`` + Libraries needed to link to fluidsynth. +``Fluidsynth_VERSION`` + The version of the fluidsynth library which was found. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Fluidsynth_INCLUDE_DIR`` + The directory containing ``fluidsynth.h``. +``Fluidsynth_LIBRARY`` + The path to the fluidsynth library. + +#]=======================================================================] + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_Fluidsynth QUIET fluidsynth) + +find_path(Fluidsynth_INCLUDE_DIR + NAMES fluidsynth.h + PATHS ${PC_Fluidsynth_INCLUDE_DIRS} +) + +find_library(Fluidsynth_LIBRARY + NAMES fluidsynth + PATHS ${PC_Fluidsynth_LIBRARY_DIRS} +) + +set(Fluidsynth_VERSION ${PC_Fluidsynth_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Fluidsynth + FOUND_VAR Fluidsynth_FOUND + REQUIRED_VARS + Fluidsynth_LIBRARY + Fluidsynth_INCLUDE_DIR + VERSION_VAR Fluidsynth_VERSION +) + +if (Fluidsynth_FOUND) + set(Fluidsynth_LIBRARIES ${Fluidsynth_LIBRARY}) + set(Fluidsynth_INCLUDE_DIRS ${Fluidsynth_INCLUDE_DIR}) +endif () + +mark_as_advanced( + Fluidsynth_INCLUDE_DIR + Fluidsynth_LIBRARY +) diff --git a/cmake/FindFontconfig.cmake b/cmake/FindFontconfig.cmake new file mode 100644 index 0000000000..a6f0180b37 --- /dev/null +++ b/cmake/FindFontconfig.cmake @@ -0,0 +1,101 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindFontconfig +-------------- + +Find Fontconfig headers and library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +``Fontconfig::Fontconfig`` + The Fontconfig library, if found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables in your project: + +``Fontconfig_FOUND`` + true if (the requested version of) Fontconfig is available. +``Fontconfig_VERSION`` + the version of Fontconfig. +``Fontconfig_LIBRARIES`` + the libraries to link against to use Fontconfig. +``Fontconfig_INCLUDE_DIRS`` + where to find the Fontconfig headers. +``Fontconfig_COMPILE_OPTIONS`` + this should be passed to target_compile_options(), if the + target is not used for linking + +#]=======================================================================] + + +# use pkg-config to get the directories and then use these values +# in the FIND_PATH() and FIND_LIBRARY() calls +find_package(PkgConfig QUIET) +pkg_check_modules(PKG_FONTCONFIG QUIET fontconfig) +set(Fontconfig_COMPILE_OPTIONS ${PKG_FONTCONFIG_CFLAGS_OTHER}) +set(Fontconfig_VERSION ${PKG_FONTCONFIG_VERSION}) + +find_path( Fontconfig_INCLUDE_DIR + NAMES + fontconfig/fontconfig.h + HINTS + ${PKG_FONTCONFIG_INCLUDE_DIRS} + /usr/X11/include +) + +find_library( Fontconfig_LIBRARY + NAMES + fontconfig + PATHS + ${PKG_FONTCONFIG_LIBRARY_DIRS} +) + +if (Fontconfig_INCLUDE_DIR AND NOT Fontconfig_VERSION) + file(STRINGS ${Fontconfig_INCLUDE_DIR}/fontconfig/fontconfig.h _contents REGEX "^#define[ \t]+FC_[A-Z]+[ \t]+[0-9]+$") + unset(Fontconfig_VERSION) + foreach(VPART MAJOR MINOR REVISION) + foreach(VLINE ${_contents}) + if(VLINE MATCHES "^#define[\t ]+FC_${VPART}[\t ]+([0-9]+)$") + set(Fontconfig_VERSION_PART "${CMAKE_MATCH_1}") + if(Fontconfig_VERSION) + string(APPEND Fontconfig_VERSION ".${Fontconfig_VERSION_PART}") + else() + set(Fontconfig_VERSION "${Fontconfig_VERSION_PART}") + endif() + endif() + endforeach() + endforeach() +endif () + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Fontconfig + FOUND_VAR + Fontconfig_FOUND + REQUIRED_VARS + Fontconfig_LIBRARY + Fontconfig_INCLUDE_DIR + VERSION_VAR + Fontconfig_VERSION +) + + +if(Fontconfig_FOUND AND NOT TARGET Fontconfig::Fontconfig) + add_library(Fontconfig::Fontconfig UNKNOWN IMPORTED) + set_target_properties(Fontconfig::Fontconfig PROPERTIES + IMPORTED_LOCATION "${Fontconfig_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${Fontconfig_COMPILE_OPTIONS}" + INTERFACE_INCLUDE_DIRECTORIES "${Fontconfig_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced(Fontconfig_LIBRARY Fontconfig_INCLUDE_DIR) + +if(Fontconfig_FOUND) + set(Fontconfig_LIBRARIES ${Fontconfig_LIBRARY}) + set(Fontconfig_INCLUDE_DIRS ${Fontconfig_INCLUDE_DIR}) +endif() diff --git a/cmake/FindGrfcodec.cmake b/cmake/FindGrfcodec.cmake new file mode 100644 index 0000000000..089f956706 --- /dev/null +++ b/cmake/FindGrfcodec.cmake @@ -0,0 +1,13 @@ +# Autodetect grfcodec and nforenum. +# + +find_program(GRFCODEC_EXECUTABLE grfcodec) +find_program(NFORENUM_EXECUTABLE nforenum) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Grfcodec + FOUND_VAR GRFCODEC_FOUND + REQUIRED_VARS + GRFCODEC_EXECUTABLE + NFORENUM_EXECUTABLE +) diff --git a/cmake/FindICU.cmake b/cmake/FindICU.cmake new file mode 100644 index 0000000000..471e43c1d9 --- /dev/null +++ b/cmake/FindICU.cmake @@ -0,0 +1,64 @@ +#[=======================================================================[.rst: +FindICU +------- + +Finds components of the ICU library. + +Accepted components are: uc, i18n, le, lx, io + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``ICU_FOUND`` + True if components of ICU library are found. +``ICU_VERSION`` + The version of the ICU library which was found. +``ICU__FOUND`` + True if the system has the component of ICU library. +``ICU__INCLUDE_DIRS`` + Include directories needed to use the component of ICU library. +``ICU__LIBRARIES`` + Libraries needed to link to the component of ICU library. + +#]=======================================================================] + +find_package(PkgConfig QUIET) + +set(ICU_KNOWN_COMPONENTS "uc" "i18n" "le" "lx" "io") + +foreach(MOD_NAME IN LISTS ICU_FIND_COMPONENTS) + if (NOT MOD_NAME IN_LIST ICU_KNOWN_COMPONENTS) + message(FATAL_ERROR "Unknown ICU component: ${MOD_NAME}") + endif() + pkg_check_modules(PC_ICU_${MOD_NAME} QUIET icu-${MOD_NAME}) + + # Check the libraries returned by pkg-config really exist. + unset(PC_LIBRARIES) + foreach(LIBRARY IN LISTS PC_ICU_${MOD_NAME}_LIBRARIES) + unset(PC_LIBRARY CACHE) + find_library(PC_LIBRARY NAMES ${LIBRARY}) + if (NOT PC_LIBRARY) + unset(PC_ICU_${MOD_NAME}_FOUND) + endif() + list(APPEND PC_LIBRARIES ${PC_LIBRARY}) + endforeach() + unset(PC_LIBRARY CACHE) + + if (${PC_ICU_${MOD_NAME}_FOUND}) + set(ICU_COMPONENT_FOUND TRUE) + set(ICU_${MOD_NAME}_FOUND TRUE) + set(ICU_${MOD_NAME}_LIBRARIES ${PC_LIBRARIES}) + set(ICU_${MOD_NAME}_INCLUDE_DIRS ${PC_ICU_${MOD_NAME}_INCLUDE_DIRS}) + set(ICU_VERSION ${PC_ICU_${MOD_NAME}_VERSION}) + endif() +endforeach() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ICU + FOUND_VAR ICU_FOUND + REQUIRED_VARS ICU_COMPONENT_FOUND + VERSION_VAR ICU_VERSION + HANDLE_COMPONENTS +) diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake new file mode 100644 index 0000000000..5185601ab7 --- /dev/null +++ b/cmake/FindIconv.cmake @@ -0,0 +1,133 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindIconv +--------- + +This module finds the ``iconv()`` POSIX.1 functions on the system. +These functions might be provided in the regular C library or externally +in the form of an additional library. + +The following variables are provided to indicate iconv support: + +.. variable:: Iconv_FOUND + + Variable indicating if the iconv support was found. + +.. variable:: Iconv_INCLUDE_DIRS + + The directories containing the iconv headers. + +.. variable:: Iconv_LIBRARIES + + The iconv libraries to be linked. + +.. variable:: Iconv_IS_BUILT_IN + + A variable indicating whether iconv support is stemming from the + C library or not. Even if the C library provides `iconv()`, the presence of + an external `libiconv` implementation might lead to this being false. + +Additionally, the following :prop_tgt:`IMPORTED` target is being provided: + +.. variable:: Iconv::Iconv + + Imported target for using iconv. + +The following cache variables may also be set: + +.. variable:: Iconv_INCLUDE_DIR + + The directory containing the iconv headers. + +.. variable:: Iconv_LIBRARY + + The iconv library (if not implicitly given in the C library). + +.. note:: + On POSIX platforms, iconv might be part of the C library and the cache + variables ``Iconv_INCLUDE_DIR`` and ``Iconv_LIBRARY`` might be empty. + +#]=======================================================================] + +include(CMakePushCheckState) +if(CMAKE_C_COMPILER_LOADED) + include(CheckCSourceCompiles) +elseif(CMAKE_CXX_COMPILER_LOADED) + include(CheckCXXSourceCompiles) +else() + # If neither C nor CXX are loaded, implicit iconv makes no sense. + set(Iconv_IS_BUILT_IN FALSE) +endif() + +# iconv can only be provided in libc on a POSIX system. +# If any cache variable is already set, we'll skip this test. +if(NOT DEFINED Iconv_IS_BUILT_IN) + if(UNIX AND NOT DEFINED Iconv_INCLUDE_DIR AND NOT DEFINED Iconv_LIBRARY) + cmake_push_check_state(RESET) + # We always suppress the message here: Otherwise on supported systems + # not having iconv in their C library (e.g. those using libiconv) + # would always display a confusing "Looking for iconv - not found" message + set(CMAKE_FIND_QUIETLY TRUE) + # The following code will not work, but it's sufficient to see if it compiles. + # Note: libiconv will define the iconv functions as macros, so CheckSymbolExists + # will not yield correct results. + set(Iconv_IMPLICIT_TEST_CODE + " + #include + #include + int main() { + char *a, *b; + size_t i, j; + iconv_t ic; + ic = iconv_open(\"to\", \"from\"); + iconv(ic, &a, &i, &b, &j); + iconv_close(ic); + } + " + ) + if(CMAKE_C_COMPILER_LOADED) + check_c_source_compiles("${Iconv_IMPLICIT_TEST_CODE}" Iconv_IS_BUILT_IN) + else() + check_cxx_source_compiles("${Iconv_IMPLICIT_TEST_CODE}" Iconv_IS_BUILT_IN) + endif() + cmake_pop_check_state() + else() + set(Iconv_IS_BUILT_IN FALSE) + endif() +endif() + +if(NOT Iconv_IS_BUILT_IN) + find_path(Iconv_INCLUDE_DIR + NAMES "iconv.h" + DOC "iconv include directory") + set(Iconv_LIBRARY_NAMES "iconv" "libiconv") +else() + set(Iconv_INCLUDE_DIR "" CACHE FILEPATH "iconv include directory") + set(Iconv_LIBRARY_NAMES "c") +endif() + +find_library(Iconv_LIBRARY + NAMES ${Iconv_LIBRARY_NAMES} + DOC "iconv library (potentially the C library)") + +mark_as_advanced(Iconv_INCLUDE_DIR) +mark_as_advanced(Iconv_LIBRARY) + +include(FindPackageHandleStandardArgs) +if(NOT Iconv_IS_BUILT_IN) + find_package_handle_standard_args(Iconv REQUIRED_VARS Iconv_LIBRARY Iconv_INCLUDE_DIR) +else() + find_package_handle_standard_args(Iconv REQUIRED_VARS Iconv_LIBRARY) +endif() + +if(Iconv_FOUND) + set(Iconv_INCLUDE_DIRS "${Iconv_INCLUDE_DIR}") + set(Iconv_LIBRARIES "${Iconv_LIBRARY}") + if(NOT TARGET Iconv::Iconv) + add_library(Iconv::Iconv INTERFACE IMPORTED) + endif() + set_property(TARGET Iconv::Iconv PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${Iconv_INCLUDE_DIRS}") + set_property(TARGET Iconv::Iconv PROPERTY INTERFACE_LINK_LIBRARIES "${Iconv_LIBRARIES}") +endif() diff --git a/cmake/FindLZO.cmake b/cmake/FindLZO.cmake new file mode 100644 index 0000000000..9a409002df --- /dev/null +++ b/cmake/FindLZO.cmake @@ -0,0 +1,89 @@ +#[=======================================================================[.rst: +FindLZO +------- + +Finds the LZO library. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``LZO_FOUND`` + True if the system has the LZO library. +``LZO_INCLUDE_DIRS`` + Include directories needed to use LZO. +``LZO_LIBRARIES`` + Libraries needed to link to LZO. +``LZO_VERSION`` + The version of the LZO library which was found. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``LZO_INCLUDE_DIR`` + The directory containing ``lzo/lzo1x.h``. +``LZO_LIBRARY`` + The path to the LZO library. + +#]=======================================================================] + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_LZO QUIET lzo2) + +find_path(LZO_INCLUDE_DIR + NAMES lzo/lzo1x.h + PATHS ${PC_LZO_INCLUDE_DIRS} +) + +find_library(LZO_LIBRARY + NAMES lzo2 + PATHS ${PC_LZO_LIBRARY_DIRS} +) + +# With vcpkg, the library path should contain both 'debug' and 'optimized' +# entries (see target_link_libraries() documentation for more information) +# +# NOTE: we only patch up when using vcpkg; the same issue might happen +# when not using vcpkg, but this is non-trivial to fix, as we have no idea +# what the paths are. With vcpkg we do. And we only official support vcpkg +# with Windows. +# +# NOTE: this is based on the assumption that the debug file has the same +# name as the optimized file. This is not always the case, but so far +# experiences has shown that in those case vcpkg CMake files do the right +# thing. +if (VCPKG_TOOLCHAIN AND LZO_LIBRARY) + if (LZO_LIBRARY MATCHES "/debug/") + set(LZO_LIBRARY_DEBUG ${LZO_LIBRARY}) + string(REPLACE "/debug/lib/" "/lib/" LZO_LIBRARY_RELEASE ${LZO_LIBRARY}) + else() + set(LZO_LIBRARY_RELEASE ${LZO_LIBRARY}) + string(REPLACE "/lib/" "/debug/lib/" LZO_LIBRARY_DEBUG ${LZO_LIBRARY}) + endif() + include(SelectLibraryConfigurations) + select_library_configurations(LZO) +endif() + +set(LZO_VERSION ${PC_LZO_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LZO + FOUND_VAR LZO_FOUND + REQUIRED_VARS + LZO_LIBRARY + LZO_INCLUDE_DIR + VERSION_VAR LZO_VERSION +) + +if (LZO_FOUND) + set(LZO_LIBRARIES ${LZO_LIBRARY}) + set(LZO_INCLUDE_DIRS ${LZO_INCLUDE_DIR}) +endif () + +mark_as_advanced( + LZO_INCLUDE_DIR + LZO_LIBRARY +) diff --git a/cmake/FindSSE.cmake b/cmake/FindSSE.cmake new file mode 100644 index 0000000000..d0a57ccbb2 --- /dev/null +++ b/cmake/FindSSE.cmake @@ -0,0 +1,17 @@ +# Autodetect if SSE4.1 can be used. If so, the assumption is, so can the other +# SSE version (SSE 2.0, SSSE 3.0). + +include(CheckCXXSourceCompiles) +set(CMAKE_REQUIRED_FLAGS "") + +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set(CMAKE_REQUIRED_FLAGS "-msse4.1") +endif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + +check_cxx_source_compiles(" + #include + #include + #include + int main() { return 0; }" + SSE_FOUND +) diff --git a/cmake/FindXDG_basedir.cmake b/cmake/FindXDG_basedir.cmake new file mode 100644 index 0000000000..913b425e20 --- /dev/null +++ b/cmake/FindXDG_basedir.cmake @@ -0,0 +1,65 @@ +#[=======================================================================[.rst: +FindXDG_basedir +------- + +Finds the xdg-basedir library. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``XDG_basedir_FOUND`` + True if the system has the xdg-basedir library. +``XDG_basedir_INCLUDE_DIRS`` + Include directories needed to use xdg-basedir. +``XDG_basedir_LIBRARIES`` + Libraries needed to link to xdg-basedir. +``XDG_basedir_VERSION`` + The version of the xdg-basedir library which was found. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``XDG_basedir_INCLUDE_DIR`` + The directory containing ``xdg-basedir.h``. +``XDG_basedir_LIBRARY`` + The path to the xdg-basedir library. + +#]=======================================================================] + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_XDG_basedir QUIET libxdg-basedir) + +find_path(XDG_basedir_INCLUDE_DIR + NAMES basedir.h + PATHS ${PC_XDG_basedir_INCLUDE_DIRS} +) + +find_library(XDG_basedir_LIBRARY + NAMES xdg-basedir + PATHS ${PC_XDG_basedir_LIBRARY_DIRS} +) + +set(XDG_basedir_VERSION ${PC_XDG_basedir_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(XDG_basedir + FOUND_VAR XDG_basedir_FOUND + REQUIRED_VARS + XDG_basedir_LIBRARY + XDG_basedir_INCLUDE_DIR + VERSION_VAR XDG_basedir_VERSION +) + +if (XDG_basedir_FOUND) + set(XDG_basedir_LIBRARIES ${XDG_basedir_LIBRARY}) + set(XDG_basedir_INCLUDE_DIRS ${XDG_basedir_INCLUDE_DIR}) +endif () + +mark_as_advanced( + XDG_basedir_INCLUDE_DIR + XDG_basedir_LIBRARY +) diff --git a/cmake/FindXaudio2.cmake b/cmake/FindXaudio2.cmake new file mode 100644 index 0000000000..065e2d3589 --- /dev/null +++ b/cmake/FindXaudio2.cmake @@ -0,0 +1,18 @@ +# Autodetect if xaudio2 can be used. + +include(CheckCXXSourceCompiles) +set(CMAKE_REQUIRED_FLAGS "") + +check_cxx_source_compiles(" + #include + + #undef NTDDI_VERSION + #undef _WIN32_WINNT + + #define NTDDI_VERSION NTDDI_WIN8 + #define _WIN32_WINNT _WIN32_WINNT_WIN8 + + #include + int main() { return 0; }" + XAUDIO2_FOUND +) diff --git a/cmake/LinkPackage.cmake b/cmake/LinkPackage.cmake new file mode 100644 index 0000000000..f64ccfd51f --- /dev/null +++ b/cmake/LinkPackage.cmake @@ -0,0 +1,18 @@ +function(link_package NAME) + cmake_parse_arguments(LP "ENCOURAGED" "TARGET" "" ${ARGN}) + + if (${NAME}_FOUND) + string(TOUPPER "${NAME}" UCNAME) + add_definitions(-DWITH_${UCNAME}) + if (LP_TARGET AND TARGET ${LP_TARGET}) + target_link_libraries(openttd ${LP_TARGET}) + message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${LP_TARGET}") + else() + include_directories(${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR}) + target_link_libraries(openttd ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}) + message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR} -- ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}") + endif() + elseif (LP_ENCOURAGED) + message(WARNING "${NAME} not found; compiling OpenTTD without ${NAME} is strongly disencouraged") + endif() +endfunction() diff --git a/cmake/Options.cmake b/cmake/Options.cmake new file mode 100644 index 0000000000..b292567f04 --- /dev/null +++ b/cmake/Options.cmake @@ -0,0 +1,84 @@ +# Set the options for the directories (personal, shared, global). +# +# set_directory_options() +# +function(set_directory_options) + if (APPLE) + set(DEFAULT_PERSONAL_DIR "Documents/OpenTTD") + set(DEFAULT_SHARED_DIR "/Library/Application Support/OpenTTD") + set(DEFAULT_GLOBAL_DIR "(not set)") + elseif (WIN32) + set(DEFAULT_PERSONAL_DIR "OpenTTD") + set(DEFAULT_SHARED_DIR "(not set)") + set(DEFAULT_GLOBAL_DIR "(not set)") + elseif (UNIX) + set(DEFAULT_PERSONAL_DIR ".openttd") + set(DEFAULT_SHARED_DIR "(not set)") + set(DEFAULT_GLOBAL_DIR "${CMAKE_INSTALL_PREFIX}/share/games/openttd") + else () + message(FATAL_ERROR "Unknown OS found; please consider creating a Pull Request to add support for this OS.") + endif () + + if (NOT PERSONAL_DIR) + set(PERSONAL_DIR "${DEFAULT_PERSONAL_DIR}" CACHE STRING "Personal directory") + message(STATUS "Detecting Personal Data directory - ${PERSONAL_DIR}") + endif (NOT PERSONAL_DIR) + + if (NOT SHARED_DIR) + set(SHARED_DIR "${DEFAULT_SHARED_DIR}" CACHE STRING "Shared directory") + message(STATUS "Detecting Shared Data directory - ${SHARED_DIR}") + endif (NOT SHARED_DIR) + + if (NOT GLOBAL_DIR) + set(GLOBAL_DIR "${DEFAULT_GLOBAL_DIR}" CACHE STRING "Global directory") + message(STATUS "Detecting Global Data directory - ${GLOBAL_DIR}") + endif (NOT GLOBAL_DIR) +endfunction() + +# Set some generic options that influence what is being build. +# +# set_options() +# +function(set_options) + if (UNIX AND NOT APPLE) + set(DEFAULT_OPTION_INSTALL_FHS YES) + else (UNIX AND NOT APPLE) + set(DEFAULT_OPTION_INSTALL_FHS NO) + endif (UNIX AND NOT APPLE) + + option(OPTION_DEDICATED "Build dedicated server only (no GUI)" NO) + option(OPTION_INSTALL_FHS "Install with Filesstem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) + option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" YES) + option(OPTION_USE_THREADS "Use threads" YES) +endfunction() + +# Show the values of the generic options. +# +# show_options() +# +function(show_options) + message(STATUS "Option Dedicated - ${OPTION_DEDICATED}") + message(STATUS "Option Install FHS - ${OPTION_INSTALL_FHS}") + message(STATUS "Option Use assert - ${OPTION_USE_ASSERTS}") + message(STATUS "Option Use threads - ${OPTION_USE_THREADS}") +endfunction() + +# Add the definitions for the options that are selected. +# +# add_definitions_based_on_options() +# +function(add_definitions_based_on_options) + if (OPTION_DEDICATED) + add_definitions(-DDEDICATED) + endif (OPTION_DEDICATED) + + if (NOT OPTION_USE_THREADS) + add_definitions(-DNO_THREADS) + endif (NOT OPTION_USE_THREADS) + + if (OPTION_USE_ASSERTS) + add_definitions(-DWITH_ASSERT) + else (OPTION_USE_ASSERTS) + add_definitions(-DNDEBUG) + endif (OPTION_USE_ASSERTS) +endfunction() diff --git a/cmake/SourceList.cmake b/cmake/SourceList.cmake new file mode 100644 index 0000000000..6300a19a43 --- /dev/null +++ b/cmake/SourceList.cmake @@ -0,0 +1,63 @@ +# Add a file to be compiled. +# +# add_files([file1 ...] CONDITION condition [condition ...]) +# +# CONDITION is a complete statement that can be evaluated with if(). +# If it evaluates true, the source files will be added; otherwise not. +# For example: ADD_IF SDL_FOUND AND Allegro_FOUND +# +function(add_files) + cmake_parse_arguments(PARAM "" "" "CONDITION" ${ARGN}) + set(PARAM_FILES "${PARAM_UNPARSED_ARGUMENTS}") + + if (PARAM_CONDITION) + if (NOT (${PARAM_CONDITION})) + return() + endif (NOT (${PARAM_CONDITION})) + endif (PARAM_CONDITION) + + foreach(FILE IN LISTS PARAM_FILES) + target_sources(openttd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}) + endforeach() +endfunction(add_files) + +# This function works around an 'issue' with CMake, where +# set_source_files_properties() only works in the scope of the file. We want +# to set properties for the source file on a more global level. To solve this, +# this function records the flags you want, and a macro adds them in the root +# CMakeLists.txt. +# See this URL for more information on the issue: +# http://cmake.3232098.n2.nabble.com/scope-of-set-source-files-properties-td4766111.html +# +# set_compile_flags([file1 ...] COMPILE_FLAGS cflag [cflag ...]) +# +function(set_compile_flags) + cmake_parse_arguments(PARAM "" "" "COMPILE_FLAGS" ${ARGN}) + set(PARAM_FILES "${PARAM_UNPARSED_ARGUMENTS}") + + get_property(SOURCE_PROPERTIES GLOBAL PROPERTY source_properties) + + foreach(FILE IN LISTS PARAM_FILES) + list(APPEND SOURCE_PROPERTIES "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}::${PARAM_COMPILE_FLAGS}") + endforeach() + + set_property(GLOBAL PROPERTY source_properties "${SOURCE_PROPERTIES}") +endfunction(set_compile_flags) + +# Call this macro in the same CMakeLists.txt and after add_executable(). +# This makes sure all the COMPILE_FLAGS of set_compile_flags() are set +# correctly. +# +# process_compile_flags() +# +function(process_compile_flags) + get_property(SOURCE_PROPERTIES GLOBAL PROPERTY source_properties) + + foreach(ENTRY ${SOURCE_PROPERTIES}) + string(REPLACE "::" ";" ENTRY "${ENTRY}") + list(GET ENTRY 0 FILE) + list(GET ENTRY 1 PROPERTIES) + + set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS ${PROPERTIES}) + endforeach() +endfunction(process_compile_flags) diff --git a/cmake/Static.cmake b/cmake/Static.cmake new file mode 100644 index 0000000000..7648d05e7f --- /dev/null +++ b/cmake/Static.cmake @@ -0,0 +1,14 @@ +# Set static linking if the platform requires it. +# +# set_static() +# +function(set_static_if_needed) + if (MINGW) + # Let exectutables run outside MinGW environment + # Force searching static libs + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE) + + # Force static linking + link_libraries(-static -static-libgcc -static-libstdc++) + endif() +endfunction() diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake new file mode 100644 index 0000000000..5edabeb195 --- /dev/null +++ b/cmake/scripts/FindVersion.cmake @@ -0,0 +1,134 @@ +cmake_minimum_required(VERSION 3.5) + +# +# Finds the current version of the current folder. +# + +find_package(Git QUIET) +# ${CMAKE_SOURCE_DIR}/.git may be a directory or a regular file +if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + # Make sure LC_ALL is set to something desirable + set(SAVED_LC_ALL "$ENV{LC_ALL}") + set(ENV{LC_ALL} C) + + # Assume the dir is not modified + set(REV_MODIFIED 0) + + # Refresh the index to make sure file stat info is in sync, then look for modifications + execute_process(COMMAND ${GIT_EXECUTABLE} update-index --refresh + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_QUIET + ) + + # See if git tree is modified + execute_process(COMMAND ${GIT_EXECUTABLE} diff-index HEAD + OUTPUT_VARIABLE IS_MODIFIED + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + if (NOT IS_MODIFIED STREQUAL "") + set(REV_MODIFIED 2) + endif() + + # Get last commit hash + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify HEAD + OUTPUT_VARIABLE FULLHASH + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + set(REV_HASH "${FULLHASH}") + + string(SUBSTRING "${FULLHASH}" 0 10 SHORTHASH) + + # Get the last commit date + execute_process(COMMAND ${GIT_EXECUTABLE} show -s --pretty=format:%ci HEAD + OUTPUT_VARIABLE COMMITDATE + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + string(REGEX REPLACE "([0-9]+)-([0-9]+)-([0-9]+).*" "\\1\\2\\3" COMMITDATE "${COMMITDATE}") + set(REV_ISODATE "${COMMITDATE}") + string(SUBSTRING REV_ISODATE 1 4 REV_YEAR) + + # Get the branch + execute_process(COMMAND ${GIT_EXECUTABLE} symbolic-ref -q HEAD + OUTPUT_VARIABLE BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + string(REGEX REPLACE ".*/" "" BRANCH "${BRANCH}") + + # Get the tag + execute_process(COMMAND ${GIT_EXECUTABLE} name-rev --name-only --tags --no-undefined HEAD + OUTPUT_VARIABLE TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + string(REGEX REPLACE "\^0$" "" TAG "${TAG}") + + if (REV_MODIFIED EQUAL 0) + set(HASHPREFIX "-g") + elseif (REV_MODIFIED EQUAL 2) + set(HASHPREFIX "-m") + else () + set(HASHPREFIX "-u") + endif() + + # Set the version string + if (NOT TAG STREQUAL "") + set(REV_VERSION "${TAG}") + set(REV_ISTAG 1) + + string(REGEX REPLACE "^[0-9.]*$" "" STABLETAG "${TAG}") + if (NOT STABLETAG STREQUAL "") + set(REV_ISSTABLETAG 1) + else () + set(REV_ISSTABLETAG 0) + endif () + else () + set(REV_VERSION "${REV_ISODATE}-${BRANCH}${HASHPREFIX}${SHORTHASH}") + set(REV_ISTAG 0) + set(REV_ISSTABLETAG 0) + endif () + + # Restore LC_ALL + set(ENV{LC_ALL} "${SAVED_LC_ALL}") +elseif (EXISTS "${CMAKE_SOURCE_DIR}/.ottdrev") + file(READ "${CMAKE_SOURCE_DIR}/.ottdrev" OTTDREV) + string(REPLACE "\t" ";" OTTDREV "${OTTDREV}") + list(GET OTTDREV 0 REV_VERSION) + list(GET OTTDREV 1 REV_ISODATE) + list(GET OTTDREV 2 REV_MODIFIED) + list(GET OTTDREV 3 REV_HASH) + list(GET OTTDREV 4 REV_ISTAG) + list(GET OTTDREV 5 REV_ISSTABLETAG) + list(GET OTTDREV 6 REV_YEAR) +else () + message(WARNING "No version detected; this build will NOT be network compatible") + set(REV_VERSION "norev0000") + set(REV_ISODATE "19700101") + set(REV_MODIFIED 1) + set(REV_HASH "unknown") + set(REV_ISTAG 0) + set(REV_ISSTABLETAG 0) + set(REV_YEAR "1970") +endif () + +message(STATUS "Version string: ${REV_VERSION}") + +message(STATUS "Generating rev.cpp") +configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" + "${FIND_VERSION_BINARY_DIR}/rev.cpp") + +if (WIN32) + message(STATUS "Generating ottdres.rc") + configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" + "${FIND_VERSION_BINARY_DIR}/ottdres.rc") +endif (WIN32) + +message(STATUS "Generating CPackProperties.cmake") +configure_file("${CMAKE_SOURCE_DIR}/CPackProperties.cmake.in" + "${CPACK_BINARY_DIR}/CPackProperties.cmake" @ONLY) diff --git a/media/baseset/CMakeLists.txt b/media/baseset/CMakeLists.txt index 309ac7a498..c3fe34ce4e 100644 --- a/media/baseset/CMakeLists.txt +++ b/media/baseset/CMakeLists.txt @@ -20,13 +20,13 @@ set(BASESET_OTHER_SOURCE_FILES ) # Done by the subdirectories, if nforenum / grfcodec is installed -if (NFORENUM_FOUND AND GRFCODEC_FOUND) +if (GRFCODEC_FOUND) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/openttd.grf PROPERTIES GENERATED TRUE) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf PROPERTIES GENERATED TRUE) list(APPEND BASESET_BINARY_FILES openttd.grf) list(APPEND BASESET_BINARY_FILES orig_extra.grf) -endif (NFORENUM_FOUND AND GRFCODEC_FOUND) +endif (GRFCODEC_FOUND) set(BASESET_EXTRAGRF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf) diff --git a/media/baseset/openttd/CMakeLists.txt b/media/baseset/openttd/CMakeLists.txt index 42d62dd7cc..c4f8d61ade 100644 --- a/media/baseset/openttd/CMakeLists.txt +++ b/media/baseset/openttd/CMakeLists.txt @@ -3,7 +3,7 @@ # This is mainly because not many people have both of these tools installed, # so it is cheaper to cache them in git, and only regenerate when you are # working on it / have the tools installed. -if (NFORENUM_FOUND AND GRFCODEC_FOUND) - include(CreateGrfCommand REQUIRED) +if (GRFCODEC_FOUND) + include(CreateGrfCommand) create_grf_command() -endif (NFORENUM_FOUND AND GRFCODEC_FOUND) +endif (GRFCODEC_FOUND) diff --git a/media/baseset/orig_extra/CMakeLists.txt b/media/baseset/orig_extra/CMakeLists.txt index f865a8dd0d..36a25329f5 100644 --- a/media/baseset/orig_extra/CMakeLists.txt +++ b/media/baseset/orig_extra/CMakeLists.txt @@ -3,12 +3,12 @@ # This is mainly because not many people have both of these tools installed, # so it is cheaper to cache them in git, and only regenerate when you are # working on it / have the tools installed. -if (NFORENUM_FOUND AND GRFCODEC_FOUND) - include(CreateGrfCommand REQUIRED) +if (GRFCODEC_FOUND) + include(CreateGrfCommand) create_grf_command( # We share some files with 'openttd' grf ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/airports.png ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/canals.png ${CMAKE_CURRENT_SOURCE_DIR}/../openttd/chars.png ) -endif (NFORENUM_FOUND AND GRFCODEC_FOUND) +endif (GRFCODEC_FOUND) diff --git a/os/windows/openttd.manifest b/os/windows/openttd.manifest new file mode 100644 index 0000000000..ee1c7ea224 --- /dev/null +++ b/os/windows/openttd.manifest @@ -0,0 +1,29 @@ + + + + + + + + + + + + True/PM + + + + + + + + + + + + + + + + + diff --git a/src/3rdparty/CMakeLists.txt b/src/3rdparty/CMakeLists.txt new file mode 100644 index 0000000000..e3927fa217 --- /dev/null +++ b/src/3rdparty/CMakeLists.txt @@ -0,0 +1,3 @@ +add_subdirectory(md5) +add_subdirectory(squirrel) +add_subdirectory(os2) diff --git a/src/3rdparty/md5/CMakeLists.txt b/src/3rdparty/md5/CMakeLists.txt new file mode 100644 index 0000000000..58720ca2d6 --- /dev/null +++ b/src/3rdparty/md5/CMakeLists.txt @@ -0,0 +1,4 @@ +add_files( + md5.cpp + md5.h +) diff --git a/src/3rdparty/os2/CMakeLists.txt b/src/3rdparty/os2/CMakeLists.txt new file mode 100644 index 0000000000..8edc63479e --- /dev/null +++ b/src/3rdparty/os2/CMakeLists.txt @@ -0,0 +1,7 @@ +add_files( + getaddrinfo.c + getaddrinfo.h + getnameinfo.c + getnameinfo.h + CONDITION OPTION_OS2 +) diff --git a/src/3rdparty/squirrel/CMakeLists.txt b/src/3rdparty/squirrel/CMakeLists.txt new file mode 100644 index 0000000000..9602087cdf --- /dev/null +++ b/src/3rdparty/squirrel/CMakeLists.txt @@ -0,0 +1,3 @@ +add_subdirectory(include) +add_subdirectory(sqstdlib) +add_subdirectory(squirrel) diff --git a/src/3rdparty/squirrel/include/CMakeLists.txt b/src/3rdparty/squirrel/include/CMakeLists.txt new file mode 100644 index 0000000000..5237360d31 --- /dev/null +++ b/src/3rdparty/squirrel/include/CMakeLists.txt @@ -0,0 +1,6 @@ +add_files( + sqstdaux.h + sqstdmath.h + sqstdstring.h + squirrel.h +) diff --git a/src/3rdparty/squirrel/sqstdlib/CMakeLists.txt b/src/3rdparty/squirrel/sqstdlib/CMakeLists.txt new file mode 100644 index 0000000000..2b3bd6bb31 --- /dev/null +++ b/src/3rdparty/squirrel/sqstdlib/CMakeLists.txt @@ -0,0 +1,4 @@ +add_files( + sqstdaux.cpp + sqstdmath.cpp +) diff --git a/src/3rdparty/squirrel/squirrel/CMakeLists.txt b/src/3rdparty/squirrel/squirrel/CMakeLists.txt new file mode 100644 index 0000000000..a86a92b7dd --- /dev/null +++ b/src/3rdparty/squirrel/squirrel/CMakeLists.txt @@ -0,0 +1,30 @@ +add_files( + sqapi.cpp + sqarray.h + sqbaselib.cpp + sqclass.cpp + sqclass.h + sqclosure.h + sqcompiler.cpp + sqcompiler.h + sqdebug.cpp + sqfuncproto.h + sqfuncstate.cpp + sqfuncstate.h + sqlexer.cpp + sqlexer.h + sqmem.cpp + sqobject.cpp + sqobject.h + sqopcodes.h + sqpcheader.h + sqstate.cpp + sqstate.h + sqstring.h + sqtable.cpp + sqtable.h + squserdata.h + squtils.h + sqvm.cpp + sqvm.h +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..0ccf650abf --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,479 @@ +add_subdirectory(3rdparty) +add_subdirectory(ai) +add_subdirectory(blitter) +add_subdirectory(core) +add_subdirectory(game) +add_subdirectory(lang) +add_subdirectory(linkgraph) +add_subdirectory(misc) +add_subdirectory(music) +add_subdirectory(network) +add_subdirectory(os) +add_subdirectory(pathfinder) +add_subdirectory(saveload) +add_subdirectory(script) +add_subdirectory(settingsgen) +add_subdirectory(sound) +add_subdirectory(spriteloader) +add_subdirectory(strgen) +add_subdirectory(table) +add_subdirectory(video) +add_subdirectory(widgets) + +add_files( + viewport_sprite_sorter_sse4.cpp + CONDITION SSE_FOUND +) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set_compile_flags( + viewport_sprite_sorter_sse4.cpp + COMPILE_FLAGS -msse4.1) +endif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + +add_files( + aircraft.h + aircraft_cmd.cpp + aircraft_gui.cpp + airport.cpp + airport.h + airport_gui.cpp + animated_tile.cpp + animated_tile_func.h + articulated_vehicles.cpp + articulated_vehicles.h + autoreplace.cpp + autoreplace_base.h + autoreplace_cmd.cpp + autoreplace_func.h + autoreplace_gui.cpp + autoreplace_gui.h + autoreplace_type.h + autoslope.h + base_consist.cpp + base_consist.h + base_media_base.h + base_media_func.h + base_station_base.h + bitmap_type.h + bmp.cpp + bmp.h + bootstrap_gui.cpp + bridge.h + bridge_gui.cpp + bridge_map.cpp + bridge_map.h + build_vehicle_gui.cpp + cargo_type.h + cargoaction.cpp + cargoaction.h + cargomonitor.cpp + cargomonitor.h + cargopacket.cpp + cargopacket.h + cargotype.cpp + cargotype.h + cheat.cpp + cheat_func.h + cheat_gui.cpp + cheat_type.h + clear_cmd.cpp + clear_func.h + clear_map.h + cmd_helper.h + command.cpp + command_func.h + command_type.h + company_base.h + company_cmd.cpp + company_func.h + company_gui.cpp + company_gui.h + company_manager_face.h + company_type.h + console.cpp + console_cmds.cpp + console_func.h + console_gui.cpp + console_gui.h + console_internal.h + console_type.h + cpu.cpp + cpu.h + crashlog.cpp + crashlog.h + currency.cpp + currency.h + date.cpp + date_func.h + date_gui.cpp + date_gui.h + date_type.h + debug.cpp + debug.h + dedicated.cpp + depot.cpp + depot_base.h + depot_cmd.cpp + depot_func.h + depot_gui.cpp + depot_map.h + depot_type.h + direction_func.h + direction_type.h + disaster_vehicle.cpp + disaster_vehicle.h + dock_gui.cpp + driver.cpp + driver.h + economy.cpp + economy_base.h + economy_func.h + economy_type.h + effectvehicle.cpp + effectvehicle_base.h + effectvehicle_func.h + elrail.cpp + elrail_func.h + engine.cpp + engine_base.h + engine_func.h + engine_gui.cpp + engine_gui.h + engine_type.h + error.h + error_gui.cpp + fileio.cpp + fileio_func.h + fileio_type.h + fios.cpp + fios.h + fios_gui.cpp + fontcache.cpp + fontcache.h + fontdetection.cpp + fontdetection.h + framerate_gui.cpp + framerate_type.h + gamelog.cpp + gamelog.h + gamelog_internal.h + genworld.cpp + genworld.h + genworld_gui.cpp + gfx.cpp + gfx_func.h + gfx_layout.cpp + gfx_layout.h + gfx_type.h + gfxinit.cpp + gfxinit.h + goal.cpp + goal_base.h + goal_gui.cpp + goal_type.h + graph_gui.cpp + graph_gui.h + ground_vehicle.cpp + ground_vehicle.hpp + group.h + group_cmd.cpp + group_gui.cpp + group_gui.h + group_type.h + gui.h + guitimer_func.h + heightmap.cpp + heightmap.h + highscore.cpp + highscore.h + highscore_gui.cpp + hotkeys.cpp + hotkeys.h + house.h + house_type.h + industry.h + industry_cmd.cpp + industry_gui.cpp + industry_map.h + industry_type.h + industrytype.h + ini.cpp + ini_load.cpp + ini_type.h + intro_gui.cpp + landscape.cpp + landscape.h + landscape_type.h + language.h + livery.h + main_gui.cpp + map.cpp + map_func.h + map_type.h + misc.cpp + misc_cmd.cpp + misc_gui.cpp + mixer.cpp + mixer.h + music.cpp + music_gui.cpp + newgrf.cpp + newgrf.h + newgrf_airport.cpp + newgrf_airport.h + newgrf_airporttiles.cpp + newgrf_airporttiles.h + newgrf_animation_base.h + newgrf_animation_type.h + newgrf_callbacks.h + newgrf_canal.cpp + newgrf_canal.h + newgrf_cargo.cpp + newgrf_cargo.h + newgrf_class.h + newgrf_class_func.h + newgrf_commons.cpp + newgrf_commons.h + newgrf_config.cpp + newgrf_config.h + newgrf_debug.h + newgrf_debug_gui.cpp + newgrf_engine.cpp + newgrf_engine.h + newgrf_generic.cpp + newgrf_generic.h + newgrf_gui.cpp + newgrf_house.cpp + newgrf_house.h + newgrf_industries.cpp + newgrf_industries.h + newgrf_industrytiles.cpp + newgrf_industrytiles.h + newgrf_object.cpp + newgrf_object.h + newgrf_profiling.cpp + newgrf_profiling.h + newgrf_properties.h + newgrf_railtype.cpp + newgrf_railtype.h + newgrf_roadtype.cpp + newgrf_roadtype.h + newgrf_sound.cpp + newgrf_sound.h + newgrf_spritegroup.cpp + newgrf_spritegroup.h + newgrf_station.cpp + newgrf_station.h + newgrf_storage.cpp + newgrf_storage.h + newgrf_text.cpp + newgrf_text.h + newgrf_town.cpp + newgrf_town.h + newgrf_townname.cpp + newgrf_townname.h + news_func.h + news_gui.cpp + news_gui.h + news_type.h + object.h + object_base.h + object_cmd.cpp + object_gui.cpp + object_map.h + object_type.h + openttd.cpp + openttd.h + order_backup.cpp + order_backup.h + order_base.h + order_cmd.cpp + order_func.h + order_gui.cpp + order_type.h + osk_gui.cpp + pbs.cpp + pbs.h + progress.cpp + progress.h + querystring_gui.h + rail.cpp + rail.h + rail_cmd.cpp + rail_gui.cpp + rail_gui.h + rail_map.h + rail_type.h + rev.h + road.cpp + road.h + road_cmd.cpp + road_cmd.h + road_func.h + road_gui.cpp + road_gui.h + road_internal.h + road_map.cpp + road_map.h + road_type.h + roadstop.cpp + roadstop_base.h + roadveh.h + roadveh_cmd.cpp + roadveh_gui.cpp + safeguards.h + screenshot_gui.cpp + screenshot_gui.h + screenshot.cpp + screenshot.h + settings.cpp + settings_func.h + settings_gui.cpp + settings_gui.h + settings_internal.h + settings_type.h + ship.h + ship_cmd.cpp + ship_gui.cpp + signal.cpp + signal_func.h + signal_type.h + signs.cpp + signs_base.h + signs_cmd.cpp + signs_func.h + signs_gui.cpp + signs_type.h + slope_func.h + slope_type.h + smallmap_gui.cpp + smallmap_gui.h + sortlist_type.h + sound.cpp + sound_func.h + sound_type.h + sprite.cpp + sprite.h + spritecache.cpp + spritecache.h + station.cpp + station_base.h + station_cmd.cpp + station_func.h + station_gui.cpp + station_gui.h + station_kdtree.h + station_map.h + station_type.h + statusbar_gui.cpp + statusbar_gui.h + stdafx.h + story.cpp + story_base.h + story_gui.cpp + story_type.h + strgen/strgen.h + string.cpp + string_base.h + string_func.h + string_type.h + stringfilter.cpp + stringfilter_type.h + strings.cpp + strings_func.h + strings_type.h + subsidy.cpp + subsidy_base.h + subsidy_func.h + subsidy_gui.cpp + subsidy_type.h + tar_type.h + terraform_cmd.cpp + terraform_gui.cpp + terraform_gui.h + textbuf.cpp + textbuf_gui.h + textbuf_type.h + texteff.cpp + texteff.hpp + textfile_gui.cpp + textfile_gui.h + textfile_type.h + tgp.cpp + tgp.h + thread.h + tile_cmd.h + tile_map.cpp + tile_map.h + tile_type.h + tilearea.cpp + tilearea_type.h + tilehighlight_func.h + tilehighlight_type.h + tilematrix_type.hpp + timetable.h + timetable_cmd.cpp + timetable_gui.cpp + toolbar_gui.cpp + toolbar_gui.h + town.h + town_cmd.cpp + town_gui.cpp + town_kdtree.h + town_map.h + town_type.h + townname.cpp + townname_func.h + townname_type.h + track_func.h + track_type.h + train.h + train_cmd.cpp + train_gui.cpp + transparency.h + transparency_gui.cpp + transparency_gui.h + transport_type.h + tree_cmd.cpp + tree_gui.cpp + tree_map.h + tunnel_map.cpp + tunnel_map.h + tunnelbridge.h + tunnelbridge_cmd.cpp + tunnelbridge_map.h + vehicle.cpp + vehicle_base.h + vehicle_cmd.cpp + vehicle_func.h + vehicle_gui.cpp + vehicle_gui.h + vehicle_gui_base.h + vehicle_type.h + vehiclelist.cpp + vehiclelist.h + viewport.cpp + viewport_func.h + viewport_gui.cpp + viewport_kdtree.h + viewport_sprite_sorter.h + viewport_type.h + void_cmd.cpp + void_map.h + water.h + water_cmd.cpp + water_map.h + waypoint.cpp + waypoint_base.h + waypoint_cmd.cpp + waypoint_func.h + waypoint_gui.cpp + widget.cpp + widget_type.h + window.cpp + window_func.h + window_gui.h + window_type.h + zoom_func.h + zoom_type.h +) diff --git a/src/ai/CMakeLists.txt b/src/ai/CMakeLists.txt new file mode 100644 index 0000000000..cab886b265 --- /dev/null +++ b/src/ai/CMakeLists.txt @@ -0,0 +1,14 @@ +add_files( + ai.hpp + ai_config.cpp + ai_config.hpp + ai_core.cpp + ai_gui.cpp + ai_gui.hpp + ai_info.cpp + ai_info.hpp + ai_instance.cpp + ai_instance.hpp + ai_scanner.cpp + ai_scanner.hpp +) diff --git a/src/blitter/CMakeLists.txt b/src/blitter/CMakeLists.txt new file mode 100644 index 0000000000..2abe6aec0e --- /dev/null +++ b/src/blitter/CMakeLists.txt @@ -0,0 +1,55 @@ +add_files( + 32bpp_anim.cpp + 32bpp_anim.hpp + 32bpp_base.cpp + 32bpp_base.hpp + 32bpp_optimized.cpp + 32bpp_optimized.hpp + 32bpp_simple.cpp + 32bpp_simple.hpp + 8bpp_base.cpp + 8bpp_base.hpp + 8bpp_optimized.cpp + 8bpp_optimized.hpp + 8bpp_simple.cpp + 8bpp_simple.hpp + CONDITION NOT OPTION_DEDICATED +) + +add_files( + 32bpp_anim_sse2.cpp + 32bpp_anim_sse2.hpp + 32bpp_anim_sse4.cpp + 32bpp_anim_sse4.hpp + 32bpp_sse2.cpp + 32bpp_sse2.hpp + 32bpp_sse4.cpp + 32bpp_sse4.hpp + 32bpp_sse_func.hpp + 32bpp_sse_type.h + 32bpp_ssse3.cpp + 32bpp_ssse3.hpp + CONDITION NOT OPTION_DEDICATED AND SSE_FOUND +) + +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set_compile_flags( + 32bpp_anim_sse2.cpp + 32bpp_sse2.cpp + COMPILE_FLAGS -msse2) + set_compile_flags( + 32bpp_ssse3.cpp + COMPILE_FLAGS -mssse3) + set_compile_flags( + 32bpp_anim_sse4.cpp + 32bpp_sse4.cpp + COMPILE_FLAGS -msse4.1) +endif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + +add_files( + base.hpp + common.hpp + factory.hpp + null.cpp + null.hpp +) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt new file mode 100644 index 0000000000..96da089326 --- /dev/null +++ b/src/core/CMakeLists.txt @@ -0,0 +1,30 @@ +add_files( + alloc_func.cpp + alloc_func.hpp + alloc_type.hpp + backup_type.hpp + bitmath_func.cpp + bitmath_func.hpp + endian_func.hpp + endian_type.hpp + enum_type.hpp + geometry_func.cpp + geometry_func.hpp + geometry_type.hpp + kdtree.hpp + math_func.cpp + math_func.hpp + mem_func.hpp + multimap.hpp + overflowsafe_type.hpp + pool_func.cpp + pool_func.hpp + pool_type.hpp + random_func.cpp + random_func.hpp + smallmap_type.hpp + smallmatrix_type.hpp + smallstack_type.hpp + smallvec_type.hpp + string_compare_type.hpp +) diff --git a/src/core/endian_type.hpp b/src/core/endian_type.hpp index 1b927ef45a..e1add251ed 100644 --- a/src/core/endian_type.hpp +++ b/src/core/endian_type.hpp @@ -23,30 +23,8 @@ /** Big endian builds use this for TTD_ENDIAN. */ #define TTD_BIG_ENDIAN 1 -/* Windows has always LITTLE_ENDIAN */ -#if defined(_WIN32) || defined(__OS2__) || defined(__HAIKU__) -# define TTD_ENDIAN TTD_LITTLE_ENDIAN -#elif defined(OSX) -# include -# if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN -# define TTD_ENDIAN TTD_LITTLE_ENDIAN -# else -# define TTD_ENDIAN TTD_BIG_ENDIAN -# endif -#elif defined(__OpenBSD__) -# include -# if BYTE_ORDER == LITTLE_ENDIAN -# define TTD_ENDIAN TTD_LITTLE_ENDIAN -# else -# define TTD_ENDIAN TTD_BIG_ENDIAN -# endif -#elif !defined(TESTING) -# include -# if __BYTE_ORDER == __LITTLE_ENDIAN -# define TTD_ENDIAN TTD_LITTLE_ENDIAN -# else -# define TTD_ENDIAN TTD_BIG_ENDIAN -# endif -#endif /* _WIN32 || __OS2__ */ +#if !defined(TTD_ENDIAN) +# error "TTD_ENDIAN is not defined; please set it to either TTD_LITTLE_ENDIAN or TTD_BIG_ENDIAN" +#endif /* !TTD_ENDIAN */ #endif /* ENDIAN_TYPE_HPP */ diff --git a/src/depend/depend.cpp b/src/depend/depend.cpp deleted file mode 100644 index 5a3bd868de..0000000000 --- a/src/depend/depend.cpp +++ /dev/null @@ -1,1084 +0,0 @@ -/* - * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. - * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - */ - -/** - * @file depend/depend.cpp Custom implementation of Makedepend. - * - * We previously used makedepend, but that could not handle the amount of - * files we have and does not handle conditional includes in a sane manner. - * This caused many link problems because not enough files were recompiled. - * This has lead to the development of our own dependency generator. It is - * meant to be a substitute to the (relatively slow) dependency generation - * via gcc. It thus helps speeding up compilation. It will also ignore - * system headers making it less error prone when system headers are moved - * or renamed. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * Return the length of an fixed size array. - * Unlike sizeof this function returns the number of elements - * of the given type. - * - * @param x The pointer to the first element of the array - * @return The number of elements - */ -#define lengthof(x) (sizeof(x) / sizeof(x[0])) - -/** - * Get the last element of an fixed size array. - * - * @param x The pointer to the first element of the array - * @return The pointer to the last element of the array - */ -#define lastof(x) (&x[lengthof(x) - 1]) - -/** - * Copies characters from one buffer to another. - * - * Copies the source string to the destination buffer with respect of the - * terminating null-character and the last pointer to the last element in - * the destination buffer. If the last pointer is set to nullptr no boundary - * check is performed. - * - * @note usage: strecpy(dst, src, lastof(dst)); - * @note lastof() applies only to fixed size arrays - * - * @param dst The destination buffer - * @param src The buffer containing the string to copy - * @param last The pointer to the last element of the destination buffer - * @return The pointer to the terminating null-character in the destination buffer - */ -char *strecpy(char *dst, const char *src, const char *last) -{ - assert(dst <= last); - while (dst != last && *src != '\0') { - *dst++ = *src++; - } - *dst = '\0'; - - if (dst == last && *src != '\0') { - fprintf(stderr, "String too long for destination buffer\n"); - exit(-3); - } - return dst; -} - -/** - * Appends characters from one string to another. - * - * Appends the source string to the destination string with respect of the - * terminating null-character and and the last pointer to the last element - * in the destination buffer. If the last pointer is set to nullptr no - * boundary check is performed. - * - * @note usage: strecat(dst, src, lastof(dst)); - * @note lastof() applies only to fixed size arrays - * - * @param dst The buffer containing the target string - * @param src The buffer containing the string to append - * @param last The pointer to the last element of the destination buffer - * @return The pointer to the terminating null-character in the destination buffer - */ -static char *strecat(char *dst, const char *src, const char *last) -{ - assert(dst <= last); - while (*dst != '\0') { - if (dst == last) return dst; - dst++; - } - - return strecpy(dst, src, last); -} - -#if defined(__CYGWIN__) -/** - * Version of strdup copied from glibc. - * Duplicate S, returning an identical malloc'd string. - * @param s The string to duplicate. - */ -char * -strdup (const char *s) -{ - size_t len = strlen(s) + 1; - void *n = malloc(len); - - if (n == NULL) return NULL; - return (char *) memcpy(n, s, len); -} -#endif - -/** - * Version of the standard free that accepts const pointers. - * @param ptr The data to free. - */ -static inline void free(const void *ptr) -{ - free(const_cast(ptr)); -} - -#ifndef PATH_MAX -/** The maximum length of paths, if we don't know it. */ -# define PATH_MAX 260 -#endif - -/** Simple string comparator using strcmp as implementation */ -struct StringCompare { - /** - * Compare a to b using strcmp. - * @param a string to compare. - * @param b string to compare. - * @return whether a is less than b. - */ - bool operator () (const char *a, const char *b) const - { - return strcmp(a, b) < 0; - } -}; -/** Set of C-style strings. */ -typedef std::set StringSet; -/** Mapping of C-style string to a set of C-style strings. */ -typedef std::map StringMap; -/** Pair of C-style string and a set of C-style strings. */ -typedef std::pair StringMapItem; - -/** Include directory to search in. */ -static StringSet _include_dirs; -/** Files that have been parsed/handled with their dependencies. */ -static StringMap _files; -/** Dependencies of headers. */ -static StringMap _headers; -/** The current 'active' defines. */ -static StringSet _defines; - -/** - * Helper class to read a file. - */ -class File { -public: - /** - * Create the helper by opening the given file. - * @param filename the file to open - * @post the file is open; otherwise the application is killed. - */ - File(const char *filename) - { - this->fp = fopen(filename, "r"); - if (this->fp == nullptr) { - fprintf(stdout, "Could not open %s for reading\n", filename); - exit(1); - } - this->dirname = strdup(filename); - char *last = strrchr(this->dirname, '/'); - if (last != nullptr) { - *last = '\0'; - } else { - *this->dirname = '\0'; - } - } - - /** Free everything we have allocated. */ - ~File() - { - fclose(this->fp); - free(this->dirname); - } - - /** - * Get a single character from the file. - * If we are reading beyond the end of the file '\0' is returned. - * @return the read character. - */ - char GetChar() const - { - int c = fgetc(this->fp); - return (c == EOF) ? '\0' : c; - } - - /** - * Get the directory name of the file. - * @return the directory name. - */ - const char *GetDirname() const - { - return this->dirname; - } - -private: - FILE *fp; ///< The currently opened file. - char *dirname; ///< The directory of the file. -}; - -/** A token returned by the tokenizer. */ -enum Token { - TOKEN_UNKNOWN, ///< Unknown token - TOKEN_END, ///< End of document - TOKEN_EOL, ///< End of line - TOKEN_SHARP, ///< # character, usually telling something important comes. - TOKEN_LOCAL, ///< Read a local include - TOKEN_GLOBAL, ///< Read a global include - TOKEN_IDENTIFIER, ///< Identifier within the data. - TOKEN_DEFINE, ///< \c \#define in code - TOKEN_IF, ///< \c \#if in code - TOKEN_IFDEF, ///< \c \#ifdef in code - TOKEN_IFNDEF, ///< \c \#ifndef in code - TOKEN_ELIF, ///< \c \#elif in code - TOKEN_ELSE, ///< \c \#else in code - TOKEN_ENDIF, ///< \c \#endif in code - TOKEN_UNDEF, ///< \c \#undef in code - TOKEN_OR, ///< '||' within \c \#if expression - TOKEN_AND, ///< '&&' within \c \#if expression - TOKEN_DEFINED, ///< 'defined' within \c \#if expression - TOKEN_OPEN, ///< '(' within \c \#if expression - TOKEN_CLOSE, ///< ')' within \c \#if expression - TOKEN_NOT, ///< '!' within \c \#if expression - TOKEN_ZERO, ///< '0' within \c \#if expression - TOKEN_INCLUDE, ///< \c \#include in code -}; - -/** Mapping from a C-style keyword representation to a Token. */ -typedef std::map KeywordList; - -/** - * Lexer of a file. - */ -class Lexer { -public: - /** - * Create the lexer and fill the keywords table. - * @param file the file to read from. - */ - Lexer(const File *file) : file(file), current_char('\0'), string(nullptr), token(TOKEN_UNKNOWN) - { - this->keywords["define"] = TOKEN_DEFINE; - this->keywords["defined"] = TOKEN_DEFINED; - this->keywords["if"] = TOKEN_IF; - this->keywords["ifdef"] = TOKEN_IFDEF; - this->keywords["ifndef"] = TOKEN_IFNDEF; - this->keywords["include"] = TOKEN_INCLUDE; - this->keywords["elif"] = TOKEN_ELIF; - this->keywords["else"] = TOKEN_ELSE; - this->keywords["endif"] = TOKEN_ENDIF; - this->keywords["undef"] = TOKEN_UNDEF; - - /* Initialise currently read character. */ - this->Next(); - - /* Allocate the buffer. */ - this->buf_len = 32; - this->buf = (char*)malloc(sizeof(*this->buf) * this->buf_len); - } - - /** Free everything */ - ~Lexer() - { - free(this->buf); - } - - /** - * Read the next character into 'current_char'. - */ - void Next() - { - this->current_char = this->file->GetChar(); - } - - /** - * Get the current token. - * @return the token. - */ - Token GetToken() const - { - return this->token; - } - - /** - * Read the currently processed string. - * @return the string, can be nullptr. - */ - const char *GetString() const - { - return this->string; - } - - /** - * Perform the lexing/tokenizing of the file till we can return something - * that must be parsed. - */ - void Lex() - { - for (;;) { - free(this->string); - this->string = nullptr; - this->token = TOKEN_UNKNOWN; - - switch (this->current_char) { - /* '\0' means End-Of-File */ - case '\0': this->token = TOKEN_END; return; - - /* Skip some chars, as they don't do anything */ - case '\t': this->Next(); break; - case '\r': this->Next(); break; - case ' ': this->Next(); break; - - case '\\': - this->Next(); - if (this->current_char == '\n') this->Next(); - break; - - case '\n': - this->token = TOKEN_EOL; - this->Next(); - return; - - case '#': - this->token = TOKEN_SHARP; - this->Next(); - return; - - case '"': - this->ReadString('"', TOKEN_LOCAL); - this->Next(); - return; - - case '<': - this->ReadString('>', TOKEN_GLOBAL); - this->Next(); - return; - - case '&': - this->Next(); - if (this->current_char == '&') { - this->Next(); - this->token = TOKEN_AND; - return; - } - break; - - case '|': - this->Next(); - if (this->current_char == '|') { - this->Next(); - this->token = TOKEN_OR; - return; - } - break; - - case '(': - this->Next(); - this->token = TOKEN_OPEN; - return; - - case ')': - this->Next(); - this->token = TOKEN_CLOSE; - return; - - case '!': - this->Next(); - if (this->current_char != '=') { - this->token = TOKEN_NOT; - return; - } - break; - - /* Possible begin of comment */ - case '/': - this->Next(); - switch (this->current_char) { - case '*': { - this->Next(); - char previous_char = '\0'; - while ((this->current_char != '/' || previous_char != '*') && this->current_char != '\0') { - previous_char = this->current_char; - this->Next(); - } - this->Next(); - break; - } - case '/': while (this->current_char != '\n' && this->current_char != '\0') this->Next(); break; - default: break; - } - break; - - default: - if (isalpha(this->current_char) || this->current_char == '_') { - /* If the name starts with a letter, it is an identifier */ - this->ReadIdentifier(); - return; - } - if (isdigit(this->current_char)) { - bool zero = this->current_char == '0'; - this->Next(); - if (this->current_char == 'x' || this->current_char == 'X') Next(); - while (isdigit(this->current_char) || this->current_char == '.' || (this->current_char >= 'a' && this->current_char <= 'f') || (this->current_char >= 'A' && this->current_char <= 'F')) { - zero &= this->current_char == '0'; - this->Next(); - } - if (zero) this->token = TOKEN_ZERO; - return; - } - this->Next(); - break; - } - } - } - -private: - /** - * The token based on keyword with a given name. - * @param name the actual keyword. - * @return the token of the keyword. - */ - Token FindKeyword(const char *name) const - { - KeywordList::const_iterator it = this->keywords.find(name); - if (it == this->keywords.end()) return TOKEN_IDENTIFIER; - return (*it).second; - } - - /** - * Read an identifier. - */ - void ReadIdentifier() - { - size_t count = 0; - - /* Read the rest of the identifier */ - do { - this->buf[count++] = this->current_char; - this->Next(); - - if (count >= buf_len) { - /* Scale the buffer if required */ - this->buf_len *= 2; - this->buf = (char *)realloc(this->buf, sizeof(*this->buf) * this->buf_len); - } - } while ((isalpha(this->current_char) || this->current_char == '_' || isdigit(this->current_char))); - this->buf[count] = '\0'; - - free(this->string); - this->string = strdup(this->buf); - this->token = FindKeyword(this->string); - } - - /** - * Read a string up to a given character, then set the given token. - * @param end the 'marker' for the end of the string. - * @param token the token to set after returning. - */ - void ReadString(char end, Token token) - { - size_t count = 0; - this->Next(); - while (this->current_char != end && this->current_char != ')' && this->current_char != '\n' && this->current_char != '\0') { - this->buf[count++] = this->current_char; - this->Next(); - - if (count >= this->buf_len) { - /* Scale the buffer if required */ - this->buf_len *= 2; - this->buf = (char *)realloc(this->buf, sizeof(*this->buf) * this->buf_len); - } - } - this->buf[count] = '\0'; - free(this->string); - this->string = strdup(this->buf); - this->token = token; - } - - const File *file; ///< The file to read from. - char current_char; ///< The current character to process. - char *string; ///< Currently processed string. - Token token; ///< The current token to process. - char *buf; ///< Temporary buffer. - size_t buf_len; ///< Length of the temporary buffer. - KeywordList keywords; ///< All keywords we know of. -}; - -/** - * Generate a path from a directory name and a relative filename. - * If the file is not local the include directory names will be used instead - * of the passed parameter with directory name. If the file is local both will - * be queried where the parameter takes precedence. - * @param dirname the directory to look in. - * @param filename the file to look for. - * @param local whether to look locally (in dirname) for the file. - * @return the absolute path, or nullptr if the file doesn't exist. - */ -const char *GeneratePath(const char *dirname, const char *filename, bool local) -{ - /* Ignore C++ standard library headers. */ - if (strchr(filename, '.') == nullptr) return nullptr; - - if (local) { - if (access(filename, R_OK) == 0) return strdup(filename); - - char path[PATH_MAX]; - strecpy(path, dirname, lastof(path)); - const char *p = filename; - /* Remove '..' from the begin of the filename. */ - while (*p == '.') { - if (*(++p) == '.') { - char *s = strrchr(path, '/'); - if (s != nullptr) *s = '\0'; - p += 2; - } - } - strecat(path, "/", lastof(path)); - strecat(path, p, lastof(path)); - - if (access(path, R_OK) == 0) return strdup(path); - } - - for (StringSet::iterator it = _include_dirs.begin(); it != _include_dirs.end(); it++) { - char path[PATH_MAX]; - strecpy(path, *it, lastof(path)); - const char *p = filename; - /* Remove '..' from the begin of the filename. */ - while (*p == '.') { - if (*(++p) == '.') { - char *s = strrchr(path, '/'); - if (s != nullptr) *s = '\0'; - p += 2; - } - } - strecat(path, "/", lastof(path)); - strecat(path, p, lastof(path)); - - if (access(path, R_OK) == 0) return strdup(path); - } - - return nullptr; -} - -/** - * Try to parse a 'defined(expr)' expression. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionDefined(Lexer *lexer, StringSet *defines, bool verbose); - -/** - * Try to parse a 'expr || expr' expression. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionOr(Lexer *lexer, StringSet *defines, bool verbose); - -/** - * Try to parse a '!expr' expression. Also parses the '(expr)', '0' and - * identifiers. Finally it also consumes any unknown tokens. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionNot(Lexer *lexer, StringSet *defines, bool verbose) -{ - if (lexer->GetToken() == TOKEN_NOT) { - if (verbose) fprintf(stderr, "!"); - lexer->Lex(); - bool value = !ExpressionDefined(lexer, defines, verbose); - if (verbose) fprintf(stderr, "[%d]", value); - return value; - } - - if (lexer->GetToken() == TOKEN_OPEN) { - if (verbose) fprintf(stderr, "("); - lexer->Lex(); - bool value = ExpressionOr(lexer, defines, verbose); - if (verbose) fprintf(stderr, ")[%d]", value); - lexer->Lex(); - return value; - } - - if (lexer->GetToken() == TOKEN_ZERO) { - if (verbose) fprintf(stderr, "0"); - lexer->Lex(); - if (verbose) fprintf(stderr, "[0]"); - return false; - } - - bool first = true; - while (lexer->GetToken() == TOKEN_UNKNOWN || lexer->GetToken() == TOKEN_IDENTIFIER) { - if (verbose && first) fprintf(stderr, ""); - first = false; - lexer->Lex(); - } - - return true; -} - -/** - * Try to parse a 'defined(expr)' expression. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionDefined(Lexer *lexer, StringSet *defines, bool verbose) -{ - bool value = ExpressionNot(lexer, defines, verbose); - - if (lexer->GetToken() != TOKEN_DEFINED) return value; - lexer->Lex(); - if (verbose) fprintf(stderr, "defined"); - bool open = (lexer->GetToken() == TOKEN_OPEN); - if (open) lexer->Lex(); - if (verbose) fprintf(stderr, open ? "(" : " "); - if (lexer->GetToken() == TOKEN_IDENTIFIER) { - if (verbose) fprintf(stderr, "%s", lexer->GetString()); - value = defines->find(lexer->GetString()) != defines->end(); - } - if (open) { - if (verbose) fprintf(stderr, ")"); - lexer->Lex(); - } - lexer->Lex(); - if (verbose) fprintf(stderr, "[%d]", value); - return value; -} - -/** - * Try to parse a 'expr && expr' expression. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionAnd(Lexer *lexer, StringSet *defines, bool verbose) -{ - bool value = ExpressionDefined(lexer, defines, verbose); - - for (;;) { - if (lexer->GetToken() != TOKEN_AND) return value; - if (verbose) fprintf(stderr, " && "); - lexer->Lex(); - value = value && ExpressionDefined(lexer, defines, verbose); - } -} - -/** - * Try to parse a 'expr || expr' expression. - * @param lexer the lexer to get tokens from. - * @param defines the set of known defines. - * @param verbose whether to give verbose debugging information. - * @return the value of the expression. - */ -bool ExpressionOr(Lexer *lexer, StringSet *defines, bool verbose) -{ - bool value = ExpressionAnd(lexer, defines, verbose); - - for (;;) { - if (lexer->GetToken() != TOKEN_OR) return value; - if (verbose) fprintf(stderr, " || "); - lexer->Lex(); - value = value || ExpressionAnd(lexer, defines, verbose); - } -} - -/** Enumerator to tell how long to ignore 'stuff'. */ -enum Ignore { - NOT_IGNORE, ///< No ignoring. - IGNORE_UNTIL_ELSE, ///< Ignore till a \c \#else is reached. - IGNORE_UNTIL_ENDIF, ///< Ignore till a \c \#endif is reached. -}; - -/** - * Scan a file for includes, defines and the lot. - * @param filename the name of the file to scan. - * @param ext the extension of the filename. - * @param header whether the file is a header or not. - * @param verbose whether to give verbose debugging information. - */ -void ScanFile(const char *filename, const char *ext, bool header, bool verbose) -{ - static StringSet defines; - static std::stack ignore; - /* Copy in the default defines (parameters of depend) */ - if (!header) { - for (StringSet::iterator it = _defines.begin(); it != _defines.end(); it++) { - defines.insert(strdup(*it)); - } - } - - File file(filename); - Lexer lexer(&file); - - /* Start the lexing! */ - lexer.Lex(); - - while (lexer.GetToken() != TOKEN_END) { - switch (lexer.GetToken()) { - /* We reached the end of the file... yay, we're done! */ - case TOKEN_END: break; - - /* The line started with a # (minus whitespace) */ - case TOKEN_SHARP: - lexer.Lex(); - switch (lexer.GetToken()) { - case TOKEN_INCLUDE: - if (verbose) fprintf(stderr, "%s #include ", filename); - lexer.Lex(); - switch (lexer.GetToken()) { - case TOKEN_LOCAL: - case TOKEN_GLOBAL: { - if (verbose) fprintf(stderr, "%s", lexer.GetString()); - if (!ignore.empty() && ignore.top() != NOT_IGNORE) { - if (verbose) fprintf(stderr, " (ignored)"); - break; - } - const char *h = GeneratePath(file.GetDirname(), lexer.GetString(), lexer.GetToken() == TOKEN_LOCAL); - if (h != nullptr) { - StringMap::iterator it = _headers.find(h); - if (it == _headers.end()) { - it = (_headers.insert(StringMapItem(strdup(h), new StringSet()))).first; - if (verbose) fprintf(stderr, "\n"); - ScanFile(h, ext, true, verbose); - } - StringMap::iterator curfile; - if (header) { - curfile = _headers.find(filename); - } else { - /* Replace the extension with the provided extension of '.o'. */ - char path[PATH_MAX]; - strecpy(path, filename, lastof(path)); - *(strrchr(path, '.')) = '\0'; - strecat(path, ext != nullptr ? ext : ".o", lastof(path)); - curfile = _files.find(path); - if (curfile == _files.end()) { - curfile = (_files.insert(StringMapItem(strdup(path), new StringSet()))).first; - } - } - if (it != _headers.end()) { - for (StringSet::iterator header = it->second->begin(); header != it->second->end(); header++) { - if (curfile->second->find(*header) == curfile->second->end()) curfile->second->insert(strdup(*header)); - } - } - if (curfile->second->find(h) == curfile->second->end()) curfile->second->insert(strdup(h)); - free(h); - } - } - /* FALL THROUGH */ - default: break; - } - break; - - case TOKEN_DEFINE: - if (verbose) fprintf(stderr, "%s #define ", filename); - lexer.Lex(); - if (lexer.GetToken() == TOKEN_IDENTIFIER) { - if (verbose) fprintf(stderr, "%s", lexer.GetString()); - if (!ignore.empty() && ignore.top() != NOT_IGNORE) { - if (verbose) fprintf(stderr, " (ignored)"); - break; - } - if (defines.find(lexer.GetString()) == defines.end()) defines.insert(strdup(lexer.GetString())); - lexer.Lex(); - } - break; - - case TOKEN_UNDEF: - if (verbose) fprintf(stderr, "%s #undef ", filename); - lexer.Lex(); - if (lexer.GetToken() == TOKEN_IDENTIFIER) { - if (verbose) fprintf(stderr, "%s", lexer.GetString()); - if (!ignore.empty() && ignore.top() != NOT_IGNORE) { - if (verbose) fprintf(stderr, " (ignored)"); - break; - } - StringSet::iterator it = defines.find(lexer.GetString()); - if (it != defines.end()) { - free(*it); - defines.erase(it); - } - lexer.Lex(); - } - break; - - case TOKEN_ENDIF: - if (verbose) fprintf(stderr, "%s #endif", filename); - lexer.Lex(); - if (!ignore.empty()) ignore.pop(); - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - - case TOKEN_ELSE: { - if (verbose) fprintf(stderr, "%s #else", filename); - lexer.Lex(); - Ignore last = ignore.empty() ? NOT_IGNORE : ignore.top(); - if (!ignore.empty()) ignore.pop(); - if (ignore.empty() || ignore.top() == NOT_IGNORE) { - ignore.push(last == IGNORE_UNTIL_ELSE ? NOT_IGNORE : IGNORE_UNTIL_ENDIF); - } else { - ignore.push(IGNORE_UNTIL_ENDIF); - } - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - } - - case TOKEN_ELIF: { - if (verbose) fprintf(stderr, "%s #elif ", filename); - lexer.Lex(); - Ignore last = ignore.empty() ? NOT_IGNORE : ignore.top(); - if (!ignore.empty()) ignore.pop(); - if (ignore.empty() || ignore.top() == NOT_IGNORE) { - bool value = ExpressionOr(&lexer, &defines, verbose); - ignore.push(last == IGNORE_UNTIL_ELSE ? (value ? NOT_IGNORE : IGNORE_UNTIL_ELSE) : IGNORE_UNTIL_ENDIF); - } else { - ignore.push(IGNORE_UNTIL_ENDIF); - } - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - } - - case TOKEN_IF: { - if (verbose) fprintf(stderr, "%s #if ", filename); - lexer.Lex(); - if (ignore.empty() || ignore.top() == NOT_IGNORE) { - bool value = ExpressionOr(&lexer, &defines, verbose); - ignore.push(value ? NOT_IGNORE : IGNORE_UNTIL_ELSE); - } else { - ignore.push(IGNORE_UNTIL_ENDIF); - } - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - } - - case TOKEN_IFDEF: - if (verbose) fprintf(stderr, "%s #ifdef ", filename); - lexer.Lex(); - if (lexer.GetToken() == TOKEN_IDENTIFIER) { - bool value = defines.find(lexer.GetString()) != defines.end(); - if (verbose) fprintf(stderr, "%s[%d]", lexer.GetString(), value); - if (ignore.empty() || ignore.top() == NOT_IGNORE) { - ignore.push(value ? NOT_IGNORE : IGNORE_UNTIL_ELSE); - } else { - ignore.push(IGNORE_UNTIL_ENDIF); - } - } - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - - case TOKEN_IFNDEF: - if (verbose) fprintf(stderr, "%s #ifndef ", filename); - lexer.Lex(); - if (lexer.GetToken() == TOKEN_IDENTIFIER) { - bool value = defines.find(lexer.GetString()) != defines.end(); - if (verbose) fprintf(stderr, "%s[%d]", lexer.GetString(), value); - if (ignore.empty() || ignore.top() == NOT_IGNORE) { - ignore.push(!value ? NOT_IGNORE : IGNORE_UNTIL_ELSE); - } else { - ignore.push(IGNORE_UNTIL_ENDIF); - } - } - if (verbose) fprintf(stderr, " -> %signore", (!ignore.empty() && ignore.top() != NOT_IGNORE) ? "" : "not "); - break; - - default: - if (verbose) fprintf(stderr, "%s #", filename); - lexer.Lex(); - break; - } - if (verbose) fprintf(stderr, "\n"); - /* FALL THROUGH */ - default: - /* Ignore the rest of the garbage on this line */ - while (lexer.GetToken() != TOKEN_EOL && lexer.GetToken() != TOKEN_END) lexer.Lex(); - lexer.Lex(); - break; - } - } - - if (!header) { - for (StringSet::iterator it = defines.begin(); it != defines.end(); it++) { - free(*it); - } - defines.clear(); - while (!ignore.empty()) ignore.pop(); - } -} - -/** - * Entry point. Arguably the most common function in all applications. - * @param argc the number of arguments. - * @param argv the actual arguments. - * @return return value for the caller to tell we succeed or not. - */ -int main(int argc, char *argv[]) -{ - bool ignorenext = true; - char *filename = nullptr; - char *ext = nullptr; - char *delimiter = nullptr; - bool append = false; - bool verbose = false; - - for (int i = 0; i < argc; i++) { - if (ignorenext) { - ignorenext = false; - continue; - } - if (argv[i][0] == '-') { - /* Append */ - if (strncmp(argv[i], "-a", 2) == 0) append = true; - /* Include dir */ - if (strncmp(argv[i], "-I", 2) == 0) { - if (argv[i][2] == '\0') { - i++; - _include_dirs.insert(strdup(argv[i])); - } else { - _include_dirs.insert(strdup(&argv[i][2])); - } - continue; - } - /* Define */ - if (strncmp(argv[i], "-D", 2) == 0) { - char *p = strchr(argv[i], '='); - if (p != nullptr) *p = '\0'; - _defines.insert(strdup(&argv[i][2])); - continue; - } - /* Output file */ - if (strncmp(argv[i], "-f", 2) == 0) { - if (filename != nullptr) continue; - filename = strdup(&argv[i][2]); - continue; - } - /* Object file extension */ - if (strncmp(argv[i], "-o", 2) == 0) { - if (ext != nullptr) continue; - ext = strdup(&argv[i][2]); - continue; - } - /* Starting string delimiter */ - if (strncmp(argv[i], "-s", 2) == 0) { - if (delimiter != nullptr) continue; - delimiter = strdup(&argv[i][2]); - continue; - } - /* Verbose */ - if (strncmp(argv[i], "-v", 2) == 0) verbose = true; - continue; - } - ScanFile(argv[i], ext, false, verbose); - } - - /* Default output file is Makefile */ - if (filename == nullptr) filename = strdup("Makefile"); - - /* Default delimiter string */ - if (delimiter == nullptr) delimiter = strdup("# DO NOT DELETE"); - - char backup[PATH_MAX]; - strecpy(backup, filename, lastof(backup)); - strecat(backup, ".bak", lastof(backup)); - - char *content = nullptr; - long size = 0; - - /* Read in the current file; so we can overwrite everything from the - * end of non-depend data marker down till the end. */ - FILE *src = fopen(filename, "rb"); - if (src != nullptr) { - fseek(src, 0, SEEK_END); - if ((size = ftell(src)) < 0) { - fprintf(stderr, "Could not read %s\n", filename); - exit(-2); - } - rewind(src); - content = (char*)malloc(size * sizeof(*content)); - if (fread(content, 1, size, src) != (size_t)size) { - fprintf(stderr, "Could not read %s\n", filename); - exit(-2); - } - fclose(src); - } - - FILE *dst = fopen(filename, "w"); - bool found_delimiter = false; - - if (size != 0) { - src = fopen(backup, "wb"); - if (fwrite(content, 1, size, src) != (size_t)size) { - fprintf(stderr, "Could not write %s\n", filename); - exit(-2); - } - fclose(src); - - /* Then append it to the real file. */ - src = fopen(backup, "r"); - while (fgets(content, size, src) != nullptr) { - fputs(content, dst); - if (!strncmp(content, delimiter, strlen(delimiter))) found_delimiter = true; - if (!append && found_delimiter) break; - } - fclose(src); - } - if (!found_delimiter) fprintf(dst, "\n%s\n", delimiter); - - for (StringMap::iterator it = _files.begin(); it != _files.end(); it++) { - for (StringSet::iterator h = it->second->begin(); h != it->second->end(); h++) { - fprintf(dst, "%s: %s\n", it->first, *h); - } - } - - /* Clean up our mess. */ - fclose(dst); - - free(delimiter); - free(filename); - free(ext); - free(content); - - for (StringMap::iterator it = _files.begin(); it != _files.end(); it++) { - for (StringSet::iterator h = it->second->begin(); h != it->second->end(); h++) { - free(*h); - } - it->second->clear(); - delete it->second; - free(it->first); - } - _files.clear(); - - for (StringMap::iterator it = _headers.begin(); it != _headers.end(); it++) { - for (StringSet::iterator h = it->second->begin(); h != it->second->end(); h++) { - free(*h); - } - it->second->clear(); - delete it->second; - free(it->first); - } - _headers.clear(); - - for (StringSet::iterator it = _defines.begin(); it != _defines.end(); it++) { - free(*it); - } - _defines.clear(); - - for (StringSet::iterator it = _include_dirs.begin(); it != _include_dirs.end(); it++) { - free(*it); - } - _include_dirs.clear(); - - return 0; -} diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt new file mode 100644 index 0000000000..aafb5a7b8d --- /dev/null +++ b/src/game/CMakeLists.txt @@ -0,0 +1,14 @@ +add_files( + game.hpp + game_config.cpp + game_config.hpp + game_core.cpp + game_info.cpp + game_info.hpp + game_instance.cpp + game_instance.hpp + game_scanner.cpp + game_scanner.hpp + game_text.cpp + game_text.hpp +) diff --git a/src/lang/CMakeLists.txt b/src/lang/CMakeLists.txt new file mode 100644 index 0000000000..00b554126f --- /dev/null +++ b/src/lang/CMakeLists.txt @@ -0,0 +1,122 @@ +set(LANG_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/afrikaans.txt + ${CMAKE_CURRENT_SOURCE_DIR}/arabic_egypt.txt + ${CMAKE_CURRENT_SOURCE_DIR}/basque.txt + ${CMAKE_CURRENT_SOURCE_DIR}/belarusian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/brazilian_portuguese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/bulgarian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/catalan.txt + ${CMAKE_CURRENT_SOURCE_DIR}/croatian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/czech.txt + ${CMAKE_CURRENT_SOURCE_DIR}/danish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/dutch.txt + ${CMAKE_CURRENT_SOURCE_DIR}/english.txt + ${CMAKE_CURRENT_SOURCE_DIR}/english_AU.txt + ${CMAKE_CURRENT_SOURCE_DIR}/english_US.txt + ${CMAKE_CURRENT_SOURCE_DIR}/esperanto.txt + ${CMAKE_CURRENT_SOURCE_DIR}/estonian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/faroese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/finnish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/french.txt + ${CMAKE_CURRENT_SOURCE_DIR}/gaelic.txt + ${CMAKE_CURRENT_SOURCE_DIR}/galician.txt + ${CMAKE_CURRENT_SOURCE_DIR}/german.txt + ${CMAKE_CURRENT_SOURCE_DIR}/greek.txt + ${CMAKE_CURRENT_SOURCE_DIR}/hebrew.txt + ${CMAKE_CURRENT_SOURCE_DIR}/hungarian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/icelandic.txt + ${CMAKE_CURRENT_SOURCE_DIR}/indonesian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/irish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/italian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/japanese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/korean.txt + ${CMAKE_CURRENT_SOURCE_DIR}/latin.txt + ${CMAKE_CURRENT_SOURCE_DIR}/latvian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/lithuanian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/luxembourgish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/malay.txt + ${CMAKE_CURRENT_SOURCE_DIR}/norwegian_bokmal.txt + ${CMAKE_CURRENT_SOURCE_DIR}/norwegian_nynorsk.txt + ${CMAKE_CURRENT_SOURCE_DIR}/polish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/portuguese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/romanian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/russian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/serbian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/simplified_chinese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/slovak.txt + ${CMAKE_CURRENT_SOURCE_DIR}/slovenian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/spanish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/spanish_MX.txt + ${CMAKE_CURRENT_SOURCE_DIR}/swedish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/tamil.txt + ${CMAKE_CURRENT_SOURCE_DIR}/thai.txt + ${CMAKE_CURRENT_SOURCE_DIR}/traditional_chinese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/turkish.txt + ${CMAKE_CURRENT_SOURCE_DIR}/ukrainian.txt + ${CMAKE_CURRENT_SOURCE_DIR}/vietnamese.txt + ${CMAKE_CURRENT_SOURCE_DIR}/welsh.txt +) + +set(LANG_BINARY_DIR ${CMAKE_BINARY_DIR}/lang) + +# Walk over all the (finished) language files, and generate a command to compile them +foreach(LANG_SOURCE_FILE IN LISTS LANG_SOURCE_FILES) + get_filename_component(LANG_SOURCE_FILE_NAME_WE ${LANG_SOURCE_FILE} NAME_WE) + + set(LANG_BINARY_FILE ${LANG_BINARY_DIR}/${LANG_SOURCE_FILE_NAME_WE}.lng) + + add_custom_command(OUTPUT ${LANG_BINARY_FILE} + COMMAND ${CMAKE_COMMAND} -E make_directory ${LANG_BINARY_DIR} + COMMAND strgen + -s ${CMAKE_CURRENT_SOURCE_DIR} + -d ${LANG_BINARY_DIR} + ${LANG_SOURCE_FILE} + DEPENDS strgen + MAIN_DEPENDENCY ${LANG_SOURCE_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Compiling language ${LANG_SOURCE_FILE_NAME_WE}" + ) + + list(APPEND LANG_BINARY_FILES ${LANG_BINARY_FILE}) +endforeach(LANG_SOURCE_FILE) + +# Create a new target which compiles all language files +add_custom_target(language_files + DEPENDS + ${LANG_BINARY_FILES} +) +set_target_properties(language_files + PROPERTIES LANG_SOURCE_FILES "${LANG_SOURCE_FILES}" +) + + +set(GENERATED_BINARY_DIR ${CMAKE_BINARY_DIR}/generated) +set(TABLE_BINARY_DIR ${GENERATED_BINARY_DIR}/table) + +# Generate a command and target to create the strings table +add_custom_command_timestamp(OUTPUT ${TABLE_BINARY_DIR}/strings.h + COMMAND ${CMAKE_COMMAND} -E make_directory ${TABLE_BINARY_DIR} + COMMAND strgen + -s ${CMAKE_CURRENT_SOURCE_DIR} + -d ${TABLE_BINARY_DIR} + DEPENDS strgen ${LANG_SOURCE_FILES} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating table/strings.h" +) +add_custom_target_timestamp(table_strings + DEPENDS + ${TABLE_BINARY_DIR}/strings.h +) + +add_library(languages + INTERFACE +) +target_include_directories(languages + INTERFACE + ${GENERATED_BINARY_DIR} +) +add_dependencies(languages + language_files + table_strings +) +add_library(openttd::languages ALIAS languages) diff --git a/src/linkgraph/CMakeLists.txt b/src/linkgraph/CMakeLists.txt new file mode 100644 index 0000000000..c3d73a15e1 --- /dev/null +++ b/src/linkgraph/CMakeLists.txt @@ -0,0 +1,22 @@ +add_files( + demands.cpp + demands.h + flowmapper.cpp + flowmapper.h + init.h + linkgraph.cpp + linkgraph.h + linkgraph_base.h + linkgraph_gui.cpp + linkgraph_gui.h + linkgraph_type.h + linkgraphjob.cpp + linkgraphjob.h + linkgraphjob_base.h + linkgraphschedule.cpp + linkgraphschedule.h + mcf.cpp + mcf.h + refresh.cpp + refresh.h +) diff --git a/src/misc/CMakeLists.txt b/src/misc/CMakeLists.txt new file mode 100644 index 0000000000..3a5363e7b0 --- /dev/null +++ b/src/misc/CMakeLists.txt @@ -0,0 +1,14 @@ +add_files( + array.hpp + binaryheap.hpp + blob.hpp + countedobj.cpp + countedptr.hpp + dbg_helpers.cpp + dbg_helpers.h + fixedsizearray.hpp + getoptdata.cpp + getoptdata.h + hashtable.hpp + str.hpp +) diff --git a/src/music/CMakeLists.txt b/src/music/CMakeLists.txt new file mode 100644 index 0000000000..0ae15fde26 --- /dev/null +++ b/src/music/CMakeLists.txt @@ -0,0 +1,54 @@ +if (NOT OPTION_DEDICATED) + add_files( + allegro_m.cpp + allegro_m.h + CONDITION Allegro_FOUND + ) + + add_files( + fluidsynth.cpp + fluidsynth.h + CONDITION Fluidsynth_FOUND + ) + + add_files( + cocoa_m.cpp + cocoa_m.h + CONDITION APPLE + ) + + add_files( + dmusic.cpp + dmusic.h + win32_m.cpp + win32_m.h + CONDITION WIN32 + ) + + add_files( + extmidi.cpp + extmidi.h + CONDITION UNIX + ) + + add_files( + bemidi.cpp + bemidi.h + CONDITION OPTION_HAIKU + ) + + add_files( + os2_m.cpp + os2_m.h + CONDITION OPTION_OS2 + ) +endif (NOT OPTION_DEDICATED) + +add_files( + midi.h + midifile.cpp + midifile.hpp + music_driver.hpp + null_m.cpp + null_m.h +) diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt new file mode 100644 index 0000000000..1c27d62066 --- /dev/null +++ b/src/network/CMakeLists.txt @@ -0,0 +1,28 @@ +add_subdirectory(core) + +add_files( + network.cpp + network.h + network_admin.cpp + network_admin.h + network_base.h + network_chat_gui.cpp + network_client.cpp + network_client.h + network_command.cpp + network_content.cpp + network_content.h + network_content_gui.cpp + network_content_gui.h + network_func.h + network_gamelist.cpp + network_gamelist.h + network_gui.cpp + network_gui.h + network_internal.h + network_server.cpp + network_server.h + network_type.h + network_udp.cpp + network_udp.h +) diff --git a/src/network/core/CMakeLists.txt b/src/network/core/CMakeLists.txt new file mode 100644 index 0000000000..777d15d841 --- /dev/null +++ b/src/network/core/CMakeLists.txt @@ -0,0 +1,27 @@ +add_files( + address.cpp + address.h + config.h + core.cpp + core.h + game.h + host.cpp + host.h + os_abstraction.h + packet.cpp + packet.h + tcp.cpp + tcp.h + tcp_admin.cpp + tcp_admin.h + tcp_connect.cpp + tcp_content.cpp + tcp_content.h + tcp_game.cpp + tcp_game.h + tcp_http.cpp + tcp_http.h + tcp_listen.h + udp.cpp + udp.h +) diff --git a/src/os/CMakeLists.txt b/src/os/CMakeLists.txt new file mode 100644 index 0000000000..e302c448b5 --- /dev/null +++ b/src/os/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(macosx) +add_subdirectory(os2) +add_subdirectory(unix) +add_subdirectory(windows) diff --git a/src/os/macosx/CMakeLists.txt b/src/os/macosx/CMakeLists.txt new file mode 100644 index 0000000000..e6b6c237b0 --- /dev/null +++ b/src/os/macosx/CMakeLists.txt @@ -0,0 +1,11 @@ +add_files( + crashlog_osx.cpp + macos.h + macos.mm + osx_stdafx.h + splash.cpp + splash.h + string_osx.cpp + string_osx.h + CONDITION APPLE +) diff --git a/src/os/os2/CMakeLists.txt b/src/os/os2/CMakeLists.txt new file mode 100644 index 0000000000..52534dbcbb --- /dev/null +++ b/src/os/os2/CMakeLists.txt @@ -0,0 +1,4 @@ +add_files( + os2.cpp + CONDITION OPTION_OS2 +) diff --git a/src/os/unix/CMakeLists.txt b/src/os/unix/CMakeLists.txt new file mode 100644 index 0000000000..b548d3bb21 --- /dev/null +++ b/src/os/unix/CMakeLists.txt @@ -0,0 +1,9 @@ +add_files( + crashlog_unix.cpp + CONDITION UNIX AND NOT APPLE AND NOT OPTION_OS2 +) + +add_files( + unix.cpp + CONDITION UNIX AND NOT OPTION_OS2 +) diff --git a/src/os/windows/CMakeLists.txt b/src/os/windows/CMakeLists.txt new file mode 100644 index 0000000000..19d1bd46e3 --- /dev/null +++ b/src/os/windows/CMakeLists.txt @@ -0,0 +1,8 @@ +add_files( + crashlog_win.cpp + string_uniscribe.cpp + string_uniscribe.h + win32.cpp + win32.h + CONDITION WIN32 +) diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index a2f8c28f57..741fa0e105 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -37,7 +37,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -100 ICON DISCARDABLE "../../../media/openttd.ico" +100 ICON DISCARDABLE "${CMAKE_SOURCE_DIR}/os/windows/openttd.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -77,8 +77,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,11,0,!!ISODATE!! - PRODUCTVERSION 1,11,0,!!ISODATE!! + FILEVERSION 1,11,0,${REV_ISODATE} + PRODUCTVERSION 1,11,0,${REV_ISODATE} FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -96,14 +96,14 @@ BEGIN VALUE "Comments", "This program is licensed under the GNU General Public License version 2.\0" VALUE "CompanyName", "OpenTTD Development Team\0" VALUE "FileDescription", "OpenTTD\0" - VALUE "FileVersion", "!!VERSION!!\0" + VALUE "FileVersion", "${REV_VERSION}\0" VALUE "InternalName", "openttd\0" - VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-!!YEAR!!. All Rights Reserved.\0" + VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-${REV_YEAR}. All Rights Reserved.\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "openttd.exe\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "OpenTTD\0" - VALUE "ProductVersion", "!!VERSION!!\0" + VALUE "ProductVersion", "${REV_VERSION}\0" VALUE "SpecialBuild", "-\0" END END @@ -116,7 +116,7 @@ END #endif // !_MAC #ifdef __MINGW32__ -1 24 "..\\..\\..\\projects\\dpi_aware.manifest" +1 24 "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest" #endif #endif // Neutral (Default) resources diff --git a/src/pathfinder/CMakeLists.txt b/src/pathfinder/CMakeLists.txt new file mode 100644 index 0000000000..2e275706f2 --- /dev/null +++ b/src/pathfinder/CMakeLists.txt @@ -0,0 +1,9 @@ +add_subdirectory(npf) +add_subdirectory(yapf) + +add_files( + follow_track.hpp + pathfinder_func.h + pathfinder_type.h + pf_performance_timer.hpp +) diff --git a/src/pathfinder/npf/CMakeLists.txt b/src/pathfinder/npf/CMakeLists.txt new file mode 100644 index 0000000000..e3ace57e52 --- /dev/null +++ b/src/pathfinder/npf/CMakeLists.txt @@ -0,0 +1,8 @@ +add_files( + aystar.cpp + aystar.h + npf.cpp + npf_func.h + queue.cpp + queue.h +) diff --git a/src/pathfinder/yapf/CMakeLists.txt b/src/pathfinder/yapf/CMakeLists.txt new file mode 100644 index 0000000000..170c1ad61d --- /dev/null +++ b/src/pathfinder/yapf/CMakeLists.txt @@ -0,0 +1,20 @@ +add_files( + nodelist.hpp + yapf.h + yapf.hpp + yapf_base.hpp + yapf_cache.h + yapf_common.hpp + yapf_costbase.hpp + yapf_costcache.hpp + yapf_costrail.hpp + yapf_destrail.hpp + yapf_node.hpp + yapf_node_rail.hpp + yapf_node_road.hpp + yapf_node_ship.hpp + yapf_rail.cpp + yapf_road.cpp + yapf_ship.cpp + yapf_type.hpp +) diff --git a/src/rev.cpp.in b/src/rev.cpp.in index 3f5b126dc1..16c403a67a 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -35,7 +35,7 @@ bool IsReleasedVersion() * * shows a "M", if the binary is made from modified source code. */ -const char _openttd_revision[] = "!!VERSION!!"; +const char _openttd_revision[] = "${REV_VERSION}"; /** * The text version of OpenTTD's build date. @@ -48,12 +48,12 @@ const char _openttd_build_date[] = __DATE__ " " __TIME__; /** * The git revision hash of this version. */ -const char _openttd_revision_hash[] = "!!GITHASH!!"; +const char _openttd_revision_hash[] = "${REV_HASH}"; /** * The year of this version. */ -const char _openttd_revision_year[] = "!!YEAR!!"; +const char _openttd_revision_year[] = "${REV_YEAR}"; /** * Let us know if current build was modified. This detection @@ -63,14 +63,14 @@ const char _openttd_revision_year[] = "!!YEAR!!"; * (compiling from sources without any version control software) * and 2 is for modified revision. */ -const byte _openttd_revision_modified = !!MODIFIED!!; +const byte _openttd_revision_modified = ${REV_MODIFIED}; /** * Indicate whether this is a tagged version. * If this is non-0, then _openttd_revision is the name of the tag, * and the version is likely a beta, release candidate, or real release. */ -const byte _openttd_revision_tagged = !!ISTAG!!; +const byte _openttd_revision_tagged = ${REV_ISTAG}; /** * The NewGRF revision of OTTD: @@ -85,4 +85,4 @@ const byte _openttd_revision_tagged = !!ISTAG!!; * final release will always have a lower version number than the released * version, thus making comparisons on specific revisions easy. */ -const uint32 _openttd_newgrf_version = 1 << 28 | 11 << 24 | 0 << 20 | !!ISSTABLETAG!! << 19 | 28004; +const uint32 _openttd_newgrf_version = 1 << 28 | 11 << 24 | 0 << 20 | ${REV_ISSTABLETAG} << 19 | 28004; diff --git a/src/saveload/CMakeLists.txt b/src/saveload/CMakeLists.txt new file mode 100644 index 0000000000..52f103fa7e --- /dev/null +++ b/src/saveload/CMakeLists.txt @@ -0,0 +1,43 @@ +add_files( + afterload.cpp + ai_sl.cpp + airport_sl.cpp + animated_tile_sl.cpp + autoreplace_sl.cpp + cargomonitor_sl.cpp + cargopacket_sl.cpp + cheat_sl.cpp + company_sl.cpp + depot_sl.cpp + economy_sl.cpp + engine_sl.cpp + game_sl.cpp + gamelog_sl.cpp + goal_sl.cpp + group_sl.cpp + industry_sl.cpp + labelmaps_sl.cpp + linkgraph_sl.cpp + map_sl.cpp + misc_sl.cpp + newgrf_sl.cpp + newgrf_sl.h + object_sl.cpp + oldloader.cpp + oldloader.h + oldloader_sl.cpp + order_sl.cpp + saveload.cpp + saveload.h + saveload_filter.h + saveload_internal.h + signs_sl.cpp + station_sl.cpp + storage_sl.cpp + strings_sl.cpp + story_sl.cpp + subsidy_sl.cpp + town_sl.cpp + vehicle_sl.cpp + waypoint_sl.cpp +) diff --git a/src/script/CMakeLists.txt b/src/script/CMakeLists.txt new file mode 100644 index 0000000000..e5915332c4 --- /dev/null +++ b/src/script/CMakeLists.txt @@ -0,0 +1,23 @@ +add_subdirectory(api) + +add_files( + script_config.cpp + script_config.hpp + script_fatalerror.hpp + script_info.cpp + script_info.hpp + script_info_dummy.cpp + script_instance.cpp + script_instance.hpp + script_scanner.cpp + script_scanner.hpp + script_storage.hpp + script_suspend.hpp + squirrel.cpp + squirrel.hpp + squirrel_class.hpp + squirrel_helper.hpp + squirrel_helper_type.hpp + squirrel_std.cpp + squirrel_std.hpp +) diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt new file mode 100644 index 0000000000..9c665293c1 --- /dev/null +++ b/src/script/api/CMakeLists.txt @@ -0,0 +1,140 @@ +add_files( + ai_changelog.hpp + game_changelog.hpp + script_accounting.hpp + script_admin.hpp + script_airport.hpp + script_base.hpp + script_basestation.hpp + script_bridge.hpp + script_bridgelist.hpp + script_cargo.hpp + script_cargolist.hpp + script_cargomonitor.hpp + script_client.hpp + script_clientlist.hpp + script_company.hpp + script_companymode.hpp + script_controller.hpp + script_date.hpp + script_depotlist.hpp + script_engine.hpp + script_enginelist.hpp + script_error.hpp + script_event.hpp + script_event_types.hpp + script_execmode.hpp + script_game.hpp + script_gamesettings.hpp + script_goal.hpp + script_group.hpp + script_grouplist.hpp + script_industry.hpp + script_industrylist.hpp + script_industrytype.hpp + script_industrytypelist.hpp + script_info_docs.hpp + script_infrastructure.hpp + script_list.hpp + script_log.hpp + script_map.hpp + script_marine.hpp + script_news.hpp + script_object.hpp + script_order.hpp + script_priorityqueue.hpp + script_rail.hpp + script_railtypelist.hpp + script_road.hpp + script_roadtypelist.hpp + script_sign.hpp + script_signlist.hpp + script_station.hpp + script_stationlist.hpp + script_story_page.hpp + script_storypagelist.hpp + script_storypageelementlist.hpp + script_subsidy.hpp + script_subsidylist.hpp + script_testmode.hpp + script_text.hpp + script_tile.hpp + script_tilelist.hpp + script_town.hpp + script_townlist.hpp + script_tunnel.hpp + script_types.hpp + script_vehicle.hpp + script_vehiclelist.hpp + script_viewport.hpp + script_waypoint.hpp + script_waypointlist.hpp + script_window.hpp + script_accounting.cpp + script_admin.cpp + script_airport.cpp + script_base.cpp + script_basestation.cpp + script_bridge.cpp + script_bridgelist.cpp + script_cargo.cpp + script_cargolist.cpp + script_cargomonitor.cpp + script_client.cpp + script_clientlist.cpp + script_company.cpp + script_companymode.cpp + script_controller.cpp + script_date.cpp + script_depotlist.cpp + script_engine.cpp + script_enginelist.cpp + script_error.cpp + script_event.cpp + script_event_types.cpp + script_execmode.cpp + script_game.cpp + script_gamesettings.cpp + script_goal.cpp + script_group.cpp + script_grouplist.cpp + script_industry.cpp + script_industrylist.cpp + script_industrytype.cpp + script_industrytypelist.cpp + script_infrastructure.cpp + script_list.cpp + script_log.cpp + script_map.cpp + script_marine.cpp + script_news.cpp + script_object.cpp + script_order.cpp + script_priorityqueue.cpp + script_rail.cpp + script_railtypelist.cpp + script_road.cpp + script_roadtypelist.cpp + script_sign.cpp + script_signlist.cpp + script_station.cpp + script_stationlist.cpp + script_story_page.cpp + script_storypagelist.cpp + script_storypageelementlist.cpp + script_subsidy.cpp + script_subsidylist.cpp + script_testmode.cpp + script_text.cpp + script_tile.cpp + script_tilelist.cpp + script_town.cpp + script_townlist.cpp + script_tunnel.cpp + script_vehicle.cpp + script_vehiclelist.cpp + script_viewport.cpp + script_waypoint.cpp + script_waypointlist.cpp + script_window.cpp +) diff --git a/src/settingsgen/CMakeLists.txt b/src/settingsgen/CMakeLists.txt new file mode 100644 index 0000000000..e17b8ad6bf --- /dev/null +++ b/src/settingsgen/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.5) + +project(settingsgen) + +set(sourcefiles + settingsgen.cpp + ../core/alloc_func.cpp + ../misc/getoptdata.cpp + ../ini_load.cpp + ../string.cpp +) +add_definitions(-DSETTINGSGEN) +add_executable(settingsgen ${sourcefiles}) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt new file mode 100644 index 0000000000..35f65d1205 --- /dev/null +++ b/src/sound/CMakeLists.txt @@ -0,0 +1,37 @@ +if (NOT OPTION_DEDICATED) + add_files( + allegro_s.cpp + allegro_s.h + CONDITION Allegro_FOUND + ) + + add_files( + sdl_s.cpp + sdl_s.h + CONDITION SDL_FOUND + ) + + add_files( + cocoa_s.cpp + cocoa_s.h + CONDITION APPLE + ) + + add_files( + win32_s.cpp + win32_s.h + CONDITION WIN32 + ) + + add_files( + xaudio2_s.cpp + xaudio2_s.h + CONDITION WIN32 AND XAUDIO2_FOUND + ) +endif (NOT OPTION_DEDICATED) + +add_files( + sound_driver.hpp + null_s.cpp + null_s.h +) diff --git a/src/spriteloader/CMakeLists.txt b/src/spriteloader/CMakeLists.txt new file mode 100644 index 0000000000..5d6a2f865e --- /dev/null +++ b/src/spriteloader/CMakeLists.txt @@ -0,0 +1,5 @@ +add_files( + grf.cpp + grf.hpp + spriteloader.hpp +) diff --git a/src/stdafx.h b/src/stdafx.h index 4fb84a956e..c520925537 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -424,17 +424,14 @@ void NORETURN CDECL usererror(const char *str, ...) WARN_FORMAT(1, 2); void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); #define NOT_REACHED() error("NOT_REACHED triggered at line %i of %s", __LINE__, __FILE__) -/* For non-debug builds with assertions enabled use the special assertion handler: - * - For MSVC: NDEBUG is set for all release builds and WITH_ASSERT overrides the disabling of asserts. - * - For non MSVC: NDEBUG is set when assertions are disables, _DEBUG is set for non-release builds. - */ -#if (defined(_MSC_VER) && defined(NDEBUG) && defined(WITH_ASSERT)) || (!defined(_MSC_VER) && !defined(NDEBUG) && !defined(_DEBUG)) +/* For non-debug builds with assertions enabled use the special assertion handler. */ +#if defined(NDEBUG) && defined(WITH_ASSERT) #undef assert #define assert(expression) if (!(expression)) error("Assertion failed at line %i of %s: %s", __LINE__, __FILE__, #expression); #endif -/* Asserts are enabled if NDEBUG isn't defined, or if we are using MSVC and WITH_ASSERT is defined. */ -#if !defined(NDEBUG) || (defined(_MSC_VER) && defined(WITH_ASSERT)) +/* Asserts are enabled if NDEBUG isn't defined or WITH_ASSERT is defined. */ +#if !defined(NDEBUG) || defined(WITH_ASSERT) #define OTTD_ASSERT #endif diff --git a/src/strgen/CMakeLists.txt b/src/strgen/CMakeLists.txt new file mode 100644 index 0000000000..b8f61cde3b --- /dev/null +++ b/src/strgen/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.5) + +project(strgen) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake") + +set(sourcefiles + strgen.cpp + strgen_base.cpp + ../core/alloc_func.cpp + ../misc/getoptdata.cpp + ../string.cpp +) +add_definitions(-DSTRGEN) +add_executable(strgen ${sourcefiles}) + +include(Endian) +add_endian_definition() + + +# Source Files +add_files(strgen_base.cpp) + +# Header Files +add_files(strgen.h) diff --git a/src/table/CMakeLists.txt b/src/table/CMakeLists.txt new file mode 100644 index 0000000000..23b4724e33 --- /dev/null +++ b/src/table/CMakeLists.txt @@ -0,0 +1,83 @@ +set(GENERATED_BINARY_DIR ${CMAKE_BINARY_DIR}/generated) +set(TABLE_BINARY_DIR ${GENERATED_BINARY_DIR}/table) + +set(TABLE_INI_SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/company_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/currency_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/gameopt_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/misc_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/win32_settings.ini + ${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini +) + +# Generate a command and target to create the settings table +add_custom_command_timestamp(OUTPUT ${TABLE_BINARY_DIR}/settings.h + COMMAND ${CMAKE_COMMAND} -E make_directory ${TABLE_BINARY_DIR} + COMMAND settingsgen + -o ${TABLE_BINARY_DIR}/settings.h + -b ${CMAKE_SOURCE_DIR}/src/table/settings.h.preamble + -a ${CMAKE_SOURCE_DIR}/src/table/settings.h.postamble + ${TABLE_INI_SOURCE_FILES} + DEPENDS settingsgen ${TABLE_INI_SOURCE_FILES} + ${CMAKE_SOURCE_DIR}/src/table/settings.h.preamble + ${CMAKE_SOURCE_DIR}/src/table/settings.h.postamble + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating table/settings.h" +) +add_custom_target_timestamp(table_settings + DEPENDS + ${TABLE_BINARY_DIR}/settings.h +) + +add_library(settings + INTERFACE +) +target_include_directories(settings + INTERFACE + ${GENERATED_BINARY_DIR} +) +add_dependencies(settings + table_settings +) +add_library(openttd::settings ALIAS settings) + +add_files( + airport_defaults.h + airport_movement.h + airporttile_ids.h + airporttiles.h + animcursors.h + autorail.h + bridge_land.h + build_industry.h + cargo_const.h + clear_land.h + control_codes.h + elrail_data.h + engines.h + genland.h + heightmap_colours.h + industry_land.h + landscape_sprite.h + newgrf_debug_data.h + object_land.h + palette_convert.h + palettes.h + pricebase.h + railtypes.h + road_land.h + roadtypes.h + roadveh_movement.h + sprites.h + station_land.h + strgen_tables.h + string_colours.h + town_land.h + townname.h + track_land.h + train_cmd.h + tree_land.h + unicode.h + water_land.h +) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt new file mode 100644 index 0000000000..c6251e9391 --- /dev/null +++ b/src/video/CMakeLists.txt @@ -0,0 +1,35 @@ +add_subdirectory(cocoa) + +if (NOT OPTION_DEDICATED) + add_files( + allegro_v.cpp + allegro_v.h + CONDITION Allegro_FOUND + ) + + add_files( + sdl_v.cpp + sdl_v.h + CONDITION SDL_FOUND + ) + + add_files( + sdl2_v.cpp + sdl2_v.h + CONDITION SDL2_FOUND + ) + + add_files( + win32_v.cpp + win32_v.h + CONDITION WIN32 + ) +endif (NOT OPTION_DEDICATED) + +add_files( + dedicated_v.cpp + dedicated_v.h + null_v.cpp + null_v.h + video_driver.hpp +) diff --git a/src/video/cocoa/CMakeLists.txt b/src/video/cocoa/CMakeLists.txt new file mode 100644 index 0000000000..4fff132f37 --- /dev/null +++ b/src/video/cocoa/CMakeLists.txt @@ -0,0 +1,8 @@ +add_files( + cocoa_keys.h + cocoa_v.h + cocoa_v.mm + event.mm + wnd_quartz.mm + CONDITION APPLE +) diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt new file mode 100644 index 0000000000..18ecd529e8 --- /dev/null +++ b/src/widgets/CMakeLists.txt @@ -0,0 +1,61 @@ +add_files( + ai_widget.h + airport_widget.h + autoreplace_widget.h + bootstrap_widget.h + bridge_widget.h + build_vehicle_widget.h + cheat_widget.h + company_widget.h + console_widget.h + date_widget.h + depot_widget.h + dock_widget.h + dropdown.cpp + dropdown_func.h + dropdown_type.h + dropdown_widget.h + engine_widget.h + error_widget.h + fios_widget.h + framerate_widget.h + genworld_widget.h + goal_widget.h + graph_widget.h + group_widget.h + highscore_widget.h + industry_widget.h + intro_widget.h + link_graph_legend_widget.h + main_widget.h + misc_widget.h + music_widget.h + network_chat_widget.h + network_content_widget.h + network_widget.h + newgrf_debug_widget.h + newgrf_widget.h + news_widget.h + object_widget.h + order_widget.h + osk_widget.h + rail_widget.h + road_widget.h + screenshot_widget.h + settings_widget.h + sign_widget.h + smallmap_widget.h + station_widget.h + statusbar_widget.h + story_widget.h + subsidy_widget.h + terraform_widget.h + timetable_widget.h + toolbar_widget.h + town_widget.h + transparency_widget.h + tree_widget.h + vehicle_widget.h + viewport_widget.h + waypoint_widget.h +) From b7643b1d36cb41eb6712042761c13b9819fcbe74 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 12:00:36 +0200 Subject: [PATCH 05/41] Add: create bundles via CPack CPack works closely together with CMake to do the right thing in terms of bundling (called 'package'). This generates all the packaging we need, and some more. --- CMakeLists.txt | 2 + CPackProperties.cmake.in | 12 + cmake/InstallAndPackage.cmake | 109 ++ cmake/PackageBundle.cmake | 24 + cmake/PackageDeb.cmake | 4 + cmake/PackageNSIS.cmake | 39 + os/debian/NEWS | 25 - os/debian/README.Debian | 41 - os/debian/changelog | 1087 ----------------- os/debian/compat | 1 - os/debian/control | 36 - os/debian/copyright | 106 -- os/debian/gbp.conf | 13 - os/debian/menu | 2 - os/debian/openttd-wrapper | 28 - os/debian/patches/run-openttd-wrapper.patch | 20 - os/debian/patches/series | 1 - os/debian/rules | 50 - os/debian/source/format | 1 - os/debian/watch | 5 - os/macosx/Info.plist.in | 33 + os/macosx/launch.sh | 8 + os/macosx/plistgen.sh | 46 - os/morphos/icons/OpenTTD.info | Bin 7341 -> 0 bytes os/morphos/icons/docs.info | Bin 5390 -> 0 bytes os/morphos/icons/document.info | Bin 4451 -> 0 bytes os/morphos/icons/drawer.info | Bin 5390 -> 0 bytes os/rpm/openttd-rpmlintrc | 6 - os/rpm/openttd.changes | 100 -- os/rpm/openttd.spec | 272 ----- os/windows/installer/build_installers.bat | 4 - os/windows/installer/cdfinder.ini | 26 - os/windows/installer/install.nsi | 744 ----------- os/windows/installer/version_win32.txt | 5 - os/windows/installer/version_win64.txt | 5 - os/windows/installer/version_win9x.txt | 5 - .../{installer/top.bmp => nsis-top.bmp} | Bin .../welcome.bmp => nsis-welcome.bmp} | Bin {media => os/windows}/openttd.ico | Bin 39 files changed, 231 insertions(+), 2629 deletions(-) create mode 100644 CPackProperties.cmake.in create mode 100644 cmake/InstallAndPackage.cmake create mode 100644 cmake/PackageBundle.cmake create mode 100644 cmake/PackageDeb.cmake create mode 100644 cmake/PackageNSIS.cmake delete mode 100644 os/debian/NEWS delete mode 100644 os/debian/README.Debian delete mode 100644 os/debian/changelog delete mode 100644 os/debian/compat delete mode 100644 os/debian/control delete mode 100644 os/debian/copyright delete mode 100644 os/debian/gbp.conf delete mode 100644 os/debian/menu delete mode 100644 os/debian/openttd-wrapper delete mode 100644 os/debian/patches/run-openttd-wrapper.patch delete mode 100644 os/debian/patches/series delete mode 100755 os/debian/rules delete mode 100644 os/debian/source/format delete mode 100644 os/debian/watch create mode 100644 os/macosx/Info.plist.in create mode 100644 os/macosx/launch.sh delete mode 100755 os/macosx/plistgen.sh delete mode 100644 os/morphos/icons/OpenTTD.info delete mode 100644 os/morphos/icons/docs.info delete mode 100644 os/morphos/icons/document.info delete mode 100644 os/morphos/icons/drawer.info delete mode 100644 os/rpm/openttd-rpmlintrc delete mode 100644 os/rpm/openttd.changes delete mode 100644 os/rpm/openttd.spec delete mode 100644 os/windows/installer/build_installers.bat delete mode 100644 os/windows/installer/cdfinder.ini delete mode 100644 os/windows/installer/install.nsi delete mode 100644 os/windows/installer/version_win32.txt delete mode 100644 os/windows/installer/version_win64.txt delete mode 100644 os/windows/installer/version_win9x.txt rename os/windows/{installer/top.bmp => nsis-top.bmp} (100%) rename os/windows/{installer/welcome.bmp => nsis-welcome.bmp} (100%) rename {media => os/windows}/openttd.ico (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1ffa9ecca..77ae77cef3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,3 +224,5 @@ endif (CMAKE_SIZEOF_VOID_P EQUAL 8) include(CreateRegression) create_regression() + +include(InstallAndPackage) diff --git a/CPackProperties.cmake.in b/CPackProperties.cmake.in new file mode 100644 index 0000000000..824c50f93e --- /dev/null +++ b/CPackProperties.cmake.in @@ -0,0 +1,12 @@ +# Make the current version available to CPack +set(CPACK_PACKAGE_VERSION "@REV_VERSION@") + +# Name the output file with the correct version +string(REPLACE "#CPACK_PACKAGE_VERSION#" "@REV_VERSION@" CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}") + +if (CPACK_BUNDLE_PLIST_SOURCE) + # Rewrite the Info.plist.in to contain the correct version + file(READ ${CPACK_BUNDLE_PLIST_SOURCE} INFO_PLIST_CONTENT) + string(REPLACE "#CPACK_PACKAGE_VERSION#" "@REV_VERSION@" INFO_PLIST_CONTENT "${INFO_PLIST_CONTENT}") + file(WRITE ${CPACK_BUNDLE_PLIST} "${INFO_PLIST_CONTENT}") +endif (CPACK_BUNDLE_PLIST_SOURCE) diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake new file mode 100644 index 0000000000..d23fa92b7c --- /dev/null +++ b/cmake/InstallAndPackage.cmake @@ -0,0 +1,109 @@ +# If requested, use FHS layout; otherwise fall back to a flat layout. +if (OPTION_INSTALL_FHS) + set(BINARY_DESTINATION_DIR "bin") + set(DATA_DESTINATION_DIR "share/games/openttd") + set(DOCS_DESTINATION_DIR "share/doc/openttd") + set(MAN_DESTINATION_DIR "share/man/openttd") +else (OPTION_INSTALL_FHS) + set(BINARY_DESTINATION_DIR ".") + set(DATA_DESTINATION_DIR ".") + set(DOCS_DESTINATION_DIR ".") + set(MAN_DESTINATION_DIR ".") +endif (OPTION_INSTALL_FHS) + +install(TARGETS openttd + RUNTIME + DESTINATION ${BINARY_DESTINATION_DIR} + COMPONENT Runtime + ) + +install(DIRECTORY + ${CMAKE_BINARY_DIR}/lang + ${CMAKE_BINARY_DIR}/baseset + ${CMAKE_SOURCE_DIR}/bin/ai + ${CMAKE_SOURCE_DIR}/bin/game + ${CMAKE_SOURCE_DIR}/bin/scripts + DESTINATION ${DATA_DESTINATION_DIR} + COMPONENT language_files) + +install(FILES + ${CMAKE_SOURCE_DIR}/COPYING.md + ${CMAKE_SOURCE_DIR}/README.md + ${CMAKE_SOURCE_DIR}/changelog.txt + ${CMAKE_SOURCE_DIR}/docs/multiplayer.md + ${CMAKE_SOURCE_DIR}/known-bugs.txt + DESTINATION ${DOCS_DESTINATION_DIR} + COMPONENT docs) + +# A Linux manual only makes sense when using FHS. Otherwise it is a very odd +# file with little context to what it is. +if (OPTION_INSTALL_FHS) + install(FILES + ${CMAKE_SOURCE_DIR}/docs/openttd.6 + DESTINATION ${MAN_DESTINATION_DIR} + COMPONENT manual) +endif (OPTION_INSTALL_FHS) + +# TODO -- Media files +# TODO -- Menu files + +if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(ARCHITECTURE "amd64") +else (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" ARCHITECTURE) +endif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + +# Windows is a bit more annoying to detect; using the size of void pointer +# seems to be the most robust. +if (WIN32) + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCHITECTURE "win64") + else (CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCHITECTURE "win32") + endif (CMAKE_SIZEOF_VOID_P EQUAL 8) +endif (WIN32) + +set(CPACK_SYSTEM_NAME "${ARCHITECTURE}") + +set(CPACK_PACKAGE_NAME "openttd") +set(CPACK_PACKAGE_VENDOR "OpenTTD") +set(CPACK_PACKAGE_DESCRIPTION "OpenTTD") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenTTD") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.openttd.org/") +set(CPACK_PACKAGE_CONTACT "OpenTTD ") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenTTD") +set(CPACK_PACKAGE_CHECKSUM "SHA256") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING.md") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") +set(CPACK_MONOLITHIC_INSTALL YES) +set(CPACK_PACKAGE_EXECUTABLES "openttd;OpenTTD") +set(CPACK_STRIP_FILES YES) +set(CPACK_OUTPUT_FILE_PREFIX "bundles") + +if (APPLE) + set(CPACK_GENERATOR "Bundle") + include(PackageBundle) + + set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx") +elseif (WIN32) + set(CPACK_GENERATOR "ZIP;NSIS") + include(PackageNSIS) + + set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-windows-${CPACK_SYSTEM_NAME}") +elseif (UNIX) + # With FHS, we can create deb/rpm/... Without it, they would be horribly broken + # and not work. The other way around is also true; with FHS they are not + # usable, and only flat formats work. + if (OPTION_INSTALL_FHS) + set(CPACK_GENERATOR "DEB") + include(PackageDeb) + else (OPTION_INSTALL_FHS) + set(CPACK_GENERATOR "TXZ") + endif (OPTION_INSTALL_FHS) + + set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${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 () + +include(CPack) diff --git a/cmake/PackageBundle.cmake b/cmake/PackageBundle.cmake new file mode 100644 index 0000000000..6d0085a32a --- /dev/null +++ b/cmake/PackageBundle.cmake @@ -0,0 +1,24 @@ +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") + +# Create a temporary Info.plist.in, where we will fill in the version via +# CPackProperties.cmake.in. This because at this point in time the version +# is not yet known. +configure_file("${CMAKE_SOURCE_DIR}/os/macosx/Info.plist.in" "${CMAKE_CURRENT_BINARY_DIR}/Info.plist.in") +set(CPACK_BUNDLE_PLIST_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/Info.plist.in") + +# Delay fixup_bundle() till the install step; this makes sure all executables +# exists and it can do its job. +install( + CODE + " + include(BundleUtilities) + fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/openttd\" \"\" \"\") + " + DESTINATION . + COMPONENT Runtime) diff --git a/cmake/PackageDeb.cmake b/cmake/PackageDeb.cmake new file mode 100644 index 0000000000..0d635ebcb3 --- /dev/null +++ b/cmake/PackageDeb.cmake @@ -0,0 +1,4 @@ +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${ARCHITECTURE}") +set(CPACK_DEBIAN_PACKAGE_SECTION "games") +# TODO -- Fix depends +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.15)") diff --git a/cmake/PackageNSIS.cmake b/cmake/PackageNSIS.cmake new file mode 100644 index 0000000000..1af38271f5 --- /dev/null +++ b/cmake/PackageNSIS.cmake @@ -0,0 +1,39 @@ +set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) +set(CPACK_NSIS_HELP_LINK "${CPACK_PACKAGE_HOMEPAGE_URL}") +set(CPACK_NSIS_URL_INFO_ABOUT "${CPACK_PACKAGE_HOMEPAGE_URL}") +set(CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}") + +# NSIS uses this for the icon in the top left of the installer +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/os/windows\\\\nsis-top.bmp") + +# Set other icons and bitmaps for NSIS +set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/os/windows\\\\openttd.ico") +set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/os/windows\\\\openttd.ico") +set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "${CMAKE_SOURCE_DIR}/os/windows\\\\nsis-welcome.bmp") +set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP "${CMAKE_SOURCE_DIR}/os/windows\\\\nsis-welcome.bmp") + +# Use the icon of the application +set(CPACK_NSIS_INSTALLED_ICON_NAME "openttd.exe") +# Tell NSIS the binary will be in the root +set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + +# Add detail information on the NSIS installer executable. CPack doesn't +# support this out of the box, so we use CPACK_NSIS_DEFINES for this. + +# \\\ are needed, because this value is generated in another CPack file, +# which is used. So one \ is to escape here, the second to escape in the +# CPack file, which we have to escape here (hence: 3 \). +set(CPACK_NSIS_DEFINES " +; Version Info +Var AddWinPrePopulate +VIProductVersion \\\"0.0.0.0\\\" +VIAddVersionKey \\\"ProductName\\\" \\\"OpenTTD Installer for Windows\\\" +VIAddVersionKey \\\"Comments\\\" \\\"Installs OpenTTD \\\${VERSION}\\\" +VIAddVersionKey \\\"CompanyName\\\" \\\"OpenTTD Developers\\\" +VIAddVersionKey \\\"FileDescription\\\" \\\"Installs OpenTTD \\\${VERSION}\\\" +VIAddVersionKey \\\"ProductVersion\\\" \\\"\\\${VERSION}\\\" +VIAddVersionKey \\\"InternalName\\\" \\\"InstOpenTTD\\\" +VIAddVersionKey \\\"FileVersion\\\" \\\"0.0.0.0\\\" +VIAddVersionKey \\\"LegalCopyright\\\" \\\" \\\" +" +) diff --git a/os/debian/NEWS b/os/debian/NEWS deleted file mode 100644 index 2a5c811019..0000000000 --- a/os/debian/NEWS +++ /dev/null @@ -1,25 +0,0 @@ -openttd (1.0.0~rc3-2) unstable; urgency=low - - The openttd package has been moved from contrib into main. Since the - OpenGFX free graphics set has been packaged for Debian, one can now run - OpenTTD without needing any of the resources from the original game - (though the original resources are still supported). - - -- Matthijs Kooijman Thu, 18 Mar 2010 13:09:35 +0100 - -openttd (0.7.0-1) unstable; urgency=low - - Handling of AI players has changed in 0.7.0. This package no longer - contains any AI players, so playing against the computer is not possible - out of the box any longer. However, you can easily download AI players - through the new "Content Downloading Service", after which playing with - computer players is possible. - - Loading old savegames with computer players is supported (AI players will - be converted according to the current AI settings), but at this moment - there are no AIs that completely handle any existing infrastructure built - by the old AI, so starting a new game might be more fun (especially since - most of the new AIs are a lot less erratic). - - -- Matthijs Kooijman Mon, 13 Apr 2009 15:11:20 +0200 - diff --git a/os/debian/README.Debian b/os/debian/README.Debian deleted file mode 100644 index e7b4bdb135..0000000000 --- a/os/debian/README.Debian +++ /dev/null @@ -1,41 +0,0 @@ -OpenTTD for Debian ------------------- - -To properly play this game, you need a base graphics and sound set. -Currently, the graphics, sound and music files from the original -Transport Tycoon Deluxe game (Windows and DOS versions) are supported, -as well as the free graphics replacement set "OpenGFX", sound -replacement set "OpenSFX" (which is in non-free due to a restrictive -license) and the free music replacement set "OpenMSX". - -Normally, installing the openttd package should automatically install -openttd-opengfx as well, allowing OpenTTD to run out of the box. If you -want sound, you'll have to enable non-free sources and install the -openttd-opensfx package manually (or install the original Transport -Tyccon Deluxe sound files). - -The easiest way to install the OpenMSX music files is to use the in-game -content download system, which should offer the latest version of the -music files. - -To find out how to install the original Transport Tycoon Deluxe graphics -sound files and music files, see readme.txt, section 4.1. - --Playing Music - In addition to installing a music set (see above), you'll also need - to install the timidity midi player, available in the timidity - package. - - Remember that not all audio devices support multiple audiostreams - (music and sound), so you might have to use alsa software mixing or - pulseaudio. - --Scenarios - There are no scenarios included in this release. Scenarios can be - downloaded using OpenTTD's content service, which is available from - OpenTTD's main menu. If you have obtained a scenario through other - means, you can place it either in your ~/.openttd/scenario directory - or in the system-wide /usr/share/games/openttd/scenario directory. - - -- Matthijs Kooijman Mon, 01 Feb 2010 10:42:11 +0100 - diff --git a/os/debian/changelog b/os/debian/changelog deleted file mode 100644 index 6b24aaa7d5..0000000000 --- a/os/debian/changelog +++ /dev/null @@ -1,1087 +0,0 @@ -openttd (1.10.0~beta2-0) unstable; urgency=low - - * New upstream release 1.10.0-beta2 - - -- OpenTTD Wed, 25 Dec 2019 00:00:00 +0000 - -openttd (1.10.0~beta1-0) unstable; urgency=low - - * New upstream release 1.10.0-beta1 - - -- OpenTTD Tue, 29 Oct 2019 00:00:00 +0000 - -openttd (1.9.3-0) unstable; urgency=low - - * New upstream release 1.9.3 - - -- OpenTTD Mon, 16 Sep 2019 21:00:00 +0200 - -openttd (1.9.3~RC1-0) unstable; urgency=low - - * New upstream release 1.9.3-RC1 - -- OpenTTD Sat, 07 Sep 2019 23:30:00 +0200 - -openttd (1.9.2-0) unstable; urgency=low - - * New upstream release 1.9.2 - - -- OpenTTD Sun, 07 Jul 2019 23:00:00 +0200 - -openttd (1.9.1-0) unstable; urgency=low - - * New upstream release 1.9.1 - - -- OpenTTD Mon, 08 Apr 2019 20:00:00 +0100 - -openttd (1.9.0-0) unstable; urgency=low - - * New upstream release 1.9.0 - - -- OpenTTD Mon, 01 Apr 2019 00:00:00 +0200 - -openttd (1.9.0~RC2-0) unstable; urgency=low - - * New upstream release 1.9.0-RC2 - - -- OpenTTD Sun, 24 Mar 2019 23:00:00 +0000 - -openttd (1.9.0~RC1-0) unstable; urgency=low - - * New upstream release 1.9.0-RC1 - - -- OpenTTD Sun, 3 Mar 2019 23:00:00 +0000 - -openttd (1.9.0~beta3-0) unstable; urgency=low - - * New upstream release 1.9.0-beta3 - - -- OpenTTD Sun, 24 Feb 2019 23:00:00 +0000 - -openttd (1.9.0~beta2-0) unstable; urgency=low - - * New upstream release 1.9.0-beta2 - - -- OpenTTD Sat, 09 Feb 2019 23:00:00 +0000 - -openttd (1.9.0~beta1-0) unstable; urgency=low - - * New upstream release 1.9.0-beta1 - - -- OpenTTD Sat, 09 Feb 2019 16:00:00 +0000 - -openttd (1.8.0-0) unstable; urgency=low - - * New upstream release 1.8.0 - - -- OpenTTD Sun, 01 Apr 2018 14:00:00 +0200 - -openttd (1.8.0~RC1-0) unstable; urgency=low - - * New upstream release 1.8.0-RC1 - - -- OpenTTD Wed, 21 Mar 2018 21:00:00 +0100 - -openttd (1.7.2-0) unstable; urgency=low - - * New upstream release 1.7.2 - - -- OpenTTD Sun, 24 Dec 2017 14:00:00 +0100 - -openttd (1.7.2~RC1-0) unstable; urgency=low - - * New upstream release 1.7.2-RC1 - - -- OpenTTD Mon, 11 Dec 2017 21:30:00 +0100 - -openttd (1.7.1-0) unstable; urgency=low - - * New upstream release 1.7.1 - - -- OpenTTD Tue, 13 Jun 2017 21:00:00 +0200 - -openttd (1.7.1~RC1-0) unstable; urgency=low - - * New upstream release 1.7.1-RC1 - - -- OpenTTD Thu, 04 Mai 2017 21:00:00 +0200 - -openttd (1.7.0-0) unstable; urgency=low - - * New upstream release 1.7.0 - - -- OpenTTD Sat, 01 Apr 2017 19:00:00 +0200 - -openttd (1.7.0~RC1-0) unstable; urgency=low - - * New upstream release 1.7.0-RC1 - - -- OpenTTD Sat, 11 Mar 2017 22:30:00 +0100 - -openttd (1.6.1-0) unstable; urgency=low - - * New upstream release 1.6.1 - - -- OpenTTD Fri, 01 Jul 2016 00:00:00 +0200 - -openttd (1.6.1~RC1-0) unstable; urgency=low - - * New upstream release 1.6.1-RC1 - - -- OpenTTD Wed, 01 Jun 2016 21:00:00 +0200 - -openttd (1.6.0-0) unstable; urgency=low - - * New upstream release 1.6.0 - - -- OpenTTD Fri, 01 Apr 2016 21:00:00 +0200 - -openttd (1.6.0~RC1-0) unstable; urgency=low - - * New upstream release 1.6.0-RC1 - - -- OpenTTD Tue, 01 Mar 2016 21:00:00 +0100 - -openttd (1.5.3-0) unstable; urgency=low - - * New upstream release 1.5.3 - - -- OpenTTD Tue, 01 Dec 2015 21:00:00 +0100 - -openttd (1.5.3~RC1-0) unstable; urgency=low - - * New upstream release 1.5.3-RC1 - - -- OpenTTD Sun, 01 Nov 2015 14:00:00 +0100 - -openttd (1.5.2-0) unstable; urgency=low - - * New upstream release 1.5.2 - - -- OpenTTD Tue, 01 Sep 2015 21:00:00 +0200 - -openttd (1.5.2~RC1-0) unstable; urgency=low - - * New upstream release 1.5.2-RC1 - - -- OpenTTD Sat, 01 Aug 2015 13:00:00 +0200 - -openttd (1.5.1-0) unstable; urgency=low - - * New upstream release 1.5.1 - - -- OpenTTD Mon, 01 Jun 2015 21:00:00 +0200 - -openttd (1.5.1~RC1-0) unstable; urgency=low - - * New upstream release 1.5.1-RC1 - - -- OpenTTD Fri, 08 May 2015 21:00:00 +0200 - -openttd (1.5.0-0) unstable; urgency=low - - * New upstream release 1.5.0 - - -- OpenTTD Wed, 01 Apr 2015 21:00:00 +0200 - -openttd (1.5.0~RC1-0) unstable; urgency=low - - * New upstream release 1.5.0-RC1 - - -- OpenTTD Wed, 18 Mar 2015 21:00:00 +0100 - -openttd (1.5.0~beta2-0) unstable; urgency=low - - * New upstream release 1.5.0-beta2 - - -- OpenTTD Tue, 24 Feb 2015 21:00:00 +0100 - -openttd (1.5.0~beta1-0) unstable; urgency=low - - * New upstream release 1.5.0-beta1 - - -- OpenTTD Wed, 24 Dec 2014 21:00:00 +0100 - -openttd (1.4.4-0) unstable; urgency=low - - * New upstream release 1.4.4 - - -- OpenTTD Tue, 21 Oct 2014 21:00:00 +0200 - -openttd (1.4.4~RC1-0) unstable; urgency=low - - * New upstream release 1.4.4-RC1 - - -- OpenTTD Wed, 08 Oct 2014 19:00:00 +0200 - -openttd (1.4.3-0) unstable; urgency=low - - * New upstream release 1.4.3 - - -- OpenTTD Tue, 23 Sep 2014 21:00:00 +0200 - -openttd (1.4.3~RC2-0) unstable; urgency=low - - * New upstream release 1.4.3-RC2 - - -- OpenTTD Sun, 14 Sep 2014 19:00:00 +0200 - -openttd (1.4.3~RC1-0) unstable; urgency=low - - * New upstream release 1.4.3-RC1 - - -- OpenTTD Sun, 07 Sep 2014 19:00:00 +0200 - -openttd (1.4.2-0) unstable; urgency=low - - * New upstream release 1.4.2 - - -- OpenTTD Sat, 16 Aug 2014 21:00:00 +0200 - -openttd (1.4.2~RC2-0) unstable; urgency=low - - * New upstream release 1.4.2-RC2 - - -- OpenTTD Sun, 03 Aug 2014 18:00:00 +0200 - -openttd (1.4.2~RC1-0) unstable; urgency=low - - * New upstream release 1.4.2-RC1 - - -- OpenTTD Thu, 03 Jul 2014 21:00:00 +0200 - -openttd (1.4.1-0) unstable; urgency=low - - * New upstream release 1.4.1 - - -- OpenTTD Mon, 02 Jun 2014 21:00:00 +0200 - -openttd (1.4.1~RC2-0) unstable; urgency=low - - * New upstream release 1.4.1-RC2 - - -- OpenTTD Sun, 18 May 2014 21:00:00 +0200 - -openttd (1.4.1~RC1-0) unstable; urgency=low - - * New upstream release 1.4.1-RC1 - - -- OpenTTD Sun, 04 May 2014 21:00:00 +0200 - -openttd (1.4.0-0) unstable; urgency=low - - * New upstream release 1.4.0 - - -- OpenTTD Tue, 01 Apr 2014 21:00:00 +0200 - -openttd (1.4.0~RC1-0) unstable; urgency=low - - * New upstream release 1.4.0-RC1 - - -- OpenTTD Tue, 17 Mar 2014 21:00:00 +0100 - -openttd (1.4.0~beta5-0) unstable; urgency=low - - * New upstream release 1.4.0-beta5 - - -- OpenTTD Tue, 25 Feb 2014 10:15:00 +0100 - -openttd (1.4.0~beta4-0) unstable; urgency=low - - * New upstream release 1.4.0-beta4 - - -- OpenTTD Thu, 06 Feb 2014 21:00:00 +0100 - -openttd (1.4.0~beta3-0) unstable; urgency=low - - * New upstream release 1.4.0-beta3 - - -- OpenTTD Tue, 21 Jan 2014 21:00:00 +0100 - -openttd (1.4.0~beta2-0) unstable; urgency=low - - * New upstream release 1.4.0-beta2 - - -- OpenTTD Tue, 07 Jan 2014 21:00:00 +0100 - -openttd (1.4.0~beta1-0) unstable; urgency=low - - * New upstream release 1.4.0-beta1 - - -- OpenTTD Tue, 24 Dec 2013 00:00:00 +0100 - -openttd (1.3.3-0) unstable; urgency=low - - * New upstream release 1.3.3 - - -- OpenTTD Fri, 29 Nov 2013 19:00:00 +0100 - -openttd (1.3.3~RC2-0) unstable; urgency=low - - * New upstream release 1.3.3-RC2 - - -- OpenTTD Sun, 24 Nov 2013 19:00:00 +0100 - -openttd (1.3.3~RC1-0) unstable; urgency=low - - * New upstream release 1.3.3-RC1 - - -- OpenTTD Sun, 17 Nov 2013 19:00:00 +0100 - -openttd (1.3.2-0) unstable; urgency=low - - * New upstream release 1.3.2 - - -- OpenTTD Sat, 27 Jul 2013 18:00:00 +0200 - -openttd (1.3.2~RC2-0) unstable; urgency=low - - * New upstream release 1.3.2-RC2 - - -- OpenTTD Sat, 13 Jul 2013 12:00:00 +0200 - -openttd (1.3.2~RC1-0) unstable; urgency=low - - * New upstream release 1.3.2-RC1 - - -- OpenTTD Sun, 30 Jun 2013 12:00:00 +0200 - -openttd (1.3.1-0) unstable; urgency=low - - * New upstream release 1.3.1 - - -- OpenTTD Sat, 01 Jun 2013 00:00:00 +0300 - -openttd (1.3.1~RC1-0) unstable; urgency=low - - * New upstream release 1.3.1-RC1 - - -- OpenTTD Fri, 17 May 2013 22:00:00 +0200 - -openttd (1.3.0-0) unstable; urgency=low - - * New upstream release 1.3.0 - - -- OpenTTD Mon, 01 Apr 2013 00:00:00 +0200 - -openttd (1.3.0~RC3) unstable; urgency=low - - * New upstream release 1.3.0-RC3 - - -- OpenTTD Mon, 18 Mar 2013 00:00:00 +0100 - -openttd (1.3.0~RC2) unstable; urgency=low - - * New upstream release 1.3.0-RC2 - - -- OpenTTD Tue, 05 Mar 2013 00:00:00 +0100 - -openttd (1.3.0~RC1) unstable; urgency=low - - * New upstream release 1.3.0-RC1 - - -- OpenTTD Tue, 19 Feb 2013 00:00:00 +0100 - -openttd (1.3.0~beta2) unstable; urgency=low - - * New upstream release 1.3.0-beta2 - - -- OpenTTD Thu, 07 Feb 2013 00:00:00 +0100 - -openttd (1.3.0~beta1) unstable; urgency=low - - * New upstream release 1.3.0-beta1 - - -- OpenTTD Mon, 24 Dec 2012 00:00:00 +0100 - -openttd (1.2.3) unstable; urgency=low - - * New upstream release 1.2.3 - - -- OpenTTD Thu, 01 Nov 2012 00:00:00 +0200 - -openttd (1.2.3~RC1) unstable; urgency=low - - * New upstream release 1.2.3-RC1 - - -- OpenTTD Wed, 17 Oct 2012 00:00:00 +0200 - -openttd (1.2.2) unstable; urgency=low - - * New upstream release 1.2.2 - - -- OpenTTD Thu, 16 Aug 2012 20:00:00 +0200 - -openttd (1.2.2~RC1) unstable; urgency=low - - * New upstream release 1.2.2-RC1 - - -- OpenTTD Wed, 01 Aug 2012 00:00:00 +0200 - -openttd (1.2.1) unstable; urgency=low - - * New upstream release 1.2.1 - - -- OpenTTD Fri, 01 Jun 2012 00:00:00 +0200 - -openttd (1.2.1~RC1) unstable; urgency=low - - * New upstream release 1.2.1-RC1 - - -- OpenTTD Wed, 16 Apr 2012 22:00:00 +0200 - -openttd (1.2.0) unstable; urgency=low - - * New upstream release 1.2.0 - - -- OpenTTD Sun, 15 Apr 2012 14:00:00 +0200 - -openttd (1.2.0~RC4) unstable; urgency=low - - * New upstream release 1.2.0-RC4 - - -- OpenTTD Sun, 01 Apr 2012 00:00:00 +0200 - -openttd (1.2.0~RC3) unstable; urgency=low - - * New upstream release 1.2.0-RC3 - - -- OpenTTD Sun, 18 Mar 2012 18:00:00 +0100 - -openttd (1.2.0~RC2) unstable; urgency=low - - * New upstream release 1.2.0-RC2 - - -- OpenTTD Sun, 04 Mar 2012 18:00:00 +0100 - -openttd (1.2.0~RC1) unstable; urgency=low - - * New upstream release 1.2.0-RC1 - - -- OpenTTD Sun, 19 Feb 2012 23:00:00 +0100 - -openttd (1.2.0~beta4) unstable; urgency=low - - * New upstream release 1.2.0-beta4 - - -- OpenTTD Sat, 04 Feb 2012 16:00:00 +0100 - -openttd (1.2.0~beta3) unstable; urgency=low - - * New upstream release 1.2.0-beta3 - - -- OpenTTD Sat, 21 Jan 2012 16:00:00 +0100 - -openttd (1.2.0~beta2) unstable; urgency=low - - * New upstream release 1.2.0-beta2 - - -- OpenTTD Sat, 07 Jan 2012 00:00:00 +0100 - -openttd (1.2.0~beta1) unstable; urgency=low - - * New upstream release 1.2.0-beta1 - - -- OpenTTD Sat, 24 Dec 2011 00:00:00 +0100 - -openttd (1.1.4) unstable; urgency=low - - * New upstream release 1.1.4 - - -- OpenTTD Mon, 05 Dec 2011 00:00:00 +0400 - -openttd (1.1.4-RC1) unstable; urgency=low - - * New upstream release 1.1.4-RC1 - - -- OpenTTD Sun, 20 Nov 2011 17:00:00 +0100 - -openttd (1.1.3) unstable; urgency=low - - * New upstream release 1.1.3 - - -- OpenTTD Thu, 15 Sep 2011 21:00:00 +0200 - -openttd (1.1.3-RC1) unstable; urgency=low - - * New upstream release 1.1.3-RC1 - - -- OpenTTD Sun, 04 Sep 2011 17:00:00 +0200 - -openttd (1.1.2) unstable; urgency=low - - * New upstream release 1.1.2 - - -- OpenTTD Sun, 14 Aug 2011 17:00:00 +0200 - -openttd (1.1.2~RC2) unstable; urgency=low - - * New upstream release 1.1.2-RC2 - - -- OpenTTD Sat, 30 Jul 2011 21:00:00 +0200 - -openttd (1.1.2~RC1) unstable; urgency=low - - * New upstream release 1.1.2-RC1 - - -- OpenTTD Sun, 24 Jul 2011 21:00:00 +0200 - -openttd (1.1.1) unstable; urgency=low - - * New upstream release 1.1.1 - - -- OpenTTD Wed, 01 Jun 2011 00:00:00 +0200 - -openttd (1.1.1~RC1) unstable; urgency=low - - * New upstream release 1.1.1-RC1 - - -- OpenTTD Sun, 15 May 2011 21:00:00 +0200 - -openttd (1.1.0) unstable; urgency=low - - * New upstream release 1.1.0 - - -- OpenTTD Fri, 01 Apr 2011 00:00:00 +0100 - -openttd (1.1.0~RC3) unstable; urgency=low - - * New upstream release 1.1.0-RC3 - - -- OpenTTD Fri, 18 Mar 2011 22:00:00 +0100 - -openttd (1.1.0~RC2) unstable; urgency=low - - * New upstream release 1.1.0-RC2 - - -- OpenTTD Fri, 04 Mar 2011 22:00:00 +0100 - -openttd (1.1.0~RC1) unstable; urgency=low - - * New upstream release 1.1.0-RC1 - - -- OpenTTD Fri, 18 Feb 2011 22:00:00 +0100 - -openttd (1.1.0~beta5) unstable; urgency=low - - * New upstream release 1.1.0-beta5 - - -- OpenTTD Fri, 04 Feb 2011 22:00:00 +0100 - -openttd (1.1.0~beta4) unstable; urgency=low - - * New upstream release 1.1.0-beta4 - - -- OpenTTD Fri, 21 Jan 2011 00:00:00 +0100 - -openttd (1.1.0~beta3) unstable; urgency=low - - * New upstream release 1.1.0-beta3 - - -- OpenTTD Sun, 09 Jan 2011 18:00:00 +0100 - -openttd (1.1.0~beta2) unstable; urgency=low - - * New upstream release 1.1.0-beta2 - - -- OpenTTD Fri, 31 Dec 2010 18:00:00 +0100 - -openttd (1.1.0~beta1) unstable; urgency=low - - * New upstream release 1.1.0-beta1 - - -- OpenTTD Fri, 24 Dec 2010 00:00:00 +0100 - -openttd (1.0.5-0) unstable; urgency=low - - * New upstream release 1.0.5 - - -- OpenTTD Sat, 20 Nov 2010 21:00:00 +0000 - -openttd (1.0.5~rc2-0) unstable; urgency=low - - * New upstream release 1.0.5~rc2 - - -- OpenTTD Sun, 14 Nov 2010 15:00:00 +0000 - -openttd (1.0.5~rc1-0) unstable; urgency=low - - * New upstream release 1.0.5-RC1 - - -- OpenTTD Sun, 31 Oct 2010 15:00:00 +0000 - -openttd (1.0.4-0) unstable; urgency=low - - * New upstream release 1.0.4 - - -- OpenTTD Tue, 14 Sep 2010 20:00:00 +0000 - -openttd (1.0.4~rc1-0) unstable; urgency=low - - * New upstream release 1.0.4-RC1 - - -- OpenTTD Mon, 30 Aug 2010 20:00:00 +0000 - -openttd (1.0.3-0) unstable; urgency=low - - * New upstream release 1.0.3 - - -- OpenTTD Sun, 01 Aug 2010 00:00:00 +0000 - -openttd (1.0.3~rc1-0) unstable; urgency=low - - * New upstream release 1.0.3-RC1 - - -- OpenTTD Sat, 05 Jul 2010 17:37:21 +0000 - -openttd (1.0.2-0) unstable; urgency=low - - * New upstream release 1.0.2 - - -- OpenTTD Sat, 19 Jun 2010 18:36:21 +0000 - -openttd (1.0.2~rc1-0) unstable; urgency=low - - * New upstream release 1.0.2-RC1 - - -- OpenTTD Sat, 05 Jun 2010 23:36:21 +0000 - -openttd (1.0.1-0) unstable; urgency=low - - * New upstream release 1.0.1 - - -- OpenTTD Sat, 01 May 2010 00:00:00 +0200 - -openttd (1.0.1~rc2-0) unstable; urgency=low - - * New upstream release 1.0.1-RC2 - - -- OpenTTD Wed, 21 Apr 2010 21:36:21 +0200 - -openttd (1.0.1~rc1-0) unstable; urgency=low - - * New upstream release 1.0.1-RC1 - - -- OpenTTD Sat, 17 Apr 2010 23:36:21 +0000 - -openttd (1.0.0-1) unstable; urgency=low - - * [30a2162] New upstream release 1.0.0. (Closes: #570104) - * [102698a] Make openttd-wrapper work with older mktemp versions. - - -- Matthijs Kooijman Fri, 02 Apr 2010 23:36:21 +0200 - -openttd (1.0.0~rc3-2) unstable; urgency=low - - * [279c5ef] Recommend openttd-opengfx and suggest openttd-opensfx. - * [9330ad7] Update README.Debian concerning music files. - * [07bde24] Move openttd from contrib to main. (Closes: #560810) - - -- Matthijs Kooijman Thu, 18 Mar 2010 13:16:32 +0100 - -openttd (1.0.0~rc3-1) unstable; urgency=low - - * [412d153] New upstream release 1.0.0~rc3. - - -- Matthijs Kooijman Thu, 18 Mar 2010 10:09:33 +0100 - -openttd (1.0.0~rc2-1) unstable; urgency=low - - * [9c99af4] New upstream release 1.0.0~rc2. - - -- Matthijs Kooijman Thu, 04 Mar 2010 12:22:28 +0100 - -openttd (1.0.0~rc1-1) unstable; urgency=low - - * [fe4eb51] New upstream release 1.0.0~rc1. - * [6aa2be0] Note that the embedded md5 implementation has a different - license. - * [39eb336] Remove lintian override for empty gm directory. - - -- Matthijs Kooijman Fri, 19 Feb 2010 13:00:53 +0100 - -openttd (1.0.0~beta4-1) unstable; urgency=low - - * [6718224] New upstream release 1.0.0~beta4. - * [7b0fa8d] Remove some more docs that we don't want in the package. - * [bb9d744] Use liblzo2 instead of an embedded minilzo version. - * [949c06b] Explicitly disable iconv support. - - -- Matthijs Kooijman Fri, 19 Feb 2010 12:59:27 +0100 - -openttd (0.7.5-4) unstable; urgency=low - - * [174d0b1] Don't use deprecated < in Replaces. - - -- Matthijs Kooijman Mon, 15 Feb 2010 00:35:33 +0100 - -openttd (0.7.5-3) unstable; urgency=low - - * [d12fc5a] Make openttd-data replace openttd (< 0.7.5-2). - (Closes: #569679) - - -- Matthijs Kooijman Sun, 14 Feb 2010 16:56:31 +0100 - -openttd (0.7.5-2) unstable; urgency=low - - [ Matthijs Kooijman ] - * [fbab21d] Switch to source format 3.0 (quilt). - * [85c0c7d] No longer check for (and complain about missing) datafiles - on installation and upgrades. (Closes: #524651, 562574) - * [827eb61] Split the architecture independent data into openttd-data. - (Closes: #492462) - * [6fbd9c7] Update README.Debian. - * [76a5148] Support cross compilation. (Closes: #550951) - * [2005bf8] Simplify the rules file, make debhelper do more stuff. - * [fc0500e] Remove some configure arguments. - * [8ca38bb] Explicitly enable or disable all of the dependencies. - * [e38fb3e] Let the upstream Makefile install documentation. - * [5954fcf] Update the watch file to the new upstream url scheme. - * [7249594] Fix typo in copyright file. - * [660fb61] Bump the Standards-Version to 3.8.4, with no changes - required. - * [f94ab89] Move the packaging git repository to git.debian.org. - - -- Jordi Mallach Tue, 09 Feb 2010 21:40:24 +0100 - -openttd (0.7.5-1) unstable; urgency=high - - * [cdcb73a] Imported Upstream version 0.7.5. This release fixes - CVE-2009-4007. - - -- Matthijs Kooijman Thu, 24 Dec 2009 00:55:45 +0100 - -openttd (0.7.4-1) unstable; urgency=low - - * [a2c297b0] Imported Upstream version 0.7.4 - * [0232a645] Make Debian-specific patches executable. - * [76be04b] Switch the Debian packaging to git. - - -- Matthijs Kooijman Tue, 15 Dec 2009 22:11:52 +0100 - -openttd (0.7.3-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - * Use printf instead of echo -en in openttd-wrapper to make it POSIX - compatible (Closes: #547758). - * Remove three patches that are now included in upstream. - - -- Matthijs Kooijman Thu, 01 Oct 2009 22:52:59 +0200 - -openttd (0.7.2-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - * Bump Standards-Version to 3.8.3, with no changes required. - * Clean up the rules file a bit and add some lintian overrides. - * Explain why openttd is in contrib (Closes: #539381). - * Add the DM-Upload-Allowed control field. - * Re-add dpatch infrastructure. - * Fix the copyright file, since upstream only allows GPLv2, not later - versions. - * Add a section to the copyright file on the different license used by the - "Squirrel" programming language, which is shipped with OpenTTD since - 0.7.0. - * Backport upstream r17226, which removes the deprecated Encoding entry from - the .desktop file. - * Add a wrapper script for openttd, which captures any stderr output and - displays it when openttd returns an error code (Closes: #533557). - * Recommend x11-utils, since we use xmessage for displaying errors. Don't - depend on it, since openttd will still run fine without it, you just won't - see any errors. - * Backport upstream r17227 and r17229, which prevents terminal escape codes - from ending up in the captured error output. - * Backport upstream r17240, which improves stderr output when files are - missing or corrupt. - - -- Jordi Mallach Fri, 21 Aug 2009 15:27:26 +0200 - -openttd (0.7.1-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - * Link against libicu to enable right-to-left language support. - - -- Jordi Mallach Tue, 09 Jun 2009 21:46:28 +0200 - -openttd (0.7.0-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - * Remove Debian specific desktop file, upstream provides one now. - * Add debian/watch file. - - [ Jordi Mallach ] - * Bump Standards-Version to 3.8.1, with no changes required. - * Move to debhelper compat 7. Bump Build-Depends accordingly. - * Use dh_prep. - * Add "set -e" to config script. - * Remove a few extra doc files that get installed by upstream Makefile. - * Add more complete copyright information. - - -- Jordi Mallach Wed, 15 Apr 2009 18:22:10 +0200 - -openttd (0.6.3-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - - [ Jordi Mallach ] - * Add Spanish Debconf template translation, after fixing its corrupted - encoding (thanks, Germana Oliveira, closes: #499214). - - -- Jordi Mallach Thu, 02 Oct 2008 16:59:03 +0200 - -openttd (0.6.2-1) unstable; urgency=low - - * New upstream release. - - Fixes remote crash vulnerability CVE-2008-3547. Closes: #493714 - - -- Matthijs Kooijman Fri, 08 Aug 2008 11:07:05 +0200 - -openttd (0.6.2~rc2-1) experimental; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - - [ Jordi Mallach ] - * Fix typo in README.Debian (lintian). - * Remove dpatch build-dep and the empty debian/patches dir. - * Don't ignore possible "make distclean" errors. - - -- Jordi Mallach Sat, 26 Jul 2008 01:35:30 +0200 - -openttd (0.6.2~rc1-1) experimental; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - - -- Jordi Mallach Thu, 24 Jul 2008 16:09:57 +0200 - -openttd (0.6.1-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release. - * Remove no_install_personal.dpatch, it is included upstream now. - - -- Jordi Mallach Thu, 05 Jun 2008 00:47:36 +0200 - -openttd (0.6.0-2) unstable; urgency=low - - [ Jordi Mallach ] - * Rename XS-Vcs-* to the official Vcs-* fields. - - [ Matthijs Kooijman ] - * Don't install anything into ~ during make install, this prevented - successful builds on some architectures. Fix imported from upstream. - * Put the homepage in its own Homepage field instead of in the description. - * Bump Standards-Version to 3.7.3 - - -- Jordi Mallach Thu, 03 Apr 2008 00:07:10 +0200 - -openttd (0.6.0-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release: - - Adds note about font-configuration for non-latin languages. - Closes: #462604 - * Add .desktop file, provided by Andrea Colangelo. - Closes: #460073 - * Add Finnish Debconf translation, provided by Esko Arajärvi. - Closes: #456956 - - [ Jordi Mallach ] - * Fixes and improvements for the .desktop file according to the spec. - - -- Jordi Mallach Wed, 02 Apr 2008 14:04:40 +0200 - -openttd (0.5.3-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - - -- Jordi Mallach Tue, 18 Sep 2007 12:05:28 +0200 - -openttd (0.5.2-1) unstable; urgency=low - - [ Jordi Mallach ] - * New upstream release. - * Debconf translation updates: - - Catalan. - - [ Christian Perrier ] - * Debconf templates and debian/control reviewed by the debian-l10n- - english team as part of the Smith review project. - Closes: #422183, #419096. - * Debconf translation updates: - - Swedish. Closes: #422780 - - Basque. Closes: #422786 - - Czech. Closes: #422809 - - Galician. Closes: #422831 - - German. Closes: #422908 - - Tamil. Closes: #423079 - - Russian. Closes: #423224 - - Portuguese. Closes: #423413 - - French. Closes: #424436 - - Brazilian Portuguese. Closes: #425585 - - Dutch. Closes: #425707 - - -- Jordi Mallach Sat, 02 Jun 2007 06:24:34 +0200 - -openttd (0.5.1-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - * Add German and Swedish translations (Closes: #420258, #419097) - * Remove bogus fuzzy mark from the Catalan translation - - [ Jordi Mallach ] - * debian/control: add XS-Vcs-Svn and XS-Vcs-Browser fields. - - -- Jordi Mallach Mon, 23 Apr 2007 21:03:06 +0200 - -openttd (0.5.0-2) unstable; urgency=low - - * Upload to Debian. - - -- Jordi Mallach Sun, 11 Mar 2007 14:12:37 +0100 - -openttd (0.5.0-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - - [ Jordi Mallach ] - * Depend on ${misc:Depends}, not debconf directly. - - -- Jordi Mallach Thu, 8 Mar 2007 15:34:54 +0100 - -openttd (0.5.0~rc5-1) unstable; urgency=low - - [ Matthijs Kooijman ] - * New upstream release - * Compile with freetype and fontconfig support. - - [ Jordi Mallach ] - * Convert debconf templates to podebconf. - * Add a Catalan translation. - * Minor packaging cleanups. - - -- Matthijs Kooijman Mon, 12 Feb 2007 09:25:41 +0100 - -openttd (0.5.0~rc4-1) unstable; urgency=low - - * New upstream release - - -- Matthijs Kooijman Thu, 18 Jan 2007 21:17:28 +0100 - -openttd (0.5.0~rc3-1) unstable; urgency=low - - * New upstream release - - -- Matthijs Kooijman Thu, 18 Jan 2007 20:21:04 +0100 - -openttd (0.5.0~rc2-1) unstable; urgency=low - - * New upstream release - * Removed fix for empty scenarios dir, openttd Makefile now properly handles - this. - - -- Matthijs Kooijman Sun, 31 Dec 2006 12:24:37 +0100 - -openttd (0.5.0~rc1-1) unstable; urgency=low - - * New upstream release. - - -- Matthijs Kooijman Fri, 22 Dec 2006 11:03:46 +0100 - -openttd (0.4.8-1) unstable; urgency=low - - * New upstream release - * Bump standards version to 3.7.2 - - -- Matthijs Kooijman Mon, 14 Aug 2006 16:28:50 +0200 - -openttd (0.4.7-1) unstable; urgency=low - - * New upstream release. - - -- Matthijs Kooijman Mon, 27 Mar 2006 23:40:00 +0200 - -openttd (0.4.6-1) unstable; urgency=low - - * New upstream release. - * Remove old terminal messages and make sure that debconf is always called. - - -- Matthijs Kooijman Wed, 8 Mar 2006 23:57:35 +0100 - -openttd (0.4.5-1) unstable; urgency=low - - * New upstream release - * Bump Standards-Version to 3.6.2 - * s/timdity/timidity/ in README.Debian. - * Use debconf for prompting instead of terminal. - * Fix makefile to create icon dir if necessary. - * Fix syntax error in manpage. - - -- Matthijs Kooijman Wed, 1 Feb 2006 01:56:39 +0100 - -openttd (0.4.0.1-5) unstable; urgency=low - - * Fixed capitalization of menu item. - * Install xpm icon to /usr/share/pixmaps and don't install png icon, since - it is not used. - - -- Matthijs Kooijman Thu, 22 Sep 2005 10:35:09 +0200 - -openttd (0.4.0.1-4) unstable; urgency=low - - * Changelog was distributed twice. - * Put openttd in contrib. - - -- Matthijs Kooijman Mon, 19 Sep 2005 23:49:18 +0200 - -openttd (0.4.0.1-3) unstable; urgency=low - - * Clarified installing instructions in README.Debian - - -- Matthijs Kooijman Thu, 16 Jun 2005 03:51:13 +0200 - -openttd (0.4.0.1-2) unstable; urgency=low - - * Added Suggests: timidity, freepats - - -- Matthijs Kooijman Thu, 16 Jun 2005 03:34:03 +0200 - -openttd (0.4.0.1-1) unstable; urgency=low - - * New upstream release - - -- Matthijs Kooijman Mon, 23 May 2005 13:04:24 +0200 - -openttd (0.4.0-1) unstable; urgency=low - - * New upstream release - - -- Matthijs Kooijman Mon, 16 May 2005 00:16:17 +0200 - -openttd (0.3.6-1) unstable; urgency=low - - * New upstream release - * Modified Makefile to install xpm icon and scenarios in /usr/share/games/openttd/ - * Added openttd.32.xpm, openttd.64.xpm was too big - - -- Matthijs Kooijman Tue, 25 Jan 2005 19:21:08 +0100 - -openttd (0.3.5-2) unstable; urgency=low - - * Fixed some lintian warnings. - * Added openttd.64.xpm (icon for menu). - - -- Matthijs Kooijman Mon, 27 Dec 2004 01:51:36 +0100 - -openttd (0.3.5-1) unstable; urgency=low - - * Initial Release. - - -- Matthijs Kooijman Fri, 24 Dec 2004 02:58:47 +0100 diff --git a/os/debian/compat b/os/debian/compat deleted file mode 100644 index 7f8f011eb7..0000000000 --- a/os/debian/compat +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/os/debian/control b/os/debian/control deleted file mode 100644 index 01b66cc494..0000000000 --- a/os/debian/control +++ /dev/null @@ -1,36 +0,0 @@ -Source: openttd -Section: games -Priority: optional -Maintainer: Matthijs Kooijman -Uploaders: Jordi Mallach -Build-Depends: debhelper (>= 7.0.50), libsdl2-dev, zlib1g-dev, libpng-dev, libfreetype6-dev, libfontconfig-dev, libicu-dev, liblzma-dev, liblzo2-dev -Standards-Version: 3.8.4 -Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/openttd.git -Vcs-Git: git://anonscm.debian.org/collab-maint/openttd.git -Homepage: http://www.openttd.org/ - -Package: openttd -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Recommends: openttd-opengfx, x11-utils -Replaces: openttd-data -Conflicts: openttd-data -Suggests: openttd-opensfx, timidity, freepats -Description: reimplementation of Transport Tycoon Deluxe with enhancements - OpenTTD is a reimplementation of the Microprose game "Transport - Tycoon Deluxe" with lots of new features and enhancements. - . - OpenTTD is playable with the free graphics files from the openttd-opengfx - package and optional sound files from the openttd-opensfx package (which is in - non-free). Alternatively, OpenTTD can use the graphics files from the original - Transport Tycoon Deluxe game (See README.Debian on how to set this up). - -Package: openttd-dbg -Architecture: any -Section: debug -Priority: extra -Depends: openttd (= ${binary:Version}), ${misc:Depends} -Description: debugging symbols for openttd - This package contains the debugging symbols for OpenTTD, the reimplementation - of the Micropose game "Transport Tycoon Deluxe" with lots of new features and - enhancements. diff --git a/os/debian/copyright b/os/debian/copyright deleted file mode 100644 index 24d6d7052f..0000000000 --- a/os/debian/copyright +++ /dev/null @@ -1,106 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: OpenTTD -Upstream-Contact: info@openttd.org, #openttd on irc.oftc.net -Source: http://www.openttd.org - - -Files: * -Copyright: © 2004-2019 Ludvig Strigeous and others. -License: GPL-2.0 - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2.0 as - published by the Free Software Foundation; - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - On Debian systems, the complete text of the GNU General Public License - version 2 can be found in `/usr/share/common-licenses/GPL-2'. - -Files: src/3rdparty/squirrel/* -Copyright: © 2003-2009 Alberto Demichelis -License: Zlib - -Files: src/3rdparty/md5/* -Copyright: © 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. -License: Zlib - - -License: Zlib - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - . - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - . - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software in - a product, an acknowledgment in the product documentation would be - appreciated but is not required. - . - 2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - . - 3. This notice may not be removed or altered from any source - distribution. - -Files: os/dos/exe2coff/* -Copyright: © 1998 DJ Delorie -License: GPL-2.0 with additional restrictions - This document is Copyright (C) DJ Delorie and may be distributed - verbatim, but changing it is not allowed. - . - Source code copyright DJ Delorie is distributed under the terms of the - GNU General Public Licence, with the following exceptions: - . - * Sources used to build crt0.o, gcrt0.o, libc.a, libdbg.a, and - libemu.a are distributed under the terms of the GNU Library General - Public License, rather than the GNU GPL. - . - * Any existing copyright or authorship information in any given source - file must remain intact. If you modify a source file, a notice to that - effect must be added to the authorship information in the source file. - . - * Runtime binaries, as provided by DJ in DJGPP, may be distributed - without sources ONLY if the recipient is given sufficient information - to obtain a copy of djgpp themselves. This primarily applies to - go32-v2.exe, emu387.dxe, and stubedit.exe. - . - * Runtime objects and libraries, as provided by DJ in DJGPP, when - linked into an application, may be distributed without sources ONLY - if the recipient is given sufficient information to obtain a copy of - djgpp themselves. This primarily applies to crt0.o and libc.a. - . - On Debian systems, the complete text of the GNU General Public License - version 2 can be found in `/usr/share/common-licenses/GPL-2'. -Comment: - Given only the exe2coff.c file is distributed in the source distribution (and - nothing in Debian binary distribution), it seems only the 2nd condition - applies. - -Files: os/dos/cwsdpmi/* -Source: http://homer.rice.edu/~sandmann/cwsdpmi/index.html -Copyright: © 1995-2000 Charles W Sandmann (sandmann@clio.rice.edu) -License: Custom binary-only license - This is release 5. The files in this binary distribution may be redistributed - under the GPL (with source) or without the source code provided: - . - * CWSDPMI.EXE or CWSDPR0.EXE are not modified in any way except via CWSPARAM. - . - * CWSDSTUB.EXE internal contents are not modified in any way except via - CWSPARAM or STUBEDIT. It may have a COFF image plus data appended to it. - . - * Notice to users that they have the right to receive the source code and/or - binary updates for CWSDPMI. Distributors should indicate a site for the - source in their documentation. -Comment: - Files are distributed as binary only, so the second option in the license - ("without source code provided: ...") is applicable. diff --git a/os/debian/gbp.conf b/os/debian/gbp.conf deleted file mode 100644 index 58b68d336b..0000000000 --- a/os/debian/gbp.conf +++ /dev/null @@ -1,13 +0,0 @@ -[DEFAULT] -# Use pristine-tar -pristine-tar = True - -[git-dch] -# We use metaheaders in commit messages. -meta = True -# Put git commit ids in the debian changelog. -id-length = 7 - -[git-import-orig] -# Use a custom commit message for upstream imports. -import-msg = New upstream release %(version)s. diff --git a/os/debian/menu b/os/debian/menu deleted file mode 100644 index 3afa6e08e8..0000000000 --- a/os/debian/menu +++ /dev/null @@ -1,2 +0,0 @@ -?package(openttd):needs="X11" section="Games/Simulation" title="OpenTTD"\ -command="/usr/games/openttd" icon="/usr/share/pixmaps/openttd.32.xpm" diff --git a/os/debian/openttd-wrapper b/os/debian/openttd-wrapper deleted file mode 100644 index 6f85f00b06..0000000000 --- a/os/debian/openttd-wrapper +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# This is a wrapper script that checks openttd's exit status and -# displays its stderr output - -# Get a file to capture stderr to. Use the deprecated -t option, so this -# works on the old mktemp from the mktemp package (which has been -# replaced by the version from the coreutils package). -TMPFILE=`mktemp -t openttd.errout.XXXXXXXXX` - -if [ ! -w "$TMPFILE" ]; then - xmessage "Could not create temporary file for error messages. Not starting OpenTTD." - exit 1; -fi - -# Capture stderr -openttd "$@" 2> "$TMPFILE" -ERRCODE=$? -if [ "$ERRCODE" -ne 0 ]; then - CODEMSG="OpenTTD returned with error code $ERRCODE." - if [ -s "$TMPFILE" ]; then - MESSAGE="$CODEMSG The following error messages were produced:\n\n" - printf "$MESSAGE" | cat - "$TMPFILE" | fold -s | xmessage -file - - else - xmessage "$CODEMSG No error messages were produced." - fi -fi - -rm -f "$TMPFILE" diff --git a/os/debian/patches/run-openttd-wrapper.patch b/os/debian/patches/run-openttd-wrapper.patch deleted file mode 100644 index ff8fc15aef..0000000000 --- a/os/debian/patches/run-openttd-wrapper.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Matthijs Kooijman -Subject: Use a wrapper script for running openttd - -The wrapper script captures stderr from openttd and displays this in -case of an error. This patch makes the the .desktop file call the -wrapper instead of the openttd binary directly. - -Index: media/openttd.desktop.in -=================================================================== ---- a/media/openttd.desktop.in (revision 20124) -+++ b/media/openttd.desktop.in (working copy) -@@ -5,7 +5,7 @@ - Version=1.1 - Name=!!MENU_NAME!! - Icon=openttd --Exec=!!TTD!! -+Exec=/usr/share/games/openttd/openttd-wrapper - Terminal=false - Categories=!!MENU_GROUP!! - Comment=A clone of Transport Tycoon Deluxe diff --git a/os/debian/patches/series b/os/debian/patches/series deleted file mode 100644 index f7cf2d9d58..0000000000 --- a/os/debian/patches/series +++ /dev/null @@ -1 +0,0 @@ -run-openttd-wrapper.patch diff --git a/os/debian/rules b/os/debian/rules deleted file mode 100755 index b5d67670bd..0000000000 --- a/os/debian/rules +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Makefile to build the openttd debian package. - -# Use debhelper default for all targets (but some are overridden below). -%: - dh --parallel $@ - -DEB_HOST_GNU_TYPE=$(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE=$(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) -ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE)) -CROSS= --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE) -endif - -# This prevents linking uselessly to libicudata and silences a warning -# in the build process. -DEB_LDFLAGS_MAINT_APPEND="-Wl,-as-needed" - -# Enable all hardening options (since openttd offers a network-listening -# service that handles untrusted data). -DEB_BUILD_MAINT_OPTIONS=hardening=+all - -# Load buildflags (this uses dpkg-buildflags). Note that we don't export -# them, but instead pass them to ./configure explicitly. -include /usr/share/dpkg/buildflags.mk - -# Pass custom options to configure. Since it's not autoconf but a custom -# script, some of the option names are slightly different. We also need -# to be explicit about the dependencies, in case we're not running in a -# clean build root. -override_dh_auto_configure: - ./configure $(CROSS) --prefix-dir=/usr --install-dir=debian/openttd --without-allegro --with-zlib --with-sdl --with-png --with-freetype --with-fontconfig --with-icu-sort --with-liblzo2 --with-lzma --without-xdg-basedir --without-iconv --disable-strip CFLAGS="$(CFLAGS) $(CPPFLAGS)" CXXFLAGS="$(CXXFLAGS) $(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" CFLAGS_BUILD="$(CFLAGS) $(CPPFLAGS)" CXXFLAGS_BUILD="$(CXXFLAGS) $(CPPFLAGS)" LDFLAGS_BUILD="$(LDFLAGS)" - -# Do some extra installation -override_dh_auto_install: - $(MAKE) install DO_NOT_INSTALL_CHANGELOG=1 DO_NOT_INSTALL_LICENSE=1 - -# Don't do testing. Because the OpenTTD Makefile always does dependency -# generation (even on invalid targets), dh_auto_test thinks there is a -# "test" target, while there isn't. -override_dh_auto_test: - -# Call mrproper. Again, dh_auto_clean thinks there is a distclean -# target, while there isn't. -override_dh_auto_clean: - [ ! -f Makefile ] || $(MAKE) mrproper - -# We want to strip the debug informatiton into the -dbg package. -override_dh_strip: - dh_strip --dbg-package=openttd-dbg diff --git a/os/debian/source/format b/os/debian/source/format deleted file mode 100644 index 163aaf8d82..0000000000 --- a/os/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/os/debian/watch b/os/debian/watch deleted file mode 100644 index 776381b9c2..0000000000 --- a/os/debian/watch +++ /dev/null @@ -1,5 +0,0 @@ -version=3 - -options=downloadurlmangle=s/(.*)\/index.html$/\1\/openttd-\1-source.tar.gz/ \ -http://master.binaries.openttd.org/releases/ \ -(\d+(?:\.\d+)*)/index.html diff --git a/os/macosx/Info.plist.in b/os/macosx/Info.plist.in new file mode 100644 index 0000000000..b3285589dd --- /dev/null +++ b/os/macosx/Info.plist.in @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${CPACK_BUNDLE_NAME} + CFBundleExecutable + ${CPACK_BUNDLE_NAME} + CFBundleGetInfoString + #CPACK_PACKAGE_VERSION#, Copyright 2004-${CURRENT_YEAR} The OpenTTD team + CFBundleIconFile + ${CPACK_BUNDLE_NAME}.icns + CFBundleIdentifier + org.openttd.openttd + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${CPACK_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + #CPACK_PACKAGE_VERSION# + CFBundleVersion + #CPACK_PACKAGE_VERSION# + NSHumanReadableCopyright + Copyright 2004-${CURRENT_YEAR} The OpenTTD team + NSPrincipalClass + NSApplication + + diff --git a/os/macosx/launch.sh b/os/macosx/launch.sh new file mode 100644 index 0000000000..7b0389d8a5 --- /dev/null +++ b/os/macosx/launch.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +ROOT_DIR=$(dirname "$0")/.. + +export DYLD_LIBRARY_PATH=${ROOT_DIR}/Frameworks + +cd ${ROOT_DIR}/Resources +exec ./openttd "$@" diff --git a/os/macosx/plistgen.sh b/os/macosx/plistgen.sh deleted file mode 100755 index f492bcdcf9..0000000000 --- a/os/macosx/plistgen.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -# sets VERSION to the value if RELEASE if there are any, -# otherwise it sets VERSION to revision number -if [ "$3" ]; then -VERSION="$3" -else -VERSION="$2" -fi -date=`date +%Y` - -# Generates Info.plist while applying $VERSION - -echo " - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - OpenTTD - CFBundleExecutable - openttd - CFBundleGetInfoString - $VERSION, Copyright 2004-$date The OpenTTD team - CFBundleIconFile - openttd.icns - CFBundleIdentifier - org.openttd.openttd - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - OpenTTD - CFBundlePackageType - APPL - CFBundleShortVersionString - $VERSION - CFBundleVersion - $VERSION - NSHumanReadableCopyright - Copyright 2004-$date The OpenTTD team - NSPrincipalClass - NSApplication - -" > "$1"/Contents/Info.plist diff --git a/os/morphos/icons/OpenTTD.info b/os/morphos/icons/OpenTTD.info deleted file mode 100644 index 3a25be683063b654c571d5227b9b691eea11e3ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7341 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 diff --git a/os/morphos/icons/document.info b/os/morphos/icons/document.info deleted file mode 100644 index 877ea3575f767b3f10d68d4da0a28e559253cd91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4451 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 diff --git a/os/morphos/icons/drawer.info b/os/morphos/icons/drawer.info deleted file mode 100644 index 149ef7e101f93210509c256b4794f3c3c2fd78fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5390 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 diff --git a/os/rpm/openttd-rpmlintrc b/os/rpm/openttd-rpmlintrc deleted file mode 100644 index f8d5fb9ed9..0000000000 --- a/os/rpm/openttd-rpmlintrc +++ /dev/null @@ -1,6 +0,0 @@ -# the man page is in the subpackage data -addFilter("openttd.*: W: no-manual-page-for-binary openttd") -# no other package depends on this package, so this should not matter -addFilter("openttd.*: W: file-contains-date-and-time /usr/bin/openttd") -addFilter("openttd.*: W: file-contains-current-date /usr/bin/openttd") - diff --git a/os/rpm/openttd.changes b/os/rpm/openttd.changes deleted file mode 100644 index 351f260799..0000000000 --- a/os/rpm/openttd.changes +++ /dev/null @@ -1,100 +0,0 @@ -------------------------------------------------------------------- -Sun Mar 6 09:36:55 UTC 2011 - ammler@openttdcoop.org - -- upstream update 1.1.0-RC2 - * Feature: XZ/LZMA2 savegame support. New default reduces - savegame size by 10 to 30% with slightly more CPU usage. - (requires xz-devel) - * Feature: Remote administration - * Feature: a lot improvements with GUI - * Feature: Customizable hotkeys - * Sources for openttd.grf are pngs (requires grfcodec >= 5.1) - -------------------------------------------------------------------- -Sun Nov 21 11:11:38 UTC 2010 - ammler@openttdcoop.org - -- upstream update 1.0.5 - * Fix: Reading (very) recently freed memory [CVE-2010-4168] - -------------------------------------------------------------------- -Sun Oct 31 17:53:41 UTC 2010 - ammler@openttdcoop.org - -- upstream update 1.0.4 - * build openttd.grf from source - -------------------------------------------------------------------- -Tue Aug 10 20:16:03 UTC 2010 - ammler@openttdcoop.org - -- upstream update 1.0.3 - -------------------------------------------------------------------- -Wed Jun 23 11:42:59 UTC 2010 - Marcel Gmür - -- upstream update 1.0.2 - * Feature: Translated desktop shortcut comments (r19884) - * many minor Bugfixes - -------------------------------------------------------------------- -Sat May 1 15:59:32 UTC 2010 - Marcel Gmür - -- upstream update 1.0.1 - * Fix: Leaking a file descriptor - * Fix a lot small bugs, like minor desync issues on Mulitplayer -- no strip on make - -------------------------------------------------------------------- -Thu Apr 1 08:53:54 UTC 2010 - Marcel Gmür - -- upstream update 1.0.0 (finally!) - * completely independent game but still working also - with ttd original gaphics, sounds and music -- Add: Recommends openmsx -- requires lzo2 - -------------------------------------------------------------------- -Fri Dec 18 2009 Marcel Gmür - 0.7.4 - -- support for different branches -- easy support for dedicated branch -- let openttd build system make the dektop file -- split the package to data and gui -- disable requires - -------------------------------------------------------------------- -Thu Oct 01 2009 Marcel Gmür - 0.7.3 - -- disable libicu for RHEL4 - -------------------------------------------------------------------- -Sat Sep 26 2009 Marcel Gmür - 0.7.2 - -- no subfolder games for datadir -- cleanup: no post and postun anymore -- Recommends: opengfx (for suse and mandriva) -- add SUSE support - -------------------------------------------------------------------- -Mon Oct 20 2008 Benedikt Brüggemeier - -- Added libicu dependency - -------------------------------------------------------------------- -Thu Sep 23 2008 Benedikt Brüggemeier - -- Merged both versions of the spec file - -------------------------------------------------------------------- -Fri Aug 29 2008 Jonathan Coome - -- Rewrite spec file from scratch. - -------------------------------------------------------------------- -Sat Aug 02 2008 Benedikt Brüggemeier - -- Updated spec file - -------------------------------------------------------------------- -Thu Mar 27 2008 Denis Burlaka - -- Universal spec file - diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec deleted file mode 100644 index 134caad38e..0000000000 --- a/os/rpm/openttd.spec +++ /dev/null @@ -1,272 +0,0 @@ -# -# spec file for package openttd -# -# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. -# Copyright (c) 2007-2019 The OpenTTD developers -# -# All modifications and additions to the file contributed by third parties -# remain the property of their copyright owners, unless otherwise agreed -# upon. The license for this file, and modifications and additions to the -# file, is the same license as for the pristine package itself (unless the -# license for the pristine package is not an Open Source License, in which -# case the license is the MIT License). An "Open Source License" is a -# license that conforms to the Open Source Definition (Version 1.9) -# published by the Open Source Initiative. - -# Please submit bugfixes or comments via http://bugs.opensuse.org/ -# - -Name: openttd -Version: 1.11.beta1 -Release: 0 -%define srcver 1.11.0-beta1 -Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe -License: GPL-2.0 -Group: Amusements/Games/Strategy/Other -Url: http://www.openttd.org - -Source: http://binaries.openttd.org/releases/%{srcver}/%{name}-%{srcver}-source.tar.gz - -%if 0%{?suse_version} || 0%{?mdkversion} -Recommends: %{name}-gui -%endif - -BuildRequires: gcc-c++ -BuildRequires: libpng-devel -BuildRequires: zlib-devel - -%if 0%{?suse_version} || 0%{?mdkversion} -BuildRequires: update-alternatives -Requires: update-alternatives -%else -BuildRequires: chkconfig -Requires: chkconfig -%endif - -%if 0%{?mdkversion} -BuildRequires: liblzma-devel -BuildRequires: liblzo-devel -%else -BuildRequires: lzo-devel -BuildRequires: xz-devel -%endif - -# OBS workaround: needed by libdrm -%if 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 -BuildRequires: kernel -%endif - -# for lzma detection -%if 0%{?suse_version} -BuildRequires: pkg-config -%endif - -# building openttd.grf is not required as it is a) part of source and -# b) required only, if you want to use the original set -%if 0%{?with_grfcodec} -BuildRequires: grfcodec -%endif -# Recommends would fit better but not well supported... -Requires: openttd-opengfx >= 0.4.2 - -Obsoletes: %{name}-data < %{version} -Provides: %{name}-data = %{version} - -BuildRoot: %{_tmppath}/%{name}-%{version}-build - -%description -OpenTTD is a reimplementation of the Microprose game "Transport Tycoon Deluxe" -with lots of new features and enhancements. To play the game you need either -the original data from the game or install the recommend subackages OpenGFX for -free graphics, OpenSFX for free sounds and OpenMSX for free music. - -OpenTTD is licensed under the GNU General Public License version 2.0. For more -information, see the file 'COPYING.md' included with every release and source -download of the game. - -%package gui -Summary: OpenTTD GUI/Client (requires SDL) -Group: Amusements/Games/Strategy/Other - -Requires: %{name} -Conflicts: %{name}-dedicated - -BuildRequires: SDL2-devel -BuildRequires: fontconfig-devel - -%if 0%{?rhel_version} != 600 -BuildRequires: libicu-devel -%endif -%if 0%{?rhel_version} || 0%{?fedora} -BuildRequires: freetype-devel -%endif -%if 0%{?suse_version} || 0%{?mdkversion} -BuildRequires: freetype2-devel -%endif -%if 0%{?suse_version} -BuildRequires: update-desktop-files -%else -BuildRequires: desktop-file-utils -Requires: hicolor-icon-theme -%endif - -%if 0%{?suse_version} || 0%{?mdkversion} -Recommends: openttd-openmsx -Recommends: openttd-opensfx -%endif - -%description gui -OpenTTD is a reimplementation of the Microprose game "Transport Tycoon Deluxe" -with lots of new features and enhancements. To play the game you need either -the original data from the game or install the recommend subackages OpenGFX for -free graphics, OpenSFX for free sounds and OpenMSX for free music. - -This subpackage provides the binary which needs SDL. - -%package dedicated -Summary: OpenTTD Dedicated Server binary (without SDL) -Group: Amusements/Games/Strategy/Other - -Requires: %{name} -Conflicts: %{name}-gui - -%description dedicated -OpenTTD is a reimplementation of the Microprose game "Transport Tycoon Deluxe" -with lots of new features and enhancements. To play the game you need either -the original data from the game or the required package OpenGFX and OpenSFX. - -This subpackage provides the binary without dependency of SDL. - -%prep -%setup -qn openttd%{?branch:-%{branch}}-%{srcver} - -# we build the grfs from sources but validate the result with the existing data -%if 0%{?with_grfcodec} -md5sum bin/data/* > validate.data -%endif - -%build -# first, we build the dedicated binary and copy it to dedicated/ -./configure \ - --prefix-dir="%{_prefix}" \ - --binary-dir="bin" \ - --data-dir="share/%{name}" \ - --enable-dedicated -make %{?_smp_mflags} BUNDLE_DIR="dedicated" bundle - -# then, we build the common gui version which we install the usual way -./configure \ - --prefix-dir="%{_prefix}" \ - --binary-name="%{name}" \ - --binary-dir="bin" \ - --data-dir="share/%{name}" \ - --doc-dir="share/doc/%{name}" \ - --menu-name="OpenTTD%{?branch: %{branch}}" \ - --menu-group="Game;StrategyGame;" - -make %{?_smp_mflags} - -%install -# install the dedicated binary -install -D -m0755 dedicated/openttd %{buildroot}%{_bindir}/%{name}-dedicated -# install the gui binary and rename to openttd-gui -make install INSTALL_DIR=%{buildroot} -mv %{buildroot}%{_bindir}/%{name} %{buildroot}%{_bindir}/%{name}-gui -# we need a dummy target for /etc/alternatives/openttd -mkdir -p %{buildroot}%{_sysconfdir}/alternatives -touch %{buildroot}%{_sysconfdir}/alternatives/%{name} -ln -s -f /etc/alternatives/%{name} %{buildroot}%{_bindir}/%{name} - -%if 0%{?suse_version} -%suse_update_desktop_file -r %{name} Game StrategyGame -%else -%if 0%{?fedora} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 -desktop-file-install --dir=%{buildroot}%{_datadir}/applications \ - --add-category=StrategyGame \ - media/openttd.desktop -%endif -%endif - -%if 0%{?with_grfcodec} -%check -md5sum -c validate.data -%endif - -%post gui -/usr/sbin/update-alternatives --install %{_bindir}/%{name} %{name} %{_bindir}/%{name}-gui 10 -touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : - -%post dedicated -/usr/sbin/update-alternatives --install %{_bindir}/%{name} %{name} %{_bindir}/%{name}-dedicated 0 - -%preun gui -if [ "$1" = 0 ] ; then - /usr/sbin/update-alternatives --remove %{name} %{_bindir}/%{name}-gui -fi - -%preun dedicated -if [ "$1" = 0 ] ; then - /usr/sbin/update-alternatives --remove %{name} %{_bindir}/%{name}-dedicated -fi - -%postun gui -if [ "$1" -eq 0 ] ; then - touch --no-create %{_datadir}/icons/hicolor &>/dev/null - gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : -fi - -%posttrans gui -gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : - -# we need a file in the main package so it will be made -%files -%defattr(-, root, root) -%dir %{_datadir}/doc/%{name} -%dir %{_datadir}/%{name} -%dir %{_datadir}/%{name}/lang -%dir %{_datadir}/%{name}/baseset -%dir %{_datadir}/%{name}/scripts -%dir %{_datadir}/%{name}/ai -%dir %{_datadir}/%{name}/game -%{_datadir}/doc/%{name}/* -%{_datadir}/%{name}/lang/* -%{_datadir}/%{name}/baseset/* -%{_datadir}/%{name}/scripts/* -%{_datadir}/%{name}/ai/* -%{_datadir}/%{name}/game/* -%doc %{_mandir}/man6/%{name}.6.* - -%files gui -%defattr(-, root, root) -%ghost %{_sysconfdir}/alternatives/%{name} -%ghost %{_bindir}/%{name} -%{_bindir}/%{name}-gui -%dir %{_datadir}/icons/hicolor -%dir %{_datadir}/icons/hicolor/16x16 -%dir %{_datadir}/icons/hicolor/16x16/apps -%dir %{_datadir}/icons/hicolor/32x32 -%dir %{_datadir}/icons/hicolor/32x32/apps -%dir %{_datadir}/icons/hicolor/48x48 -%dir %{_datadir}/icons/hicolor/48x48/apps -%dir %{_datadir}/icons/hicolor/64x64 -%dir %{_datadir}/icons/hicolor/64x64/apps -%dir %{_datadir}/icons/hicolor/128x128 -%dir %{_datadir}/icons/hicolor/128x128/apps -%dir %{_datadir}/icons/hicolor/256x256 -%dir %{_datadir}/icons/hicolor/256x256/apps -%{_datadir}/applications/%{name}.desktop -%{_datadir}/icons/hicolor/16x16/apps/%{name}.png -%{_datadir}/icons/hicolor/32x32/apps/%{name}.png -%{_datadir}/icons/hicolor/48x48/apps/%{name}.png -%{_datadir}/icons/hicolor/64x64/apps/%{name}.png -%{_datadir}/icons/hicolor/128x128/apps/%{name}.png -%{_datadir}/icons/hicolor/256x256/apps/%{name}.png -%{_datadir}/pixmaps/%{name}.32.xpm - -%files dedicated -%defattr(-, root, root) -%ghost %{_bindir}/%{name} -%ghost %{_sysconfdir}/alternatives/%{name} -%{_bindir}/%{name}-dedicated - -%changelog diff --git a/os/windows/installer/build_installers.bat b/os/windows/installer/build_installers.bat deleted file mode 100644 index 73a2898da2..0000000000 --- a/os/windows/installer/build_installers.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -"c:\Program Files\NSIS\makensis.exe" /DVERSION_INCLUDE=version_win9x.txt install.nsi > win9x.log -"c:\Program Files\NSIS\makensis.exe" /DVERSION_INCLUDE=version_win32.txt install.nsi > win32.log -"c:\Program Files\NSIS\makensis.exe" /DVERSION_INCLUDE=version_win64.txt install.nsi > win64.log diff --git a/os/windows/installer/cdfinder.ini b/os/windows/installer/cdfinder.ini deleted file mode 100644 index 45f9602f13..0000000000 --- a/os/windows/installer/cdfinder.ini +++ /dev/null @@ -1,26 +0,0 @@ -; Ini file generated by the HM NIS Edit IO designer. -[Settings] -NumFields=3 - -[Field 1] -Type=Groupbox -Text=Transport Tycoon Deluxe Installation location -Left=6 -Right=294 -Top=68 -Bottom=100 - -[Field 2] -Type=DirRequest -Left=10 -Right=290 -Top=80 -Bottom=92 - -[Field 3] -Type=Label -Left=17 -Right=282 -Top=6 -Bottom=64 - diff --git a/os/windows/installer/install.nsi b/os/windows/installer/install.nsi deleted file mode 100644 index 7b93992286..0000000000 --- a/os/windows/installer/install.nsi +++ /dev/null @@ -1,744 +0,0 @@ -# Version numbers to update -!define APPV_MAJOR 1 -!define APPV_MINOR 11 -!define APPV_MAINT 0 -!define APPV_BUILD 0 -!define APPV_EXTRA "-beta1" - -!define APPNAME "OpenTTD" ; Define application name -!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version -!define APPVERSIONINTERNAL "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}.${APPV_BUILD}" ; Define application version in X.X.X.X -!define INSTALLERVERSION ${APPV_MAJOR}${APPV_MINOR}${APPV_MAINT}${APPV_BUILD} -!include ${VERSION_INCLUDE} - -!define APPURLLINK "http://www.openttd.org" -!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}" - -!define OPENGFX_BASE_VERSION "1.2.0" -!define OPENSFX_BASE_VERSION "0.8.0" -!define OPENMSX_BASE_VERSION "1.0.0" - -!define MUI_ICON "..\..\..\media\openttd.ico" -!define MUI_UNICON "..\..\..\media\openttd.ico" -!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome.bmp" -!define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "top.bmp" - -ManifestDPIAware true -BrandingText "OpenTTD Installer" -SetCompressor LZMA - -; Version Info -Var AddWinPrePopulate -VIProductVersion "${APPVERSIONINTERNAL}" -VIAddVersionKey "ProductName" "OpenTTD ${APPBITS}-bit Installer for Windows ${EXTRA_VERSION}" -VIAddVersionKey "Comments" "Installs ${APPNAMEANDVERSION}" -VIAddVersionKey "CompanyName" "OpenTTD Developers" -VIAddVersionKey "FileDescription" "Installs ${APPNAMEANDVERSION}" -VIAddVersionKey "ProductVersion" "${APPVERSION}" -VIAddVersionKey "InternalName" "InstOpenTTD-${APPARCH}" -VIAddVersionKey "FileVersion" "${APPVERSION}-${APPARCH}" -VIAddVersionKey "LegalCopyright" " " -; Main Install settings -Name "${APPNAMEANDVERSION} ${APPBITS}-bit for Windows ${EXTRA_VERSION}" - -; NOTE: Keep trailing backslash! -InstallDirRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Install Folder" -OutFile "openttd-${APPVERSION}-${APPARCH}.exe" -CRCCheck force - -ShowInstDetails show -ShowUninstDetails show - -RequestExecutionLevel admin - -Var SHORTCUTS -Var CDDRIVE - -; Modern interface settings -!include "MUI2.nsh" -!include "InstallOptions.nsh" -!include "WinVer.nsh" - -!define MUI_ABORTWARNING -!define MUI_WELCOMEPAGE_TITLE_3LINES -!insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE "..\..\..\COPYING.md" - -!define MUI_COMPONENTSPAGE_SMALLDESC -!insertmacro MUI_PAGE_COMPONENTS - -;--------------------------------- -; Custom page for finding TTDLX CD -Page custom SelectCDEnter SelectCDExit ": TTD folder" - -!insertmacro MUI_PAGE_DIRECTORY - -;Start Menu Folder Page Configuration -!define MUI_STARTMENUPAGE_DEFAULTFOLDER $SHORTCUTS -!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKEY_LOCAL_MACHINE" -!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" -!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Shortcut Folder" - -!insertmacro MUI_PAGE_STARTMENU "OpenTTD" $SHORTCUTS - -!insertmacro MUI_PAGE_INSTFILES - -!define MUI_FINISHPAGE_TITLE_3LINES -!define MUI_FINISHPAGE_RUN_TEXT "Run ${APPNAMEANDVERSION} now!" -!define MUI_FINISHPAGE_RUN "$INSTDIR\openttd.exe" -!define MUI_FINISHPAGE_LINK "Visit the OpenTTD site for more information" -!define MUI_FINISHPAGE_LINK_LOCATION "${APPURLLINK}" -!define MUI_FINISHPAGE_NOREBOOTSUPPORT -!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.md" -!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED -!define MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT DisableBack - -!insertmacro MUI_PAGE_FINISH -!define MUI_PAGE_HEADER_TEXT "Uninstall ${APPNAMEANDVERSION}" -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES - -; Set languages (first is default language) -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_RESERVEFILE_LANGDLL - -;-------------------------------------------------------------- -; (Core) OpenTTD install section. Copies all internal game data -Section "!OpenTTD" Section1 - ; Make sure to be upgraded OpenTTD is not running - Call CheckOpenTTDRunning - - ; Overwrite files by default, but don't complain on failure - SetOverwrite try - - SetShellVarContext all - - ; Define root variable relative to installer - !define PATH_ROOT "..\..\..\" - - ; Copy language files - SetOutPath "$INSTDIR\lang\" - File ${PATH_ROOT}bin\lang\english.lng - - ; Copy AI files - SetOutPath "$INSTDIR\ai\" - File ${PATH_ROOT}bin\ai\compat_*.nut - - ; Copy Game Script files - SetOutPath "$INSTDIR\game\" - File ${PATH_ROOT}bin\game\compat_*.nut - - ; Copy data files - SetOutPath "$INSTDIR\baseset\" - File ${PATH_ROOT}bin\baseset\*.grf - File ${PATH_ROOT}bin\baseset\*.obg - File ${PATH_ROOT}bin\baseset\*.obm - File ${PATH_ROOT}bin\baseset\*.obs - File ${PATH_ROOT}bin\baseset\opntitle.dat - - ; Copy the scripts - SetOutPath "$INSTDIR\scripts\" - File ${PATH_ROOT}bin\scripts\*.* - Push "$INSTDIR\scripts\README.md" - Call unix2dos - - ; Copy some documentation files - SetOutPath "$INSTDIR\docs\" - File ${PATH_ROOT}docs\multiplayer.md - Push "$INSTDIR\docs\multiplayer.md" - Call unix2dos - - ; Copy the rest of the stuff - SetOutPath "$INSTDIR\" - - ; Copy text files - File ${PATH_ROOT}changelog.txt - Push "$INSTDIR\changelog.txt" - Call unix2dos - File ${PATH_ROOT}COPYING.md - Push "$INSTDIR\COPYING.md" - Call unix2dos - File ${PATH_ROOT}README.md - Push "$INSTDIR\README.md" - Call unix2dos - File ${PATH_ROOT}known-bugs.txt - Push "$INSTDIR\known-bugs.txt" - Call unix2dos - - ; Copy executable - File /oname=openttd.exe ${BINARY_DIR}\openttd.exe - - - ; Delete old files from the main dir. they are now placed in baseset/ and lang/ - Delete "$INSTDIR\*.lng" - Delete "$INSTDIR\*.grf" - Delete "$INSTDIR\sample.cat" - Delete "$INSTDIR\ttd.exe" - Delete "$INSTDIR\data\opntitle.dat" - Delete "$INSTDIR\data\2ccmap.grf" - Delete "$INSTDIR\data\airports.grf" - Delete "$INSTDIR\data\autorail.grf" - Delete "$INSTDIR\data\canalsw.grf" - Delete "$INSTDIR\data\dosdummy.grf" - Delete "$INSTDIR\data\elrailsw.grf" - Delete "$INSTDIR\data\nsignalsw.grf" - Delete "$INSTDIR\data\openttd.grf" - Delete "$INSTDIR\data\roadstops.grf" - Delete "$INSTDIR\data\trkfoundw.grf" - Delete "$INSTDIR\data\openttdd.grf" - Delete "$INSTDIR\data\openttdw.grf" - Delete "$INSTDIR\data\orig_win.obg" - Delete "$INSTDIR\data\orig_dos.obg" - Delete "$INSTDIR\data\orig_dos_de.obg" - Delete "$INSTDIR\data\orig_win.obs" - Delete "$INSTDIR\data\orig_dos.obs" - Delete "$INSTDIR\data\no_sound.obs" - - ; Create the Registry Entries - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Comments" "Visit ${APPURLLINK}" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayIcon" "$INSTDIR\openttd.exe,0" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayName" "OpenTTD ${APPVERSION}" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayVersion" "${APPVERSION}" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "HelpLink" "${APPURLLINK}" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Install Folder" "$INSTDIR" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Publisher" "OpenTTD" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Shortcut Folder" "$SHORTCUTS" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "UninstallString" "$INSTDIR\uninstall.exe" - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "URLInfoAbout" "${APPURLLINK}" - ; This key sets the Version DWORD that new installers will check against - WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Version" ${INSTALLERVERSION} - - !insertmacro MUI_STARTMENU_WRITE_BEGIN "OpenTTD" - CreateShortCut "$DESKTOP\OpenTTD.lnk" "$INSTDIR\openttd.exe" - CreateDirectory "$SMPROGRAMS\$SHORTCUTS" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\OpenTTD.lnk" "$INSTDIR\openttd.exe" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Uninstall.lnk" "$INSTDIR\uninstall.exe" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" "$INSTDIR\README.md" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" "$INSTDIR\Changelog.txt" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Known-bugs.lnk" "$INSTDIR\known-bugs.txt" - CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Docs" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\Multiplayer.lnk" "$INSTDIR\docs\multiplayer.md" - CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Scripts" - CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" "$INSTDIR\scripts\README.md" - !insertmacro MUI_STARTMENU_WRITE_END -SectionEnd - -;-------------------------------------------------------------- -; OpenTTD translation install section. Copies only translations -Section "OpenTTD translations" Section6 - ; Overwrite files by default, but don't complain on failure - SetOverwrite try - - ; Copy language files - SetOutPath "$INSTDIR\lang\" - File ${PATH_ROOT}bin\lang\*.lng -SectionEnd - -;---------------------------------------------------------------------------------- -; OpenGFX files install section. Downloads OpenGFX and installs it -Section "Download OpenGFX (free graphics set)" Section3 - SetOverwrite try - - NSISdl::download "http://binaries.openttd.org/installer/opengfx-${OPENGFX_BASE_VERSION}.7z" "$INSTDIR\baseset\opengfx.7z" - Pop $R0 ;Get the return value - StrCmp $R0 "success" +3 - MessageBox MB_OK "Downloading of OpenGFX failed" - Goto Done - - ; Let's extract the files - SetOutPath "$INSTDIR\baseset\" - NSIS7z::Extract "$INSTDIR\baseset\opengfx.7z" - - Delete "$INSTDIR\baseset\opengfx.7z" - SetOutPath "$INSTDIR\" -Done: - -SectionEnd - -;---------------------------------------------------------------------------------- -; OpenSFX files install section. Downloads OpenSFX and installs it -Section "Download OpenSFX (free sound set)" Section4 - SetOverwrite try - - NSISdl::download "http://binaries.openttd.org/installer/opensfx-${OPENSFX_BASE_VERSION}.7z" "$INSTDIR\baseset\opensfx.7z" - Pop $R0 ;Get the return value - StrCmp $R0 "success" +3 - MessageBox MB_OK "Downloading of OpenSFX failed" - Goto Done - - ; Let's extract the files - SetOutPath "$INSTDIR\baseset\" - NSIS7z::Extract "$INSTDIR\baseset\opensfx.7z" - - Delete "$INSTDIR\baseset\opensfx.7z" - SetOutPath "$INSTDIR\" -Done: - -SectionEnd - -;---------------------------------------------------------------------------------- -; OpenMSX files install section. Downloads OpenMSX and installs it -Section "Download OpenMSX (free music set)" Section5 - SetOverwrite try - - NSISdl::download "http://binaries.openttd.org/installer/openmsx-${OPENMSX_BASE_VERSION}.7z" "$INSTDIR\baseset\openmsx.7z" - Pop $R0 ;Get the return value - StrCmp $R0 "success" +3 - MessageBox MB_OK "Downloading of OpenMSX failed" - Goto Done - - ; Let's extract the files - SetOutPath "$INSTDIR\baseset\" - NSIS7z::Extract "$INSTDIR\baseset\openmsx.7z" - - Delete "$INSTDIR\baseset\openmsx.7z" - SetOutPath "$INSTDIR\" -Done: - -SectionEnd - -;---------------------------------------------------------------------------------- -; TTDLX files install section. Copies all needed TTDLX files from CD or install dir -Section /o "Copy data from Transport Tycoon Deluxe CD-ROM" Section2 - SetOverwrite try - ; Let's copy the files with size approximation - SetOutPath "$INSTDIR\baseset" - CopyFiles "$CDDRIVE\gm\*.gm" "$INSTDIR\baseset\" 1028 - CopyFiles "$CDDRIVE\gm.cat" "$INSTDIR\baseset\gm.cat" 415 - CopyFiles "$CDDRIVE\sample.cat" "$INSTDIR\baseset\sample.cat" 1566 - ; Copy Windows files - CopyFiles "$CDDRIVE\trg1r.grf" "$INSTDIR\baseset\trg1r.grf" 2365 - CopyFiles "$CDDRIVE\trgcr.grf" "$INSTDIR\baseset\trgcr.grf" 260 - CopyFiles "$CDDRIVE\trghr.grf" "$INSTDIR\baseset\trghr.grf" 400 - CopyFiles "$CDDRIVE\trgir.grf" "$INSTDIR\baseset\trgir.grf" 334 - CopyFiles "$CDDRIVE\trgtr.grf" "$INSTDIR\baseset\trgtr.grf" 546 - ; Copy DOS files - CopyFiles "$CDDRIVE\trg1.grf" "$INSTDIR\baseset\trg1.grf" 2365 - CopyFiles "$CDDRIVE\trgc.grf" "$INSTDIR\baseset\trgc.grf" 260 - CopyFiles "$CDDRIVE\trgh.grf" "$INSTDIR\baseset\trgh.grf" 400 - CopyFiles "$CDDRIVE\trgi.grf" "$INSTDIR\baseset\trgi.grf" 334 - CopyFiles "$CDDRIVE\trgt.grf" "$INSTDIR\baseset\trgt.grf" 546 - SetOutPath "$INSTDIR\" -SectionEnd - -;------------------------------------------- -; Install the uninstaller (option is hidden) -Section -FinishSection - WriteUninstaller "$INSTDIR\uninstall.exe" -SectionEnd - -; Modern install component descriptions -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${Section1} "Minimal OpenTTD installation in English. You need at least one of the game graphics and sound sets installed." - !insertmacro MUI_DESCRIPTION_TEXT ${Section6} "Translations of OpenTTD." - !insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Download the free OpenGFX game graphics set. This download is about 3 MiB." - !insertmacro MUI_DESCRIPTION_TEXT ${Section4} "Download the free OpenSFX game sound set. This download is about 10 MiB." - !insertmacro MUI_DESCRIPTION_TEXT ${Section5} "Download the free OpenMSX game music set. This download is about 200 KiB." - !insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Copies the game graphics, sounds and music from the Transport Tycoon Deluxe CD." -!insertmacro MUI_FUNCTION_DESCRIPTION_END - -;----------------------------------------------- -; Uninstall section, deletes all installed files -Section "Uninstall" - SetShellVarContext all - - IfFileExists "$INSTDIR\save" 0 NoRemoveSavedGames - MessageBox MB_YESNO|MB_ICONQUESTION \ - "Remove the save game folders located at $\"$INSTDIR\save$\"?$\n \ - If you choose Yes, your saved games will be deleted." \ - IDYES RemoveSavedGames IDNO NoRemoveSavedGames - RemoveSavedGames: - Delete "$INSTDIR\save\autosave\*" - RMDir "$INSTDIR\save\autosave" - Delete "$INSTDIR\save\*" - RMDir "$INSTDIR\save" - NoRemoveSavedGames: - - IfFileExists "$INSTDIR\scenario" 0 NoRemoveScen - MessageBox MB_YESNO|MB_ICONQUESTION \ - "Remove the scenario folders located at $\"$INSTDIR\scenario$\"?$\n \ - If you choose Yes, your scenarios will be deleted." \ - IDYES RemoveScen IDNO NoRemoveScen - RemoveScen: - Delete "$INSTDIR\scenario\heightmap*" - RMDir "$INSTDIR\scenario\heightmap" - Delete "$INSTDIR\scenario\*" - RMDir "$INSTDIR\scenario" - NoRemoveScen: - - ; Remove from registry... - !insertmacro MUI_STARTMENU_GETFOLDER "OpenTTD" $SHORTCUTS - ReadRegStr $SHORTCUTS HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Shortcut Folder" - - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" - - ; Delete self - Delete "$INSTDIR\uninstall.exe" - - ; Delete Shortcuts - Delete "$DESKTOP\OpenTTD.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\OpenTTD.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Uninstall.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Known-bugs.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Docs\Multiplayer.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Docs\32bpp.lnk" - Delete "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" - - ; Clean up OpenTTD dir - Delete "$INSTDIR\changelog.txt" - Delete "$INSTDIR\README.md" - Delete "$INSTDIR\known-bugs.txt" - Delete "$INSTDIR\openttd.exe" - Delete "$INSTDIR\COPYING.md" - Delete "$INSTDIR\INSTALL.LOG" - Delete "$INSTDIR\crash.log" - Delete "$INSTDIR\crash.dmp" - Delete "$INSTDIR\openttd.cfg" - Delete "$INSTDIR\hs.dat" - Delete "$INSTDIR\cached_sprites.*" - Delete "$INSTDIR\save\autosave\network*.tmp" ; temporary network file - - ; AI files - Delete "$INSTDIR\ai\compat_*.nut" - - ; Game Script files - Delete "$INSTDIR\game\compat_*.nut" - - ; Baseset files - Delete "$INSTDIR\baseset\opntitle.dat" - Delete "$INSTDIR\baseset\openttd.grf" - Delete "$INSTDIR\baseset\orig_extra.grf" - Delete "$INSTDIR\baseset\orig_win.obg" - Delete "$INSTDIR\baseset\orig_dos.obg" - Delete "$INSTDIR\baseset\orig_dos_de.obg" - Delete "$INSTDIR\baseset\orig_win.obs" - Delete "$INSTDIR\baseset\orig_dos.obs" - Delete "$INSTDIR\baseset\no_sound.obs" - Delete "$INSTDIR\baseset\sample.cat" - Delete "$INSTDIR\baseset\trg1r.grf" - Delete "$INSTDIR\baseset\trghr.grf" - Delete "$INSTDIR\baseset\trgtr.grf" - Delete "$INSTDIR\baseset\trgcr.grf" - Delete "$INSTDIR\baseset\trgir.grf" - Delete "$INSTDIR\baseset\trg1.grf" - Delete "$INSTDIR\baseset\trgh.grf" - Delete "$INSTDIR\baseset\trgt.grf" - Delete "$INSTDIR\baseset\trgc.grf" - Delete "$INSTDIR\baseset\trgi.grf" - Delete "$INSTDIR\baseset\gm.cat" - Delete "$INSTDIR\baseset\gm-tto.cat" - Delete "$INSTDIR\baseset\*.gm" - - Delete "$INSTDIR\data\sample.cat" - Delete "$INSTDIR\data\trg1r.grf" - Delete "$INSTDIR\data\trghr.grf" - Delete "$INSTDIR\data\trgtr.grf" - Delete "$INSTDIR\data\trgcr.grf" - Delete "$INSTDIR\data\trgir.grf" - Delete "$INSTDIR\data\trg1.grf" - Delete "$INSTDIR\data\trgh.grf" - Delete "$INSTDIR\data\trgt.grf" - Delete "$INSTDIR\data\trgc.grf" - Delete "$INSTDIR\data\trgi.grf" - Delete "$INSTDIR\gm\*.gm" - - ; Downloaded OpenGFX/OpenSFX/OpenMSX - Delete "$INSTDIR\baseset\opengfx\*" - RMDir "$INSTDIR\baseset\opengfx" - Delete "$INSTDIR\baseset\opensfx\*" - RMDir "$INSTDIR\baseset\opensfx" - Delete "$INSTDIR\baseset\openmsx\*" - RMDir "$INSTDIR\baseset\openmsx" - - Delete "$INSTDIR\data\opengfx\*" - RMDir "$INSTDIR\data\opengfx" - Delete "$INSTDIR\data\opensfx\*" - RMDir "$INSTDIR\data\opensfx" - Delete "$INSTDIR\gm\openmsx\*" - RMDir "$INSTDIR\gm\openmsx" - - ; Language files - Delete "$INSTDIR\lang\*.lng" - - ; Scripts - Delete "$INSTDIR\scripts\*.*" - - ; Documentation - Delete "$INSTDIR\docs\*.*" - - ; Base sets for music - Delete "$INSTDIR\gm\orig_win.obm" - Delete "$INSTDIR\gm\orig_dos.obm" - Delete "$INSTDIR\gm\no_music.obm" - Delete "$INSTDIR\baseset\orig_win.obm" - Delete "$INSTDIR\baseset\orig_dos.obm" - Delete "$INSTDIR\baseset\no_music.obm" - - ; Remove remaining directories - RMDir "$SMPROGRAMS\$SHORTCUTS\Extras\" - RMDir "$SMPROGRAMS\$SHORTCUTS\Scripts\" - RMDir "$SMPROGRAMS\$SHORTCUTS\Docs\" - RMDir "$SMPROGRAMS\$SHORTCUTS" - RMDir "$INSTDIR\ai" - RMDir "$INSTDIR\game" - RMDir "$INSTDIR\data" - RMDir "$INSTDIR\baseset" - RMDir "$INSTDIR\gm" - RMDir "$INSTDIR\lang" - RMDir "$INSTDIR\scripts" - RMDir "$INSTDIR\docs" - RMDir "$INSTDIR" - -SectionEnd - -;------------------------------------------------------------ -; Custom page function to find the TTDLX CD/install location -Function SelectCDEnter - SectionGetFlags ${Section2} $0 - IntOp $1 $0 & 0x80 ; bit 7 set by upgrade, no need to copy files - IntCmp $1 1 DoneCD ; Upgrade doesn't need copy files - - IntOp $0 $0 & 1 - IntCmp $0 1 NoAbort - Abort -NoAbort: - - GetTempFileName $R0 - !insertmacro MUI_HEADER_TEXT "Locate TTD" "Setup needs the location of Transport Tycoon Deluxe in order to continue." - !insertmacro INSTALLOPTIONS_EXTRACT_AS "CDFinder.ini" "CDFinder" - - ClearErrors - ; Now, let's populate $CDDRIVE - ReadRegStr $R0 HKLM "SOFTWARE\Fish Technology Group\Transport Tycoon Deluxe" "HDPath" - IfErrors NoTTD - StrCmp $CDDRIVE "" 0 Populated - StrCpy $CDDRIVE $R0 -Populated: - StrCpy $AddWinPrePopulate "Setup has detected your TTD folder. Don't change the folder. Simply press Next." - Goto TruFinish -NoTTD: - StrCpy $AddWinPrePopulate "Setup couldn't find TTD. Please enter the path where the graphics files from TTD are stored and press Next to continue." -TruFinish: - ClearErrors - !insertmacro INSTALLOPTIONS_WRITE "CDFinder" "Field 2" "State" $CDDRIVE ; TTDLX path - !insertmacro INSTALLOPTIONS_WRITE "CDFinder" "Field 3" "Text" $AddWinPrePopulate ; Caption -DoneCD: - ; Initialize the dialog *AFTER* we've changed the text otherwise we won't see the changes - !insertmacro INSTALLOPTIONS_INITDIALOG "CDFinder" - !insertmacro INSTALLOPTIONS_SHOW -FunctionEnd - -;---------------------------------------------------------------- -; Custom page function when 'next' is selected for the TTDLX path -Function SelectCDExit - !insertmacro INSTALLOPTIONS_READ $CDDRIVE "CDFinder" "Field 2" "State" - ; If trg1r.grf does not exist at the path, retry with DOS version - IfFileExists $CDDRIVE\trg1r.grf "" DosCD - IfFileExists $CDDRIVE\trgir.grf "" NoCD - IfFileExists $CDDRIVE\sample.cat hasCD NoCD -DosCD: - IfFileExists $CDDRIVE\TRG1.GRF "" NoCD - IfFileExists $CDDRIVE\TRGI.GRF "" NoCD - IfFileExists $CDDRIVE\SAMPLE.CAT hasCD NoCD -NoCD: - MessageBox MB_OK "Setup cannot continue without the Transport Tycoon Deluxe location!" - Abort -hasCD: -FunctionEnd - -;------------------------------------------------------------------------------- -; Determine windows version, returns "win9x" if Win9x/Me/2000/XP SP2- or "winnt" for the rest on the stack -Function GetWindowsVersion - GetVersion::WindowsPlatformArchitecture - Pop $R0 - IntCmp $R0 64 WinNT 0 - ClearErrors - StrCpy $R0 "win9x" - ${If} ${IsNT} - ${If} ${IsWinXP} - ${AndIf} ${AtLeastServicePack} 3 - ${OrIf} ${AtLeastWin2003} - GoTo WinNT - ${EndIf} - ${EndIf} - GoTo Done -WinNT: - StrCpy $R0 "winnt" -Done: - Push $R0 -FunctionEnd - -;------------------------------------------------------------------------------- -; Check whether we're not running an installer for 64 bits on 32 bits and vice versa -Function CheckProcessorArchitecture - GetVersion::WindowsPlatformArchitecture - Pop $R0 - IntCmp $R0 64 Win64 0 - ClearErrors - IntCmp ${APPBITS} 64 0 Done - MessageBox MB_YESNO|MB_ICONSTOP "You are trying to install the 64-bit OpenTTD on a 32-bit operating system. This is not going to work. Please download the correct version. Do you really want to continue?" IDYES Done IDNO Abort - GoTo Done -Win64: - ClearErrors - IntCmp ${APPBITS} 64 Done 0 - MessageBox MB_YESNO|MB_ICONINFORMATION "You are trying to install the 32-bit OpenTTD on a 64-bit operating system. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDYES Done IDNO Abort - GoTo Done -Abort: - Quit -Done: -FunctionEnd - -;------------------------------------------------------------------------------- -; Check whether we're not running an installer for NT on 9x and vice versa -Function CheckWindowsVersion - Call GetWindowsVersion - Pop $R0 - StrCmp $R0 "win9x" 0 WinNT - ClearErrors - StrCmp ${APPARCH} "win9x" Done 0 - MessageBox MB_YESNO|MB_ICONSTOP "You are trying to install the Windows XP SP3 and newer version on Windows 95, 98, ME, 2000, or XP without SP3. This will not work - please download the correct version. Do you really want to continue?" IDYES Done IDNO Abort - GoTo Done -WinNT: - ClearErrors - StrCmp ${APPARCH} "win9x" 0 Done - MessageBox MB_YESNO|MB_ICONEXCLAMATION "You are trying to install the Windows 95, 98, 2000 and XP without SP3 version on Windows XP SP3 or newer. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDYES Done IDNO Abort -Abort: - Quit -Done: -FunctionEnd - -;------------------------------------------------------------------------------- -; Check whether OpenTTD is running -Function CheckOpenTTDRunning - IfFileExists "$INSTDIR\openttd.exe" 0 Done -Retry: - FindProcDLL::FindProc "openttd.exe" - Pop $R0 - IntCmp $R0 1 0 Done - ClearErrors - Delete "$INSTDIR\openttd.exe" - IfErrors 0 Done - ClearErrors - MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "OpenTTD is running. Please close it and retry." IDRETRY Retry - Abort -Done: -FunctionEnd - -;------------------------------------------------------------------------------- -; strips all CRs -; and then converts all LFs into CRLFs -; (this is roughly equivalent to "cat file | dos2unix | unix2dos") -; -; usage: -; Push "infile" -; Call unix2dos -; -; beware that this function destroys $0 $1 $2 -Function unix2dos - ClearErrors - - Pop $2 - Rename $2 $2.U2D - FileOpen $1 $2 w - - FileOpen $0 $2.U2D r - - Push $2 ; save name for deleting - - IfErrors unix2dos_done - - ; $0 = file input (opened for reading) - ; $1 = file output (opened for writing) - -unix2dos_loop: - ; read a byte (stored in $2) - FileReadByte $0 $2 - IfErrors unix2dos_done ; EOL - ; skip CR - StrCmp $2 13 unix2dos_loop - ; if LF write an extra CR - StrCmp $2 10 unix2dos_cr unix2dos_write - -unix2dos_cr: - FileWriteByte $1 13 - -unix2dos_write: - ; write byte - FileWriteByte $1 $2 - ; read next byte - Goto unix2dos_loop - -unix2dos_done: - ; close files - FileClose $0 - FileClose $1 - - ; delete original - Pop $0 - Delete $0.U2D - -FunctionEnd - - -Var OLDVERSION -Var UninstallString - -;----------------------------------------------------------------------------------- -; NSIS Initialize function, determine if we are going to install/upgrade or uninstall -Function .onInit - StrCpy $SHORTCUTS "OpenTTD" - - SectionSetSize ${Section3} 6144 - SectionSetSize ${Section4} 13312 - SectionSetSize ${Section5} 1024 - - SectionSetFlags 0 17 - - ; Starts Setup - let's look for an older version of OpenTTD - ReadRegDWORD $R8 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Version" - - IfErrors ShowWelcomeMessage ShowUpgradeMessage -ShowWelcomeMessage: - ReadRegStr $R8 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "Version" - ; In the event someone still has OpenTTD 0.1, this will detect that (that installer used a string instead of dword entry) - IfErrors FinishCallback - -ShowUpgradeMessage: - IntCmp ${INSTALLERVERSION} $R8 VersionsAreEqual InstallerIsOlder WelcomeToSetup -WelcomeToSetup: - ; An older version was found. Let's let the user know there's an upgrade that will take place. - ReadRegStr $OLDVERSION HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayVersion" - ; Gets the older version then displays it in a message box - MessageBox MB_OK|MB_ICONINFORMATION \ - "Welcome to ${APPNAMEANDVERSION} Setup.$\nThis will allow you to upgrade from version $OLDVERSION." - SectionSetFlags ${Section2} 0x80 ; set bit 7 - SectionSetFlags ${Section3} 0x80 ; set bit 7 - SectionSetFlags ${Section4} 0x80 ; set bit 7 - SectionSetFlags ${Section5} 0x80 ; set bit 7 - Goto FinishCallback - -VersionsAreEqual: - ReadRegStr $UninstallString HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "UninstallString" - IfFileExists "$UninstallString" "" FinishCallback - MessageBox MB_YESNO|MB_ICONQUESTION \ - "Setup detected ${APPNAMEANDVERSION} on your system. This is the same version that this program will install.$\nAre you trying to uninstall it?" \ - IDYES DoUninstall IDNO FinishCallback -DoUninstall: ; You have the same version as this installer. This allows you to uninstall. - Exec "$UninstallString" - Quit - -InstallerIsOlder: - MessageBox MB_OK|MB_ICONSTOP \ - "You have a newer version of ${APPNAME}.$\nSetup will now exit." - Quit - -FinishCallback: - ClearErrors - Call CheckProcessorArchitecture - Call CheckWindowsVersion -FunctionEnd -; eof - diff --git a/os/windows/installer/version_win32.txt b/os/windows/installer/version_win32.txt deleted file mode 100644 index 0ac06d0d19..0000000000 --- a/os/windows/installer/version_win32.txt +++ /dev/null @@ -1,5 +0,0 @@ -!define APPBITS 32 ; Define number of bits for the architecture -!define EXTRA_VERSION "XP SP3 and newer" -!define APPARCH "win32" ; Define the application architecture -!define BINARY_DIR "${PATH_ROOT}objs\win32\Release" -InstallDir "$PROGRAMFILES32\OpenTTD\" diff --git a/os/windows/installer/version_win64.txt b/os/windows/installer/version_win64.txt deleted file mode 100644 index 15ef51096b..0000000000 --- a/os/windows/installer/version_win64.txt +++ /dev/null @@ -1,5 +0,0 @@ -!define APPBITS 64 ; Define number of bits for the architecture -!define EXTRA_VERSION "XP and newer" -!define APPARCH "win64" ; Define the application architecture -!define BINARY_DIR "${PATH_ROOT}objs\x64\Release" -InstallDir "$PROGRAMFILES64\OpenTTD\" diff --git a/os/windows/installer/version_win9x.txt b/os/windows/installer/version_win9x.txt deleted file mode 100644 index 603778d73c..0000000000 --- a/os/windows/installer/version_win9x.txt +++ /dev/null @@ -1,5 +0,0 @@ -!define APPBITS 32 ; Define number of bits for the architecture -!define EXTRA_VERSION "95, 98, ME, 2000 and XP SP2 or older" -!define APPARCH "win9x" ; Define the application architecture -!define BINARY_DIR "${PATH_ROOT}objs\release" -InstallDir "$PROGRAMFILES32\OpenTTD\" diff --git a/os/windows/installer/top.bmp b/os/windows/nsis-top.bmp similarity index 100% rename from os/windows/installer/top.bmp rename to os/windows/nsis-top.bmp diff --git a/os/windows/installer/welcome.bmp b/os/windows/nsis-welcome.bmp similarity index 100% rename from os/windows/installer/welcome.bmp rename to os/windows/nsis-welcome.bmp diff --git a/media/openttd.ico b/os/windows/openttd.ico similarity index 100% rename from media/openttd.ico rename to os/windows/openttd.ico From 4218ebc932950a8751146784ea5dad127bc27b10 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 12:01:32 +0200 Subject: [PATCH 06/41] Fix: [AzurePipelines] switch the CI / CD to CMake too This also means dropping Debian/jessie, as it has a CMake that is too old (3.0), with no real path to upgrade. --- azure-pipelines-ci.yml | 41 +++++++++++---- azure-pipelines/templates/ci-opengfx.yml | 13 +++-- azure-pipelines/templates/linux-build.yml | 5 +- .../templates/linux-claim-bundles.yml | 2 +- azure-pipelines/templates/osx-build.yml | 10 ++-- .../templates/osx-dependencies.yml | 7 --- azure-pipelines/templates/release-bundles.yml | 11 +++- .../templates/release-manifest.yml | 4 +- .../templates/release-prepare-source.yml | 4 +- azure-pipelines/templates/release.yml | 50 ++++++++++--------- azure-pipelines/templates/windows-build.yml | 11 ++-- .../templates/windows-dependency-nsis.yml | 26 ---------- cmake/scripts/FindVersion.cmake | 27 ++++++---- 13 files changed, 117 insertions(+), 94 deletions(-) delete mode 100644 azure-pipelines/templates/windows-dependency-nsis.yml diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index 719ac84b56..463d09b8b4 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -14,23 +14,34 @@ jobs: strategy: matrix: Win32: - BuildPlatform: 'Win32' + BuildArch: 'Win32' + VcpkgTargetTriplet: 'x86-windows-static' Win64: - BuildPlatform: 'x64' + BuildArch: 'x64' + VcpkgTargetTriplet: 'x64-windows-static' steps: - template: azure-pipelines/templates/ci-git-rebase.yml - template: azure-pipelines/templates/windows-dependencies.yml - template: azure-pipelines/templates/ci-opengfx.yml + parameters: + SharedFolder: C:/Users/Public/Documents/OpenTTD - template: azure-pipelines/templates/windows-build.yml parameters: - BuildPlatform: $(BuildPlatform) - BuildConfiguration: Debug - - script: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x86 - cd projects - call regression.bat + BuildArch: $(BuildArch) + VcpkgTargetTriplet: $(VcpkgTargetTriplet) + BuildConfiguration: 'Debug' + - task: VSBuild@1 + displayName: 'Prepare regression files' + inputs: + solution: build/regression_files.vcxproj + configuration: 'Debug' + - task: VSBuild@1 displayName: 'Test' + inputs: + solution: build/RUN_TESTS.vcxproj + configuration: 'Debug' + - job: linux displayName: 'Linux' @@ -49,7 +60,10 @@ jobs: steps: - template: azure-pipelines/templates/ci-git-rebase.yml # The dockers already have the dependencies installed - # The dockers already have OpenGFX installed + - template: azure-pipelines/templates/ci-opengfx.yml + parameters: + SharedFolder: /usr/local/share/games/openttd + PrefixCommand: sudo - template: azure-pipelines/templates/linux-build.yml parameters: Image: compile-farm-ci @@ -67,6 +81,13 @@ jobs: - template: azure-pipelines/templates/ci-git-rebase.yml - template: azure-pipelines/templates/osx-dependencies.yml - template: azure-pipelines/templates/ci-opengfx.yml + parameters: + SharedFolder: /Library/Application Support/OpenTTD + PrefixCommand: sudo - template: azure-pipelines/templates/osx-build.yml - - script: 'make regression' + - script: | + set -ex + + cd build + CTEST_OUTPUT_ON_FAILURE=1 make test displayName: 'Test' diff --git a/azure-pipelines/templates/ci-opengfx.yml b/azure-pipelines/templates/ci-opengfx.yml index cdee9feca8..60231e3869 100644 --- a/azure-pipelines/templates/ci-opengfx.yml +++ b/azure-pipelines/templates/ci-opengfx.yml @@ -1,8 +1,13 @@ +parameters: + SharedFolder: '/usr/local/share/games/openttd' + PrefixCommand: '' + steps: - bash: | set -ex - cd bin/baseset - curl -L https://cdn.openttd.org/opengfx-releases/0.6.0/opengfx-0.6.0-all.zip > opengfx-all.zip - unzip opengfx-all.zip - rm -f opengfx-all.zip + ${{ parameters.PrefixCommand }} mkdir -p "${{ parameters.SharedFolder }}/baseset" + cd "${{ parameters.SharedFolder }}/baseset" + ${{ parameters.PrefixCommand }} curl -L https://cdn.openttd.org/opengfx-releases/0.6.0/opengfx-0.6.0-all.zip -o opengfx-all.zip + ${{ parameters.PrefixCommand }} unzip opengfx-all.zip + ${{ parameters.PrefixCommand }} rm -f opengfx-all.zip displayName: 'Install OpenGFX' diff --git a/azure-pipelines/templates/linux-build.yml b/azure-pipelines/templates/linux-build.yml index a173f3364d..88095c9d32 100644 --- a/azure-pipelines/templates/linux-build.yml +++ b/azure-pipelines/templates/linux-build.yml @@ -28,9 +28,12 @@ steps: inputs: command: 'Run an image' imageName: openttd/${{ parameters.Image }}:${{ parameters.Tag }} - volumes: '$(Build.SourcesDirectory):$(Build.SourcesDirectory)' + volumes: | + $(Build.SourcesDirectory):$(Build.SourcesDirectory) + /usr/local/share/games/openttd:/usr/local/share/games/openttd workingDirectory: '$(Build.SourcesDirectory)' containerCommand: ${{ parameters.ContainerCommand }} runInBackground: false envVars: | TARGET_BRANCH + CTEST_OUTPUT_ON_FAILURE=1 diff --git a/azure-pipelines/templates/linux-claim-bundles.yml b/azure-pipelines/templates/linux-claim-bundles.yml index 4434dfcc7d..162584f237 100644 --- a/azure-pipelines/templates/linux-claim-bundles.yml +++ b/azure-pipelines/templates/linux-claim-bundles.yml @@ -1,5 +1,5 @@ steps: # Because we run the compile in a docker (under root), we are not owner # of the 'bundles' folder. Fix that by executing a chown on it. -- bash: sudo chown -R $(id -u):$(id -g) bundles +- bash: sudo chown -R $(id -u):$(id -g) build/bundles displayName: 'Claim bundles folder back' diff --git a/azure-pipelines/templates/osx-build.yml b/azure-pipelines/templates/osx-build.yml index ae1724125d..2baabf9327 100644 --- a/azure-pipelines/templates/osx-build.yml +++ b/azure-pipelines/templates/osx-build.yml @@ -1,5 +1,9 @@ steps: -- script: './configure PKG_CONFIG_PATH=/usr/local/lib/pkgconfig --enable-static' - displayName: 'Configure' -- script: 'make -j2' +- script: | + set -ex + + mkdir build + cd build + cmake .. + make -j2 displayName: 'Build' diff --git a/azure-pipelines/templates/osx-dependencies.yml b/azure-pipelines/templates/osx-dependencies.yml index 0393a56621..d918d12c52 100644 --- a/azure-pipelines/templates/osx-dependencies.yml +++ b/azure-pipelines/templates/osx-dependencies.yml @@ -2,11 +2,4 @@ steps: - script: | set -ex HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config lzo xz libpng freetype - # Remove the dynamic libraries of these libraries, to ensure we use - # the static versions. That is important, as it is unlikely any - # end-user has these brew libraries installed. - rm /usr/local/Cellar/lzo/*/lib/*.dylib - rm /usr/local/Cellar/xz/*/lib/*.dylib - rm /usr/local/Cellar/libpng/*/lib/*.dylib - rm /usr/local/Cellar/freetype/*/lib/*.dylib displayName: 'Install dependencies' diff --git a/azure-pipelines/templates/release-bundles.yml b/azure-pipelines/templates/release-bundles.yml index 9c5a48b966..f9f9fdcdd9 100644 --- a/azure-pipelines/templates/release-bundles.yml +++ b/azure-pipelines/templates/release-bundles.yml @@ -5,7 +5,14 @@ steps: - ${{ if eq(parameters.CalculateChecksums, true) }}: - bash: | set -ex - cd bundles + cd build/bundles + + # CPack generates sha256, but with a slightly different name than + # our own convention. Also, because we rename files, the content + # might be out of date. To be safe, we remove it and replace it + # with our own version. + rm -f *.sha256 + for i in $(ls); do openssl dgst -r -md5 -hex $i > $i.md5sum openssl dgst -r -sha1 -hex $i > $i.sha1sum @@ -15,5 +22,5 @@ steps: - task: PublishBuildArtifacts@1 displayName: 'Publish bundles' inputs: - PathtoPublish: bundles/ + PathtoPublish: build/bundles/ ArtifactName: bundles diff --git a/azure-pipelines/templates/release-manifest.yml b/azure-pipelines/templates/release-manifest.yml index 9e8b486d5c..9fe30717b4 100644 --- a/azure-pipelines/templates/release-manifest.yml +++ b/azure-pipelines/templates/release-manifest.yml @@ -15,6 +15,6 @@ steps: - script: | set -ex ./azure-pipelines/manifest.sh ../a/bundles/ - mkdir -p bundles - mv manifest.yaml bundles/ + mkdir -p build/bundles + mv manifest.yaml build/bundles/ displayName: 'Create manifest.yaml' diff --git a/azure-pipelines/templates/release-prepare-source.yml b/azure-pipelines/templates/release-prepare-source.yml index b20bf0b350..3eb148aef5 100644 --- a/azure-pipelines/templates/release-prepare-source.yml +++ b/azure-pipelines/templates/release-prepare-source.yml @@ -17,7 +17,9 @@ steps: git checkout -B ${BUILD_SOURCEBRANCHNAME} fi - ./findversion.sh > .ottdrev + # Generate .ottdrev, which contains the version information + cmake -DGENERATE_OTTDREV=1 -P cmake/scripts/FindVersion.cmake + ./azure-pipelines/changelog.sh > .changelog TZ='UTC' date +"%Y-%m-%d %H:%M UTC" > .release_date cat .ottdrev | cut -f 1 -d$'\t' > .version diff --git a/azure-pipelines/templates/release.yml b/azure-pipelines/templates/release.yml index b9a5597269..60e2ff5fd1 100644 --- a/azure-pipelines/templates/release.yml +++ b/azure-pipelines/templates/release.yml @@ -22,9 +22,9 @@ jobs: # Copy back release_date, as it is needed for the template 'release-bundles' cp openttd-$(Build.BuildNumber)/.release_date .release_date - mkdir bundles - tar --xz -cf bundles/openttd-$(Build.BuildNumber)-source.tar.xz openttd-$(Build.BuildNumber) - zip -9 -r -q bundles/openttd-$(Build.BuildNumber)-source.zip openttd-$(Build.BuildNumber) + mkdir -p build/bundles + tar --xz -cf build/bundles/openttd-$(Build.BuildNumber)-source.tar.xz openttd-$(Build.BuildNumber) + zip -9 -r -q build/bundles/openttd-$(Build.BuildNumber)-source.zip openttd-$(Build.BuildNumber) displayName: 'Create bundle' - template: release-bundles.yml @@ -39,10 +39,10 @@ jobs: - script: | set -ex - mkdir -p bundles - cp .changelog bundles/changelog.txt - cp .release_date bundles/released.txt - cp README.md bundles/README.md + mkdir -p build/bundles + cp .changelog build/bundles/changelog.txt + cp .release_date build/bundles/released.txt + cp README.md build/bundles/README.md displayName: 'Copy meta files' - template: release-bundles.yml parameters: @@ -73,33 +73,33 @@ jobs: strategy: matrix: Win32: - BuildPlatform: 'Win32' BundlePlatform: 'win32' + BuildArch: 'Win32' + VcpkgTargetTriplet: 'x86-windows-static' Win64: - BuildPlatform: 'x64' BundlePlatform: 'win64' + BuildArch: 'x64' + VcpkgTargetTriplet: 'x64-windows-static' steps: - template: release-fetch-source.yml - template: windows-dependencies.yml - template: windows-dependency-zip.yml - - ${{ if eq(parameters.IsStableRelease, true) }}: - - template: windows-dependency-nsis.yml - template: windows-build.yml parameters: - BuildPlatform: $(BuildPlatform) - BuildConfiguration: Release + BuildArch: $(BuildArch) + VcpkgTargetTriplet: $(VcpkgTargetTriplet) + BuildConfiguration: 'RelWithDebInfo' + - task: VSBuild@1 + displayName: 'Create bundles' + inputs: + solution: build/PACKAGE.vcxproj + configuration: 'RelWithDebInfo' - bash: | set -ex - make -f Makefile.msvc bundle_pdb bundle_zip PLATFORM=$(BundlePlatform) BUNDLE_NAME=openttd-$(Build.BuildNumber)-windows-$(BundlePlatform) - displayName: 'Create bundles' - - ${{ if eq(parameters.IsStableRelease, true) }}: - - bash: | - set -ex - # NSIS will be part of the Hosted image in the next update. Till then, we set the PATH ourself - export PATH="${PATH}:/c/Program Files (x86)/NSIS" - make -f Makefile.msvc bundle_exe PLATFORM=$(BundlePlatform) BUNDLE_NAME=openttd-$(Build.BuildNumber)-windows-$(BundlePlatform) - displayName: 'Create installer bundle' + + cp build/RelWithDebInfo/openttd.pdb build/bundles/openttd-$(Build.BuildNumber)-windows-$(BundlePlatform).pdb + displayName: 'Copy PDB to bundles folder' - template: release-bundles.yml - ${{ if eq(parameters.IsStableRelease, true) }}: @@ -153,7 +153,11 @@ jobs: - template: release-fetch-source.yml - template: osx-dependencies.yml - template: osx-build.yml - - script: 'make bundle_zip bundle_dmg BUNDLE_NAME=openttd-$(Build.BuildNumber)-macosx' + - script: | + set -ex + + cd build + make package displayName: 'Create bundles' - template: release-bundles.yml diff --git a/azure-pipelines/templates/windows-build.yml b/azure-pipelines/templates/windows-build.yml index 117dd062c1..fccf62d7b9 100644 --- a/azure-pipelines/templates/windows-build.yml +++ b/azure-pipelines/templates/windows-build.yml @@ -1,11 +1,16 @@ parameters: - BuildPlatform: '' + BuildArch: '' + VcpkgTargetTriplet: '' + BuildConfiguration: '' steps: +- task: CMake@1 + displayName: 'Configure' + inputs: + cmakeArgs: '.. -G "Visual Studio 15 2017" -A ${{ parameters.BuildArch }} -DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="${{ parameters.VcpkgTargetTriplet }}"' - task: VSBuild@1 displayName: 'Build' inputs: - solution: 'projects/openttd_vs141.sln' - platform: ${{ parameters.BuildPlatform }} + solution: build/openttd.vcxproj configuration: ${{ parameters.BuildConfiguration }} maximumCpuCount: true diff --git a/azure-pipelines/templates/windows-dependency-nsis.yml b/azure-pipelines/templates/windows-dependency-nsis.yml deleted file mode 100644 index 9b54a3ac5f..0000000000 --- a/azure-pipelines/templates/windows-dependency-nsis.yml +++ /dev/null @@ -1,26 +0,0 @@ -parameters: - condition: true - -steps: -- bash: | - set -ex - - mkdir nsis-plugin; cd nsis-plugin - curl -L https://devs.openttd.org/~truebrain/nsis-plugins/Nsis7z.zip > Nsis7z.zip - unzip Nsis7z.zip - cp -R Plugins/* "/c/Program Files (x86)/NSIS/Plugins/" - cd ..; rm -rf nsis-plugin - - mkdir nsis-plugin; cd nsis-plugin - curl -L https://devs.openttd.org/~truebrain/nsis-plugins/NsisGetVersion.zip > NsisGetVersion.zip - unzip NsisGetVersion.zip - cp -R Plugins/* "/c/Program Files (x86)/NSIS/Plugins/x86-ansi/" - cd ..; rm -rf nsis-plugin - - mkdir nsis-plugin; cd nsis-plugin - curl -L https://devs.openttd.org/~truebrain/nsis-plugins/NsisFindProc.zip > NsisFindProc.zip - unzip NsisFindProc.zip - cp -R *.dll "/c/Program Files (x86)/NSIS/Plugins/x86-ansi/" - cd ..; rm -rf nsis-plugin - displayName: 'Install NSIS with the 7z, GetVersion, and FindProc plugins' - condition: and(succeeded(), ${{ parameters.condition }}) diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake index 5edabeb195..00afa15ca4 100644 --- a/cmake/scripts/FindVersion.cmake +++ b/cmake/scripts/FindVersion.cmake @@ -119,16 +119,21 @@ endif () message(STATUS "Version string: ${REV_VERSION}") -message(STATUS "Generating rev.cpp") -configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" - "${FIND_VERSION_BINARY_DIR}/rev.cpp") +if (GENERATE_OTTDREV) + message(STATUS "Generating .ottdrev") + file(WRITE ${CMAKE_SOURCE_DIR}/.ottdrev "${REV_VERSION}\t${REV_ISODATE}\t${REV_MODIFIED}\t${REV_HASH}\t${REV_ISTAG}\t${REV_ISSTABLETAG}\t${REV_YEAR}\n") +else (GENERATE_OTTDREV) + message(STATUS "Generating rev.cpp") + configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" + "${FIND_VERSION_BINARY_DIR}/rev.cpp") -if (WIN32) - message(STATUS "Generating ottdres.rc") - configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" - "${FIND_VERSION_BINARY_DIR}/ottdres.rc") -endif (WIN32) + if (WIN32) + message(STATUS "Generating ottdres.rc") + configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" + "${FIND_VERSION_BINARY_DIR}/ottdres.rc") + endif (WIN32) -message(STATUS "Generating CPackProperties.cmake") -configure_file("${CMAKE_SOURCE_DIR}/CPackProperties.cmake.in" - "${CPACK_BINARY_DIR}/CPackProperties.cmake" @ONLY) + message(STATUS "Generating CPackProperties.cmake") + configure_file("${CMAKE_SOURCE_DIR}/CPackProperties.cmake.in" + "${CPACK_BINARY_DIR}/CPackProperties.cmake" @ONLY) +endif (GENERATE_OTTDREV) From 4d04009d12932270da0e492b155cb2e699389c30 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 12:02:04 +0200 Subject: [PATCH 07/41] Codechange: remove #ifdef from .cpp files to exclude features With CMake, these files are simply not compiled to start with. --- src/music/dmusic.cpp | 5 ----- src/os/windows/string_uniscribe.cpp | 4 ---- src/os/windows/string_uniscribe.h | 4 ---- src/sound/xaudio2_s.cpp | 4 ---- 4 files changed, 17 deletions(-) diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index 780666142c..b7bee4a4fe 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -7,8 +7,6 @@ /** @file dmusic.cpp Playing music via DirectMusic. */ -#ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT - #define INITGUID #include "../stdafx.h" #ifdef WIN32_LEAN_AND_MEAN @@ -1241,6 +1239,3 @@ void MusicDriver_DMusic::SetVolume(byte vol) { _playback.new_volume = vol; } - - -#endif /* WIN32_ENABLE_DIRECTMUSIC_SUPPORT */ diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp index ce433364a1..42a003ae17 100644 --- a/src/os/windows/string_uniscribe.cpp +++ b/src/os/windows/string_uniscribe.cpp @@ -7,8 +7,6 @@ /** @file string_uniscribe.cpp Functions related to laying out text on Win32. */ -#if defined(WITH_UNISCRIBE) - #include "../../stdafx.h" #include "../../debug.h" #include "string_uniscribe.h" @@ -620,5 +618,3 @@ const int *UniscribeParagraphLayout::UniscribeVisualRun::GetGlyphToCharMap() con return this->utf16_to_utf8[this->cur_pos]; } - -#endif /* defined(WITH_UNISCRIBE) */ diff --git a/src/os/windows/string_uniscribe.h b/src/os/windows/string_uniscribe.h index 9470b44b0c..7ec7ca6708 100644 --- a/src/os/windows/string_uniscribe.h +++ b/src/os/windows/string_uniscribe.h @@ -10,8 +10,6 @@ #ifndef STRING_UNISCRIBE_H #define STRING_UNISCRIBE_H -#if defined(WITH_UNISCRIBE) - #include "../../gfx_layout.h" #include "../../string_base.h" #include @@ -85,6 +83,4 @@ public: size_t Prev(IterType what) override; }; -#endif /* defined(WITH_UNISCRIBE) */ - #endif /* STRING_UNISCRIBE_H */ diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp index 5aa0580407..e89e28a78f 100644 --- a/src/sound/xaudio2_s.cpp +++ b/src/sound/xaudio2_s.cpp @@ -7,8 +7,6 @@ /** @file xaudio2_s.cpp XAudio2 sound driver. */ -#ifdef WITH_XAUDIO2 - #include "../stdafx.h" #include "../openttd.h" #include "../driver.h" @@ -267,5 +265,3 @@ void SoundDriver_XAudio2::Stop() FreeLibrary(_xaudio_dll_handle); CoUninitialize(); } - -#endif From 945508b8549505482fd186cc185a93f3fb3e3726 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 7 Apr 2019 12:02:34 +0200 Subject: [PATCH 08/41] Fix: update COMPILING.md stating what changed with CMake --- COMPILING.md | 120 +++++++++++++++++++++------------------------------ 1 file changed, 50 insertions(+), 70 deletions(-) diff --git a/COMPILING.md b/COMPILING.md index 46de5e09e2..64f25f9c22 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -23,7 +23,7 @@ no graphical user interface; you would be building a dedicated server. ## Windows: -You need Microsoft Visual Studio 2015 Update 3 or newer. +You need Microsoft Visual Studio 2017 or more recent. You can download the free Visual Studio Community Edition from Microsoft at https://visualstudio.microsoft.com/vs/community/. @@ -56,86 +56,66 @@ To install both the x64 (64bit) and x86 (32bit) variants (though only one is nec .\vcpkg install liblzma:x86-windows-static libpng:x86-windows-static lzo:x86-windows-static zlib:x86-windows-static ``` -Open the relevant project file and it should build automatically. -- VS 2015: projects/openttd_vs140.sln -- VS 2017: projects/openttd_vs141.sln -- VS 2019: projects/openttd_vs142.sln +You can open the folder (as a CMake project). CMake will be detected, and you can compile from there. -Set the build mode to `Release` in -`Build > Configuration manager > Active solution configuration`. -You can now compile. +Alternatively, you can create a MSVC project file via CMake. For this +either download CMake from https://cmake.org/download/ or use the version +that comes with vcpkg. After that, you can run something similar to this: -If everything works well the binary should be in `objs\Win[32|64]\Release\openttd.exe` -and in `bin\openttd.exe` +```powershell +mkdir build +cd build +cmake.exe .. -G'Visual Studio 16 2019' -DCMAKE_TOOLCHAIN_FILE="\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-static" +``` -The OpenTTD wiki may provide additional help with [compiling for Windows](https://wiki.openttd.org/Compiling_on_Windows_using_Microsoft_Visual_C%2B%2B_2015). +Change `` to where you have installed vcpkg. After this +in the build folder are MSVC project files. MSVC can rebuild the project +files himself via the `ZERO_CHECK` project. -You can also build OpenTTD with MSYS2/MinGW-w64 or Cygwin/MinGW using the Makefile. The OpenTTD wiki may provide additional help with [MSYS2](https://wiki.openttd.org/Compiling_on_Windows_using_MSYS2) +## All other platforms -## Linux, Unix, Solaris: - -OpenTTD can be built with GNU '`make`'. On non-GNU systems it is called '`gmake`'. -However, for the first build one has to do a '`./configure`' first. - -The OpenTTD wiki may provide additional help with: - -- [compiling for Linux and *BSD](https://wiki.openttd.org/Compiling_on_%28GNU/%29Linux_and_*BSD) -- [compiling for Solaris](https://wiki.openttd.org/Compiling_on_Solaris) - - -## macOS: - -Use '`make`' or Xcode (which will then call make for you) -This will give you a binary for your CPU type (PPC/Intel) -However, for the first build one has to do a '`./configure`' first. -To make a universal binary type '`./configure --enable-universal`' -instead of '`./configure`'. - -The OpenTTD wiki may provide additional help with [compiling for macOS](https://wiki.openttd.org/Compiling_on_Mac_OS_X). - -## Haiku: - -Use '`make`', but do a '`./configure`' before the first build. - -The OpenTTD wiki may provide additional help with [compiling for Haiku](https://wiki.openttd.org/Compiling_on_Haiku). - -## OS/2: - -A comprehensive GNU build environment is required to build the OS/2 version. - -The OpenTTD wiki may provide additional help with [compiling for OS/2](https://wiki.openttd.org/Compiling_on_OS/2). +```bash +mkdir build +cd build +cmake .. +make +``` ## Supported compilers -The following compilers are tested with and known to compile OpenTTD: - -- Microsoft Visual C++ (MSVC) 2015, 2017 and 2019. -- GNU Compiler Collection (GCC) 4.8 - 9. -- Clang/LLVM 3.9 - 8 - -The following compilers are known not to compile OpenTTD: - -In general, this is because these old versions do not (fully) support modern -C++11 language features. - -- Microsoft Visual C++ (MSVC) 2013 and earlier. -- GNU Compiler Collection (GCC) 4.7 and earlier. -- Clang/LLVM 3.8 and earlier. - -If any of these, or any other, compilers can compile OpenTTD, let us know. -Pull requests to support more compilers are welcome. +Every compiler that is supported by CMake and supports C++11, should be +able to compile OpenTTD. As the exact list of compilers changes constantly, +we refer to the compiler manual to see if it supports C++11, and to CMake +to see if it supports your compiler. ## Compilation of base sets To recompile the extra graphics needed to play with the original Transport Tycoon Deluxe graphics you need GRFCodec (which includes NFORenum) as well. -GRFCodec can be found at https://www.openttd.org/download-grfcodec. -The compilation of these extra graphics does generally not happen, unless -you remove the graphics file using '`make maintainer-clean`'. +GRFCodec can be found at +https://www.openttd.org/downloads/grfcodec-releases/latest.html. -Re-compilation of the base sets, thus also use of '`--maintainer-clean`' can -leave the repository in a modified state as different grfcodec versions can -cause binary differences in the resulting grf. Also translations might have -been added for the base sets which are not yet included in the base set -information files. Use the configure option '`--without-grfcodec`' to avoid -modification of the base set files by the build process. +Having GRFCodec installed can cause regeneration of the `.grf` files, which +are written in the source directory. This can leave your repository in a +modified state, as different GRFCodec versions can cause binary differences +in the resulting `.grf` files. Also translations might have been added for +the base sets which are not yet included in the base set information files. +To avoid this behaviour, disable GRFCodec (and NFORenum) in CMake cache +(`GRFCODEC_EXECUTABLE` and `NFORENUM_EXECUTABLE`). + +## Developers settings + +You can control some flags directly via `CXXFLAGS` (any combination +of these flags will work fine too): + +- `-DRANDOM_DEBUG`: this helps with debugging desyncs. +- `-fno-inline`: this avoids creating inline functions; this can make + debugging a lot easier. +- `-O0`: this disables all optimizations; this can make debugging a + lot easier. +- `-p`: this enables profiling. + +Always use a clean buildfolder if you changing `CXXFLAGS`, as this +value is otherwise cached. Example use: + +`CXXFLAGS="-fno-inline" cmake ..` From 877d196ef5c28321d94c9dfd978b7cae35672533 Mon Sep 17 00:00:00 2001 From: glx Date: Fri, 5 Jun 2020 21:43:22 +0200 Subject: [PATCH 09/41] Fix: Incorrect REV_YEAR, and parsing of .ottdrev --- cmake/scripts/FindVersion.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake index 00afa15ca4..d48664fc89 100644 --- a/cmake/scripts/FindVersion.cmake +++ b/cmake/scripts/FindVersion.cmake @@ -49,7 +49,7 @@ if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") ) string(REGEX REPLACE "([0-9]+)-([0-9]+)-([0-9]+).*" "\\1\\2\\3" COMMITDATE "${COMMITDATE}") set(REV_ISODATE "${COMMITDATE}") - string(SUBSTRING REV_ISODATE 1 4 REV_YEAR) + string(SUBSTRING "${REV_ISODATE}" 0 4 REV_YEAR) # Get the branch execute_process(COMMAND ${GIT_EXECUTABLE} symbolic-ref -q HEAD @@ -98,6 +98,7 @@ if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") set(ENV{LC_ALL} "${SAVED_LC_ALL}") elseif (EXISTS "${CMAKE_SOURCE_DIR}/.ottdrev") file(READ "${CMAKE_SOURCE_DIR}/.ottdrev" OTTDREV) + string(REPLACE "\n" "" OTTDREV "${OTTDREV}") string(REPLACE "\t" ";" OTTDREV "${OTTDREV}") list(GET OTTDREV 0 REV_VERSION) list(GET OTTDREV 1 REV_ISODATE) From b145ee310c042212ce5d6520383f7ef2e5691c21 Mon Sep 17 00:00:00 2001 From: glx Date: Sat, 6 Jun 2020 17:48:18 +0200 Subject: [PATCH 10/41] Fix: MacOS bundle creation --- cmake/PackageBundle.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/PackageBundle.cmake b/cmake/PackageBundle.cmake index 6d0085a32a..a443da3c4b 100644 --- a/cmake/PackageBundle.cmake +++ b/cmake/PackageBundle.cmake @@ -18,6 +18,7 @@ install( CODE " include(BundleUtilities) + set(BU_CHMOD_BUNDLE_ITEMS TRUE) fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/openttd\" \"\" \"\") " DESTINATION . From 3d8597d42ef5ef10325389aa866c8c136cde9412 Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Thu, 4 Jun 2020 14:25:23 +1200 Subject: [PATCH 11/41] Cleanup: Add undocumented parameter to GetSpriteSize. --- src/gfx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gfx.cpp b/src/gfx.cpp index 0768373416..a5e5772050 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -902,6 +902,7 @@ void DrawCharCentered(WChar c, int x, int y, TextColour colour) * Get the size of a sprite. * @param sprid Sprite to examine. * @param[out] offset Optionally returns the sprite position offset. + * @param zoom The zoom level applicable to the sprite. * @return Sprite size in pixels. * @note The size assumes (0, 0) as top-left coordinate and ignores any part of the sprite drawn at the left or above that position. */ From fe1925931d671f7ff02c29558b2c61ae9fc8fbb5 Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Sat, 6 Jun 2020 16:15:23 +1200 Subject: [PATCH 12/41] Cleanup: Correct typographic errors in code comments. --- src/cargopacket.h | 4 ++-- src/video/null_v.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cargopacket.h b/src/cargopacket.h index e34298895c..9892956211 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -423,7 +423,7 @@ public: uint Reroute(uint max_move, VehicleCargoList *dest, StationID avoid, StationID avoid2, const GoodsEntry *ge); /** - * Are two the two CargoPackets mergeable in the context of + * Are the two CargoPackets mergeable in the context of * a list of CargoPackets for a Vehicle? * @param cp1 First CargoPacket. * @param cp2 Second CargoPacket. @@ -486,7 +486,7 @@ public: while (!next.IsEmpty()) { if (this->packets.find(next.Pop()) != this->packets.end()) return true; } - /* Packets for INVALID_STTION can go anywhere. */ + /* Packets for INVALID_STATION can go anywhere. */ return this->packets.find(INVALID_STATION) != this->packets.end(); } diff --git a/src/video/null_v.cpp b/src/video/null_v.cpp index 2fa45e1bc8..707045040d 100644 --- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -5,7 +5,7 @@ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ -/** @file null_v.cpp The videio driver that doesn't blit. */ +/** @file null_v.cpp The video driver that doesn't blit. */ #include "../stdafx.h" #include "../gfx_func.h" From 90e849198fbac0136ca9bb9149e53f25265eeab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Sun, 7 Jun 2020 12:06:40 +0200 Subject: [PATCH 13/41] Fix: [CMake] Error when SDL2 provides SDL2Config --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77ae77cef3..7b9788f2e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,7 +157,7 @@ link_package(XDG_basedir) if (NOT OPTION_DEDICATED) link_package(Fluidsynth) link_package(SDL) - link_package(SDL2) + link_package(SDL2 TARGET SDL2::SDL2) link_package(Allegro) link_package(FREETYPE TARGET Freetype::Freetype) link_package(Fontconfig TARGET Fontconfig::Fontconfig) From f51e66f697e2956d57671afd90a57ca932356756 Mon Sep 17 00:00:00 2001 From: glx22 Date: Sun, 7 Jun 2020 02:52:37 +0200 Subject: [PATCH 14/41] Fix: Restore zip bundle for MacOS --- cmake/InstallAndPackage.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index d23fa92b7c..1994c07089 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -81,7 +81,7 @@ set(CPACK_STRIP_FILES YES) set(CPACK_OUTPUT_FILE_PREFIX "bundles") if (APPLE) - set(CPACK_GENERATOR "Bundle") + set(CPACK_GENERATOR "ZIP;Bundle") include(PackageBundle) set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx") From 3d766775948fefa9ffe6e564dce844b24e2f11e0 Mon Sep 17 00:00:00 2001 From: glx22 Date: Sun, 7 Jun 2020 04:34:50 +0200 Subject: [PATCH 15/41] Fix: Generate windows installer only for stable releases --- azure-pipelines/templates/release.yml | 2 ++ azure-pipelines/templates/windows-build.yml | 3 ++- cmake/InstallAndPackage.cmake | 7 +++++-- cmake/Options.cmake | 2 ++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/azure-pipelines/templates/release.yml b/azure-pipelines/templates/release.yml index 60e2ff5fd1..9c126a8f37 100644 --- a/azure-pipelines/templates/release.yml +++ b/azure-pipelines/templates/release.yml @@ -90,6 +90,8 @@ jobs: BuildArch: $(BuildArch) VcpkgTargetTriplet: $(VcpkgTargetTriplet) BuildConfiguration: 'RelWithDebInfo' + ${{ if eq(parameters.IsStableRelease, true) }}: + OptionUseNSIS: "YES" - task: VSBuild@1 displayName: 'Create bundles' inputs: diff --git a/azure-pipelines/templates/windows-build.yml b/azure-pipelines/templates/windows-build.yml index fccf62d7b9..07e42a7cee 100644 --- a/azure-pipelines/templates/windows-build.yml +++ b/azure-pipelines/templates/windows-build.yml @@ -2,12 +2,13 @@ parameters: BuildArch: '' VcpkgTargetTriplet: '' BuildConfiguration: '' + OptionUseNSIS: 'NO' steps: - task: CMake@1 displayName: 'Configure' inputs: - cmakeArgs: '.. -G "Visual Studio 15 2017" -A ${{ parameters.BuildArch }} -DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="${{ parameters.VcpkgTargetTriplet }}"' + cmakeArgs: '.. -G "Visual Studio 15 2017" -A ${{ parameters.BuildArch }} -DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="${{ parameters.VcpkgTargetTriplet }}" -DOPTION_USE_NSIS="${{ parameters.OptionUseNSIS }}"' - task: VSBuild@1 displayName: 'Build' inputs: diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 1994c07089..1cc539d2d3 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -86,8 +86,11 @@ if (APPLE) set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx") elseif (WIN32) - set(CPACK_GENERATOR "ZIP;NSIS") - include(PackageNSIS) + set(CPACK_GENERATOR "ZIP") + if (OPTION_USE_NSIS) + list(APPEND CPACK_GENERATOR "NSIS") + include(PackageNSIS) + endif (OPTION_USE_NSIS) set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-windows-${CPACK_SYSTEM_NAME}") elseif (UNIX) diff --git a/cmake/Options.cmake b/cmake/Options.cmake index b292567f04..51c8b78860 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -50,6 +50,7 @@ function(set_options) option(OPTION_INSTALL_FHS "Install with Filesstem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" YES) option(OPTION_USE_THREADS "Use threads" YES) + option(OPTION_USE_NSIS "Use NSIS to create windows installer; enable only for stable releases" NO) endfunction() # Show the values of the generic options. @@ -61,6 +62,7 @@ function(show_options) message(STATUS "Option Install FHS - ${OPTION_INSTALL_FHS}") message(STATUS "Option Use assert - ${OPTION_USE_ASSERTS}") message(STATUS "Option Use threads - ${OPTION_USE_THREADS}") + message(STATUS "Option Use NSIS - ${OPTION_USE_NSIS}") endfunction() # Add the definitions for the options that are selected. From 1e01982a2e36b532d0bdf3768827eb7233b0ecee Mon Sep 17 00:00:00 2001 From: glx22 Date: Sun, 7 Jun 2020 15:03:55 +0200 Subject: [PATCH 16/41] Fix: Restore compression of pdb --- azure-pipelines/templates/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines/templates/release.yml b/azure-pipelines/templates/release.yml index 9c126a8f37..8a666ad5a8 100644 --- a/azure-pipelines/templates/release.yml +++ b/azure-pipelines/templates/release.yml @@ -101,6 +101,7 @@ jobs: set -ex cp build/RelWithDebInfo/openttd.pdb build/bundles/openttd-$(Build.BuildNumber)-windows-$(BundlePlatform).pdb + xz -9 build/bundles/openttd-$(Build.BuildNumber)-windows-$(BundlePlatform).pdb displayName: 'Copy PDB to bundles folder' - template: release-bundles.yml From 0b86bd8b03a333b2c0a1900901c3535a188e475d Mon Sep 17 00:00:00 2001 From: glx22 Date: Sun, 7 Jun 2020 16:11:36 +0200 Subject: [PATCH 17/41] Fix: CMake option values should be ON/OFF --- azure-pipelines/templates/release.yml | 2 +- azure-pipelines/templates/windows-build.yml | 2 +- cmake/Options.cmake | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/azure-pipelines/templates/release.yml b/azure-pipelines/templates/release.yml index 8a666ad5a8..f6a00b7cf2 100644 --- a/azure-pipelines/templates/release.yml +++ b/azure-pipelines/templates/release.yml @@ -91,7 +91,7 @@ jobs: VcpkgTargetTriplet: $(VcpkgTargetTriplet) BuildConfiguration: 'RelWithDebInfo' ${{ if eq(parameters.IsStableRelease, true) }}: - OptionUseNSIS: "YES" + OptionUseNSIS: "ON" - task: VSBuild@1 displayName: 'Create bundles' inputs: diff --git a/azure-pipelines/templates/windows-build.yml b/azure-pipelines/templates/windows-build.yml index 07e42a7cee..ae3b894144 100644 --- a/azure-pipelines/templates/windows-build.yml +++ b/azure-pipelines/templates/windows-build.yml @@ -2,7 +2,7 @@ parameters: BuildArch: '' VcpkgTargetTriplet: '' BuildConfiguration: '' - OptionUseNSIS: 'NO' + OptionUseNSIS: 'OFF' steps: - task: CMake@1 diff --git a/cmake/Options.cmake b/cmake/Options.cmake index 51c8b78860..0e8063fac0 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -41,16 +41,16 @@ endfunction() # function(set_options) if (UNIX AND NOT APPLE) - set(DEFAULT_OPTION_INSTALL_FHS YES) + set(DEFAULT_OPTION_INSTALL_FHS ON) else (UNIX AND NOT APPLE) - set(DEFAULT_OPTION_INSTALL_FHS NO) + set(DEFAULT_OPTION_INSTALL_FHS OFF) endif (UNIX AND NOT APPLE) - option(OPTION_DEDICATED "Build dedicated server only (no GUI)" NO) + option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF) option(OPTION_INSTALL_FHS "Install with Filesstem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) - option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" YES) - option(OPTION_USE_THREADS "Use threads" YES) - option(OPTION_USE_NSIS "Use NSIS to create windows installer; enable only for stable releases" NO) + option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON) + option(OPTION_USE_THREADS "Use threads" ON) + option(OPTION_USE_NSIS "Use NSIS to create windows installer; enable only for stable releases" OFF) endfunction() # Show the values of the generic options. From 40436019fd05abf5c92daf8a6d0388d32a36c5a3 Mon Sep 17 00:00:00 2001 From: Miguel Horta Date: Mon, 8 Jun 2020 21:22:49 +0100 Subject: [PATCH 18/41] Fix: Display banlist's indexes correctly Bug introduced via commit ab711e6942 --- src/console_cmds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 4706bfd914..857dc61ad9 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -606,6 +606,7 @@ DEF_CONSOLE_CMD(ConBanList) uint i = 1; for (const auto &entry : _network_ban_list) { IConsolePrintF(CC_DEFAULT, " %d) %s", i, entry.c_str()); + i++; } return true; From caab095e4ea202ccbe09b4c3f2ea6e36070bef29 Mon Sep 17 00:00:00 2001 From: arikover Date: Tue, 9 Jun 2020 11:58:02 +0200 Subject: [PATCH 19/41] Fix: [CMake] SDL2 Sound was not included --- src/sound/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 35f65d1205..24a38e409f 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -11,6 +11,12 @@ if (NOT OPTION_DEDICATED) CONDITION SDL_FOUND ) + add_files( + sdl2_s.cpp + sdl_s.h + CONDITION SDL2_FOUND + ) + add_files( cocoa_s.cpp cocoa_s.h From 8652a4db76c978598918bfdb600a3453d794930a Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Mon, 8 Jun 2020 10:38:06 +1200 Subject: [PATCH 20/41] Cleanup: Give `SetDirtyBlocks` a more descriptive name. --- src/gfx.cpp | 27 ++++++++++++++++++--------- src/gfx_func.h | 2 +- src/news_gui.cpp | 2 +- src/viewport.cpp | 2 +- src/widget.cpp | 2 +- src/window.cpp | 4 ++-- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index a5e5772050..6039946fc6 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1416,6 +1416,16 @@ void DrawMouseCursor() _cursor.dirty = false; } +/** + * Repaints a specific rectangle of the screen. + * + * @param left,top,right,bottom The area of the screen that needs repainting + * @pre The rectangle should have been previously marked dirty with \c AddDirtyBlock. + * @see AddDirtyBlock + * @see DrawDirtyBlocks + * @ingroup dirty + * + */ void RedrawScreenRect(int left, int top, int right, int bottom) { assert(right <= _screen.width && bottom <= _screen.height); @@ -1438,7 +1448,9 @@ void RedrawScreenRect(int left, int top, int right, int bottom) /** * Repaints the rectangle blocks which are marked as 'dirty'. * - * @see SetDirtyBlocks + * @see AddDirtyBlock + * + * @ingroup dirty */ void DrawDirtyBlocks() { @@ -1541,21 +1553,18 @@ void DrawDirtyBlocks() } /** - * This function extends the internal _invalid_rect rectangle as it - * now contains the rectangle defined by the given parameters. Note - * the point (0,0) is top left. + * Extend the internal _invalid_rect rectangle to contain the rectangle + * defined by the given parameters. Note the point (0,0) is top left. * * @param left The left edge of the rectangle * @param top The top edge of the rectangle * @param right The right edge of the rectangle * @param bottom The bottom edge of the rectangle * @see DrawDirtyBlocks + * @ingroup dirty * - * @todo The name of the function should be called like @c AddDirtyBlock as - * it neither set a dirty rect nor add several dirty rects although - * the function name is in plural. (Progman) */ -void SetDirtyBlocks(int left, int top, int right, int bottom) +void AddDirtyBlock(int left, int top, int right, int bottom) { byte *b; int width; @@ -1600,7 +1609,7 @@ void SetDirtyBlocks(int left, int top, int right, int bottom) */ void MarkWholeScreenDirty() { - SetDirtyBlocks(0, 0, _screen.width, _screen.height); + AddDirtyBlock(0, 0, _screen.width, _screen.height); } /** diff --git a/src/gfx_func.h b/src/gfx_func.h index 0ccdabac3d..0edbf722a1 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -131,7 +131,7 @@ Point GetCharPosInString(const char *str, const char *ch, FontSize start_fontsiz const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize = FS_NORMAL); void DrawDirtyBlocks(); -void SetDirtyBlocks(int left, int top, int right, int bottom); +void AddDirtyBlock(int left, int top, int right, int bottom); void MarkWholeScreenDirty(); void GfxInitPalettes(); diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 01b69677e3..9993645c43 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -571,7 +571,7 @@ private: if (this->viewport != nullptr) this->viewport->top += newtop - this->top; this->top = newtop; - SetDirtyBlocks(this->left, mintop, this->left + this->width, maxtop + this->height); + AddDirtyBlock(this->left, mintop, this->left + this->width, maxtop + this->height); } StringID GetCompanyMessageString() const diff --git a/src/viewport.cpp b/src/viewport.cpp index 1c9dca1ef6..28345db607 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1886,7 +1886,7 @@ static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, if (top >= vp->virtual_height) return; - SetDirtyBlocks( + AddDirtyBlock( UnScaleByZoomLower(left, vp->zoom) + vp->left, UnScaleByZoomLower(top, vp->zoom) + vp->top, UnScaleByZoom(right, vp->zoom) + vp->left + 1, diff --git a/src/widget.cpp b/src/widget.cpp index eb683c4128..579b7efb64 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -774,7 +774,7 @@ void NWidgetBase::SetDirty(const Window *w) const { int abs_left = w->left + this->pos_x; int abs_top = w->top + this->pos_y; - SetDirtyBlocks(abs_left, abs_top, abs_left + this->current_x, abs_top + this->current_y); + AddDirtyBlock(abs_left, abs_top, abs_left + this->current_x, abs_top + this->current_y); } /** diff --git a/src/window.cpp b/src/window.cpp index 30fa4d3d12..e7bc6d2c4b 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -983,7 +983,7 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) */ void Window::SetDirty() const { - SetDirtyBlocks(this->left, this->top, this->left + this->width, this->top + this->height); + AddDirtyBlock(this->left, this->top, this->left + this->width, this->top + this->height); } /** @@ -3493,7 +3493,7 @@ static int PositionWindow(Window *w, WindowClass clss, int setting) default: w->left = 0; break; } if (w->viewport != nullptr) w->viewport->left += w->left - old_left; - SetDirtyBlocks(0, w->top, _screen.width, w->top + w->height); // invalidate the whole row + AddDirtyBlock(0, w->top, _screen.width, w->top + w->height); // invalidate the whole row return w->left; } From ee570e1b6dbd3b8e0f55f31f05c774e57c9a1e8f Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Tue, 9 Jun 2020 10:18:23 +1200 Subject: [PATCH 21/41] Cleanup: Fix typos in code comments. --- src/window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window.cpp b/src/window.cpp index e7bc6d2c4b..9fea6d1026 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -655,7 +655,7 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count) WidgetType widget_type = (nw != nullptr) ? nw->type : WWT_EMPTY; bool focused_widget_changed = false; - /* If clicked on a window that previously did dot have focus */ + /* If clicked on a window that previously did not have focus */ if (_focused_window != w && // We already have focus, right? (w->window_desc->flags & WDF_NO_FOCUS) == 0 && // Don't lose focus to toolbars widget_type != WWT_CLOSEBOX) { // Don't change focused window if 'X' (close button) was clicked From 8ef3d8f584fdc97c02bdc25e6d13d4c8bb4251ff Mon Sep 17 00:00:00 2001 From: glx22 Date: Tue, 9 Jun 2020 01:20:43 +0200 Subject: [PATCH 22/41] Revert f51e66f6: creating zip bundle fails for MacOS --- cmake/InstallAndPackage.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 1cc539d2d3..a84707bc22 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -81,7 +81,7 @@ set(CPACK_STRIP_FILES YES) set(CPACK_OUTPUT_FILE_PREFIX "bundles") if (APPLE) - set(CPACK_GENERATOR "ZIP;Bundle") + set(CPACK_GENERATOR "Bundle") include(PackageBundle) set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macosx") From fb7723a9d7b2e702ecab3514c84f9c8137a69cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Fri, 12 Jun 2020 16:33:04 +0200 Subject: [PATCH 23/41] Add: [CMake] Always export compile commands (#8199) --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b9788f2e8..605f4b0a25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,8 @@ endif (MSVC) set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) +set(CMAKE_EXPORT_COMPILE_COMMANDS YES) + list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp") if (WIN32) list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc") From 208614343fa6f5f190ea821ab9a0b420c3e0d636 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 12 Jun 2020 19:45:39 +0200 Subject: [PATCH 24/41] Update: Translations from eints polish: 1 change by MaksOPENTTD1 danish: 1 change by beruic --- src/lang/danish.txt | 1 + src/lang/polish.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index f501b89c45..f240ff3a7f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -935,6 +935,7 @@ STR_GAME_OPTIONS_CURRENCY_MXN :Meksikansk Peso STR_GAME_OPTIONS_CURRENCY_NTD :Ny Taiwan dollar (NTD) STR_GAME_OPTIONS_CURRENCY_CNY :Kinesisk Renminbi (CNY) STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD) +STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupi (INR) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vejkøretøjer diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 463f21b0d0..257648067c 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1315,6 +1315,7 @@ STR_GAME_OPTIONS_CURRENCY_MXN :Peso meksykańs STR_GAME_OPTIONS_CURRENCY_NTD :Nowy dolar tajwański (TWD) STR_GAME_OPTIONS_CURRENCY_CNY :Juan chiński (CNY) STR_GAME_OPTIONS_CURRENCY_HKD :Dolar hongkoński (HKD) +STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indyjska (INR) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Pojazdy drogowe From c9aff698d037c8e29620a9666ed37425f75abf62 Mon Sep 17 00:00:00 2001 From: nikolas Date: Thu, 18 Jun 2020 03:53:06 -0400 Subject: [PATCH 25/41] Fix #8104: Always add WINDOW_RESIZABLE flag to SDL2 (#8211) This fixes a bug that can reproduced with these steps: * Start openttd in fullscreen mode * Turn off fullscreen mode * Try to resize the window. The window can't be resized. --- src/video/sdl2_v.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 0dff1af4c5..c599de65e2 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -258,12 +258,10 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h, bool resize) seprintf(caption, lastof(caption), "OpenTTD %s", _openttd_revision); if (_sdl_window == nullptr) { - Uint32 flags = SDL_WINDOW_SHOWN; + Uint32 flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE; if (_fullscreen) { flags |= SDL_WINDOW_FULLSCREEN; - } else { - flags |= SDL_WINDOW_RESIZABLE; } _sdl_window = SDL_CreateWindow( From 9895ced6af96b2e6d2e2569383c72a4c6b930286 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Sat, 6 Jun 2020 19:25:42 +0200 Subject: [PATCH 26/41] Fix: Silence some warnings when building with clang-cl on VS 2019 Clang-cl presents as both _MSC_VER and __clang__ in the preprocessor which makes some things confusing. --- src/3rdparty/squirrel/squirrel/sqcompiler.h | 2 +- src/stdafx.h | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.h b/src/3rdparty/squirrel/squirrel/sqcompiler.h index b29917390b..08946fb60c 100644 --- a/src/3rdparty/squirrel/squirrel/sqcompiler.h +++ b/src/3rdparty/squirrel/squirrel/sqcompiler.h @@ -72,7 +72,7 @@ struct SQVM; #define TK_CONST 324 /* MSVC doesn't like NORETURN for function prototypes, but we kinda need it for GCC. */ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) typedef void(*CompilerErrorFunc)(void *ud, const SQChar *s); #else typedef NORETURN void(*CompilerErrorFunc)(void *ud, const SQChar *s); diff --git a/src/stdafx.h b/src/stdafx.h index c520925537..dcea753830 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -10,6 +10,13 @@ #ifndef STDAFX_H #define STDAFX_H +#ifdef _MSC_VER + /* Stop Microsoft (and clang-cl) compilers from complaining about potentially-unsafe/potentially-non-standard functions */ +# define _CRT_SECURE_NO_DEPRECATE +# define _CRT_SECURE_NO_WARNINGS +# define _CRT_NONSTDC_NO_WARNINGS +#endif + #if defined(__APPLE__) #include "os/macosx/osx_stdafx.h" #endif /* __APPLE__ */ @@ -177,7 +184,6 @@ #endif /* (_MSC_VER < 1400) */ #pragma warning(disable: 4291) // no matching operator delete found; memory will not be freed if initialization throws an exception (reason: our overloaded functions never throw an exception) #pragma warning(disable: 4996) // 'function': was declared deprecated - #define _CRT_SECURE_NO_DEPRECATE // all deprecated 'unsafe string functions #pragma warning(disable: 6308) // code analyzer: 'realloc' might return null pointer: assigning null pointer to 't_ptr', which is passed as an argument to 'realloc', will cause the original memory block to be leaked #pragma warning(disable: 6011) // code analyzer: Dereferencing NULL pointer 'pfGetAddrInfo': Lines: 995, 996, 998, 999, 1001 #pragma warning(disable: 6326) // code analyzer: potential comparison of a constant with another constant @@ -198,7 +204,11 @@ #define CDECL _cdecl #define WARN_FORMAT(string, args) - #define FINAL sealed +# ifndef __clang__ +# define FINAL sealed +# else +# define FINAL +# endif /* fallthrough attribute, VS 2017 */ #if (_MSC_VER >= 1910) From d8182b7e1533027d43da6508652ecfc1b056548f Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 14 Jun 2020 13:04:26 +0200 Subject: [PATCH 27/41] Change: Allow command cost-estimation while paused. --- src/command.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command.cpp b/src/command.cpp index 8890381784..453f305d38 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -575,7 +575,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac int x = TileX(tile) * TILE_SIZE; int y = TileY(tile) * TILE_SIZE; - if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cmd)) { + if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cmd) && !estimate_only) { ShowErrorMessage(GB(cmd, 16, 16), STR_ERROR_NOT_ALLOWED_WHILE_PAUSED, WL_INFO, x, y); return false; } From 084b073e57817199fc679179d8b0e4520b10e606 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 15 Jun 2020 18:53:13 +0100 Subject: [PATCH 28/41] Codechange: Use template type for GUIList::Sort comparator --- src/sortlist_type.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sortlist_type.h b/src/sortlist_type.h index a8730d96d9..e5bfe06a91 100644 --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -250,7 +250,8 @@ public: * @return true if the list sequence has been altered * */ - bool Sort(SortFunction *compare) + template + bool Sort(Comp compare) { /* Do not sort if the resort bit is not set */ if (!(this->flags & VL_RESORT)) return false; From d830a34394a1ef9e9fa574914a01a9dd79c5c2f9 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 15 Jun 2020 18:36:33 +0100 Subject: [PATCH 29/41] Fix: Violation of strict weak ordering in engine name sorter This could be caused by an engine being renamed, and the old name being cached from a previous sort. See: #7838 --- src/build_vehicle_gui.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index c3252f7b9e..a761e9b136 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -125,6 +125,9 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b) return _engine_sort_direction ? r > 0 : r < 0; } +/* cached values for EngineNameSorter to spare many GetString() calls */ +static EngineID _last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE }; + /** * Determines order of engines by name * @param a first engine to compare @@ -133,17 +136,16 @@ static bool EngineIntroDateSorter(const EngineID &a, const EngineID &b) */ static bool EngineNameSorter(const EngineID &a, const EngineID &b) { - static EngineID last_engine[2] = { INVALID_ENGINE, INVALID_ENGINE }; - static char last_name[2][64] = { "\0", "\0" }; + static char last_name[2][64] = { "", "" }; - if (a != last_engine[0]) { - last_engine[0] = a; + if (a != _last_engine[0]) { + _last_engine[0] = a; SetDParam(0, a); GetString(last_name[0], STR_ENGINE_NAME, lastof(last_name[0])); } - if (b != last_engine[1]) { - last_engine[1] = b; + if (b != _last_engine[1]) { + _last_engine[1] = b; SetDParam(0, b); GetString(last_name[1], STR_ENGINE_NAME, lastof(last_name[1])); } @@ -1292,6 +1294,9 @@ struct BuildVehicleWindow : Window { this->SelectEngine(sel_id); + /* invalidate cached values for name sorter - engine names could change */ + _last_engine[0] = _last_engine[1] = INVALID_ENGINE; + /* make engines first, and then wagons, sorted by selected sort_criteria */ _engine_sort_direction = false; EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter); From c167648d75428e6ff93f903de65df0cab0370bb6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 15 Jun 2020 18:40:51 +0100 Subject: [PATCH 30/41] Fix: Violation of strict weak ordering in group name sorters This could be caused by a group being renamed, and the old name being cached from a previous sort. See: #7838 --- src/company_gui.cpp | 44 +++++++++++++++++++++----------------------- src/group_gui.cpp | 45 +++++++++++++++++++++------------------------ 2 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 423efcb01f..f4fe7f8030 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -615,28 +615,6 @@ private: ShowDropDownList(this, std::move(list), sel, widget); } - static bool GroupNameSorter(const Group * const &a, const Group * const &b) - { - static const Group *last_group[2] = { nullptr, nullptr }; - static char last_name[2][64] = { "", "" }; - - if (a != last_group[0]) { - last_group[0] = a; - SetDParam(0, a->index); - GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); - } - - if (b != last_group[1]) { - last_group[1] = b; - SetDParam(0, b->index); - GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); - } - - int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting). - if (r == 0) return a->index < b->index; - return r < 0; - } - void AddChildren(GUIGroupList *source, GroupID parent, int indent) { for (const Group *g : *source) { @@ -665,7 +643,27 @@ private: } list.ForceResort(); - list.Sort(&GroupNameSorter); + + /* Sort the groups by their name */ + const Group *last_group[2] = { nullptr, nullptr }; + char last_name[2][64] = { "", "" }; + list.Sort([&](const Group * const &a, const Group * const &b) -> bool { + if (a != last_group[0]) { + last_group[0] = a; + SetDParam(0, a->index); + GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); + } + + if (b != last_group[1]) { + last_group[1] = b; + SetDParam(0, b->index); + GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); + } + + int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting). + if (r == 0) return a->index < b->index; + return r < 0; + }); AddChildren(&list, INVALID_GROUP, 0); } diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 0bf8589ac5..8d0bba8fbb 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -141,29 +141,6 @@ private: } } - /** Sort the groups by their name */ - static bool GroupNameSorter(const Group * const &a, const Group * const &b) - { - static const Group *last_group[2] = { nullptr, nullptr }; - static char last_name[2][64] = { "", "" }; - - if (a != last_group[0]) { - last_group[0] = a; - SetDParam(0, a->index); - GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); - } - - if (b != last_group[1]) { - last_group[1] = b; - SetDParam(0, b->index); - GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); - } - - int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting). - if (r == 0) return a->index < b->index; - return r < 0; - } - /** * (Re)Build the group list. * @@ -185,7 +162,27 @@ private: } list.ForceResort(); - list.Sort(&GroupNameSorter); + + /* Sort the groups by their name */ + const Group *last_group[2] = { nullptr, nullptr }; + char last_name[2][64] = { "", "" }; + list.Sort([&](const Group * const &a, const Group * const &b) { + if (a != last_group[0]) { + last_group[0] = a; + SetDParam(0, a->index); + GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0])); + } + + if (b != last_group[1]) { + last_group[1] = b; + SetDParam(0, b->index); + GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1])); + } + + int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting). + if (r == 0) return a->index < b->index; + return r < 0; + }); AddChildren(&list, INVALID_GROUP, 0); From b0f192abc4e8bdd9f5f46f6932b8308e32b7b4b6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 6 May 2020 23:41:25 +0100 Subject: [PATCH 31/41] Fix: Racy use of flags in TCPConnecter::CheckCallbacks conected and aborted flags are used concurrently from multiple threads. --- src/network/core/tcp.h | 6 ++++-- src/network/core/tcp_connect.cpp | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index 08a09ca1a2..ffa231497e 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -15,6 +15,8 @@ #include "address.h" #include "packet.h" +#include + /** The states of sending the packets. */ enum SendPacketsState { SPS_CLOSED, ///< The connection got closed. @@ -61,8 +63,8 @@ public: */ class TCPConnecter { private: - bool connected; ///< Whether we succeeded in making the connection - bool aborted; ///< Whether we bailed out (i.e. connection making failed) + std::atomic connected;///< Whether we succeeded in making the connection + std::atomic aborted; ///< Whether we bailed out (i.e. connection making failed) bool killed; ///< Whether we got killed SOCKET sock; ///< The socket we're connecting with diff --git a/src/network/core/tcp_connect.cpp b/src/network/core/tcp_connect.cpp index 9448acb830..b4485cfe96 100644 --- a/src/network/core/tcp_connect.cpp +++ b/src/network/core/tcp_connect.cpp @@ -66,19 +66,21 @@ void TCPConnecter::Connect() { for (auto iter = _tcp_connecters.begin(); iter < _tcp_connecters.end(); /* nothing */) { TCPConnecter *cur = *iter; - if ((cur->connected || cur->aborted) && cur->killed) { + const bool connected = cur->connected.load(); + const bool aborted = cur->aborted.load(); + if ((connected || aborted) && cur->killed) { iter = _tcp_connecters.erase(iter); if (cur->sock != INVALID_SOCKET) closesocket(cur->sock); delete cur; continue; } - if (cur->connected) { + if (connected) { iter = _tcp_connecters.erase(iter); cur->OnConnect(cur->sock); delete cur; continue; } - if (cur->aborted) { + if (aborted) { iter = _tcp_connecters.erase(iter); cur->OnFailure(); delete cur; From 506598a80a5285fd5f3b164afbcb69bd9e98c6cc Mon Sep 17 00:00:00 2001 From: Dan Church Date: Thu, 18 Jun 2020 11:34:19 -0500 Subject: [PATCH 32/41] Fix: [CMake] Fix install paths using GNUInstallDirs --- CMakeLists.txt | 7 +++++++ cmake/InstallAndPackage.cmake | 12 +++++++----- cmake/Options.cmake | 4 +++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 605f4b0a25..825ba3dcd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,13 @@ endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") +# Use GNUInstallDirs to allow customisation +# but set our own default data dir +if (NOT CMAKE_INSTALL_DATADIR) + set(CMAKE_INSTALL_DATADIR "share/games") +endif (NOT CMAKE_INSTALL_DATADIR) +include(GNUInstallDirs) + include(Options) set_options() set_directory_options() diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index a84707bc22..71b80e6843 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -1,9 +1,11 @@ +include(GNUInstallDirs) + # If requested, use FHS layout; otherwise fall back to a flat layout. if (OPTION_INSTALL_FHS) - set(BINARY_DESTINATION_DIR "bin") - set(DATA_DESTINATION_DIR "share/games/openttd") - set(DOCS_DESTINATION_DIR "share/doc/openttd") - set(MAN_DESTINATION_DIR "share/man/openttd") + set(BINARY_DESTINATION_DIR "${CMAKE_INSTALL_BINDIR}") + set(DATA_DESTINATION_DIR "${CMAKE_INSTALL_DATADIR}/openttd") + set(DOCS_DESTINATION_DIR "${CMAKE_INSTALL_DOCDIR}") + set(MAN_DESTINATION_DIR "${CMAKE_INSTALL_MANDIR}") else (OPTION_INSTALL_FHS) set(BINARY_DESTINATION_DIR ".") set(DATA_DESTINATION_DIR ".") @@ -40,7 +42,7 @@ install(FILES if (OPTION_INSTALL_FHS) install(FILES ${CMAKE_SOURCE_DIR}/docs/openttd.6 - DESTINATION ${MAN_DESTINATION_DIR} + DESTINATION ${MAN_DESTINATION_DIR}/man6 COMPONENT manual) endif (OPTION_INSTALL_FHS) diff --git a/cmake/Options.cmake b/cmake/Options.cmake index 0e8063fac0..478f1b2b24 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -1,3 +1,5 @@ +include(GNUInstallDirs) + # Set the options for the directories (personal, shared, global). # # set_directory_options() @@ -14,7 +16,7 @@ function(set_directory_options) elseif (UNIX) set(DEFAULT_PERSONAL_DIR ".openttd") set(DEFAULT_SHARED_DIR "(not set)") - set(DEFAULT_GLOBAL_DIR "${CMAKE_INSTALL_PREFIX}/share/games/openttd") + set(DEFAULT_GLOBAL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/openttd") else () message(FATAL_ERROR "Unknown OS found; please consider creating a Pull Request to add support for this OS.") endif () From 9aca6ff971e95fbeaff9302cf5d8d44a80ed0206 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 19 Jun 2020 19:45:40 +0200 Subject: [PATCH 33/41] Update: Translations from eints swedish: 33 changes by Joel_A --- src/lang/swedish.txt | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 64bd3679a4..3efe13f451 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -934,6 +934,7 @@ STR_GAME_OPTIONS_CURRENCY_MXN :Mexikansk peso STR_GAME_OPTIONS_CURRENCY_NTD :Nya Taiwanesisk dollar (NTD) STR_GAME_OPTIONS_CURRENCY_CNY :Kinesisk Renminbi (CNY) STR_GAME_OPTIONS_CURRENCY_HKD :Hongkongdollar (HKD) +STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupie (INR) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vägfordon @@ -1160,7 +1161,7 @@ STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximalt belopp STR_CONFIG_SETTING_INTEREST_RATE :Räntenivå: {STRING} STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Räntenivå för lån; styr även inflationen om sådan är aktiverad STR_CONFIG_SETTING_RUNNING_COSTS :Driftkostnader: {STRING} -STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Sätt nivån för underhålls- och driftkostnader för fordon och infrastruktur +STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Sätt nivån för underhålls- och driftskostnader för fordon och infrastruktur STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Konstruktionshastighet: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Begränsar antalet konstruktionshandlingar för AI-spelare STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Fordonshaverier: {STRING} @@ -1308,6 +1309,8 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Visa invånaran STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Visa antal invånare efter stadsnamnen på kartan STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Linjetjocklek i grafer: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Linjernas bredd i grafernas kurvor. En tunn linje är lättare att läsa av mer precist, medan en tjockare linje är lättare att se och gör det lättare att skilja mellan de olika färgerna +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Visa NewGRF:ens namn i fordonsbyggnadsfönstret: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Lägg till en rad i fordonsbyggnadsfönstret som visar vilken NewGRF det valda fordonet kommer ifrån. STR_CONFIG_SETTING_LANDSCAPE :Landskap: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landskap definiera grundläggande gameplay scenarier med olika last och krav stad tillväxt. NewGRF och Game skript tillåter finare kontroll. @@ -1319,8 +1322,8 @@ STR_CONFIG_SETTING_TERRAIN_TYPE :Terrängtyp: {S STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(TerraGenesis endast) Hilliness av landskapet STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industritäthet: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Ange hur många industrier som ska genereras och vilken nivå som ska bibehållas under spelet -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximalt avstånd mellan oljeraffinaderier och kartans kant: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Oljeraffinaderier byggs bara nära kartans kanter, alltså vid kusten om det är en ö-karta +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximalt avstånd mellan oljeindustrier och kartans kant: {STRING} +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Begränsar hur långt från kartans kant oljeraffinaderier och oljeplattformar kan byggas. På ö-kartor säkerställer detta att de är nära kusten. På kartor större än 256 rutor skalas detta värde upp. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snögränsens höjd: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kontrollerar på vilken höjd snön börjar i det subarktiska landskapet. Snö påverkar även industrigeneration och städers tillväxtkrav STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Terrängens svårhetsgrad: {STRING} @@ -1545,10 +1548,16 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :På STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Nyheter i färg visas efter: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Årtal då tidningens nyhetsartiklar börjar tryckas i färg. Innan detta år används monokromt svart/vitt STR_CONFIG_SETTING_STARTING_YEAR :Startår: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR :Slutår för poängräkning: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Årtal då spelet slutar räkna poäng. Vid slutet av detta år sparas företagets poäng och listan med de bästa spelresultaten visas, men därefter kan spelarna fortsätta att spela.{}Om årtalet är satt till innan startåret visas aldrig de bästa spelresultaten. +STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Aldrig STR_CONFIG_SETTING_SMOOTH_ECONOMY :Lugn ekonomi (flera små ändringar): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :När det är aktiverat ändras industriproduktionen oftare och i mindre steg. Den här inställningen har vanligtvis ingen effekt om de olika industrityperna kommer från en NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Tillåt köp av aktier från andra företag: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :När det är aktiverat blir det tillåtet att köpa och sälja andelar i företag. För att dess andelar ska bli tillgängliga måste ett företag ha uppnått en viss ålder +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Lägsta företagsålder för aktiehandel: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Ställ in den lägsta ålder från vilken ett företags aktier kan köpas och säljas av andra företag. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Inkomstprocent per etapp i matarsystem: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Procentandel av inkomsten som ges till de mellanliggande etapperna i matarsystem. Ger mer kontroll över inkomsterna STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Vid dragning med verktyget, placera en signal per: {STRING} @@ -1590,7 +1599,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Förbjuden STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Tillåten STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Tillåten, vanlig stads-layout STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Fraktgods som genereras i staden: {STRING} -STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Hur mycket fraktgods produceras av hus i städer, i förhållande till den totala befolkningen i staden.{}Kvadratisk tillväxt: En stad dubbelt så stor genererar fyra gånger så många passagerare.{}Linjär tillväxt: En stad dubbelt så stor genererar dubbelt så många passagerare. +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Hur mycket fraktgods som produceras av hus i städer, i förhållande till den totala befolkningen i staden.{}Kvadratisk tillväxt: En dubbelt så stor stad genererar fyra gånger så många passagerare.{}Linjär tillväxt: En dubbelt så stor stad genererar dubbelt så många passagerare. STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Kvadratisk (original) STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linjär @@ -2159,6 +2168,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Fel lös STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Servern är full STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Du är bannlyst från den här servern STR_NETWORK_ERROR_KICKED :{WHITE}Du blev utkastad från spelet +STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Orsak: {STRING} STR_NETWORK_ERROR_CHEATER :{WHITE}Fusk är inte tillåtet på denna server STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Du skickade för många kommandon till servern STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Du tog för lång tid på dig att mata in löserondet @@ -2218,6 +2228,7 @@ STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} ga STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** You gave {1:STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Servern avslutade sessionen STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Servern startar om...{}Var vänlig vänta... +STR_NETWORK_MESSAGE_KICKED :*** {STRING} kastades ut. Orsak: ({STRING}) # Content downloading window STR_CONTENT_TITLE :{WHITE}Nedladdning av innehåll @@ -3045,7 +3056,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Kapacite STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tåg '{VEHICLE}' som tillhör '{COMPANY}' har ogiltig längd. Detta orsakas förmodligen av problem med en NewGRF. Spelet kan desynkroniseras eller krascha STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' ger felaktig information -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Last/återställnings information för '{1:ENGINE}' är skilld ifrån köp lista efter konstruktion. Detta kan leda till att utomatisk förnyelse/uppgradering misslyckas med att anpassa fordonen/vagnarna korrekt +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Last-/återställningsinformationen för '{1:ENGINE}' skiljer sig från köplistan efter konstruktion. Detta kan leda till att automatisk förnyelse/uppgradering misslyckas med att anpassa fordonen/vagnarna korrekt STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' skapade en oändlig loop i en produktions-callback-funktion STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback-funktion {1:HEX} returnerade ett okänt/ogiltligt resultat {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' returnerade ogiltig lasttyp i produktions-callback vid {2:HEX} @@ -3210,7 +3221,7 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Inga - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Markera alla inrättningar -STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Välj alla last-typer (inklusive icke väntande last) +STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Välj alla typer av last (inklusive icke väntande last) STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Ingen sorts last väntar # Station view window @@ -3383,8 +3394,17 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrier STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Inga - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transporterat){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} och {NUM} till... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industrinamn - klicka på namnet för att centrera huvudvyn över industrin. Ctrl+klick öppnar en ny vy över industrins läge +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Accepterat gods: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Producerat fraktgods: {SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Alla typer av last +STR_INDUSTRY_DIRECTORY_FILTER_NONE :Inga # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -4159,6 +4179,13 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Välj ma STR_AI_LIST_CANCEL :{BLACK}Avbryt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Ändra inte datorspelare +STR_SCREENSHOT_CAPTION :{WHITE}Ta en skärmdump +STR_SCREENSHOT_SCREENSHOT :{BLACK}Vanlig skärmdump +STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Fullt inzoomad skärmdump +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Skärmdump med grundinställd zoomnivå +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Skärmdump med hela kartan +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Skärmdump av höjdkarta +STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Skärmdump av miniatyrkartan # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} parametrar From 1ac0d4a5b2c8f5e5c9a4629091c81e3f41a4c126 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 6 May 2020 23:23:03 +0100 Subject: [PATCH 34/41] Fix: Thread unsafe use of NetworkAddress::GetAddressAsString Remove static buffer form of NetworkAddress::GetAddressAsString. This is used in multiple threads concurrently, and is not thread-safe. Replace it with a form returning std::string. --- src/network/core/address.cpp | 13 +++++++------ src/network/core/address.h | 4 +++- src/network/core/tcp_content.cpp | 6 +++--- src/network/core/udp.cpp | 12 ++++++------ src/network/network_gui.cpp | 4 +++- src/network/network_udp.cpp | 12 ++++++------ 6 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index 44ba453856..c2fecc7ff2 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -96,12 +96,11 @@ void NetworkAddress::GetAddressAsString(char *buffer, const char *last, bool wit * Get the address as a string, e.g. 127.0.0.1:12345. * @param with_family whether to add the family (e.g. IPvX). * @return the address - * @note NOT thread safe */ -const char *NetworkAddress::GetAddressAsString(bool with_family) +std::string NetworkAddress::GetAddressAsString(bool with_family) { /* 6 = for the : and 5 for the decimal port number */ - static char buf[NETWORK_HOSTNAME_LENGTH + 6 + 7]; + char buf[NETWORK_HOSTNAME_LENGTH + 6 + 7]; this->GetAddressAsString(buf, lastof(buf), with_family); return buf; } @@ -289,7 +288,8 @@ static SOCKET ConnectLoopProc(addrinfo *runp) { const char *type = NetworkAddress::SocketTypeAsString(runp->ai_socktype); const char *family = NetworkAddress::AddressFamilyAsString(runp->ai_family); - const char *address = NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString(); + char address[NETWORK_HOSTNAME_LENGTH + 6 + 7]; + NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString(address, lastof(address)); SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (sock == INVALID_SOCKET) { @@ -319,7 +319,7 @@ static SOCKET ConnectLoopProc(addrinfo *runp) */ SOCKET NetworkAddress::Connect() { - DEBUG(net, 1, "Connecting to %s", this->GetAddressAsString()); + DEBUG(net, 1, "Connecting to %s", this->GetAddressAsString().c_str()); return this->Resolve(AF_UNSPEC, SOCK_STREAM, AI_ADDRCONFIG, nullptr, ConnectLoopProc); } @@ -333,7 +333,8 @@ static SOCKET ListenLoopProc(addrinfo *runp) { const char *type = NetworkAddress::SocketTypeAsString(runp->ai_socktype); const char *family = NetworkAddress::AddressFamilyAsString(runp->ai_family); - const char *address = NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString(); + char address[NETWORK_HOSTNAME_LENGTH + 6 + 7]; + NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString(address, lastof(address)); SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (sock == INVALID_SOCKET) { diff --git a/src/network/core/address.h b/src/network/core/address.h index 980d7227df..65546818b2 100644 --- a/src/network/core/address.h +++ b/src/network/core/address.h @@ -15,6 +15,8 @@ #include "../../string_func.h" #include "../../core/smallmap_type.hpp" +#include + class NetworkAddress; typedef std::vector NetworkAddressList; ///< Type for a list of addresses. typedef SmallMap SocketList; ///< Type for a mapping between address and socket. @@ -91,7 +93,7 @@ public: const char *GetHostname(); void GetAddressAsString(char *buffer, const char *last, bool with_family = true); - const char *GetAddressAsString(bool with_family = true); + std::string GetAddressAsString(bool with_family = true); const sockaddr_storage *GetAddress(); /** diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 989fbefaf4..6fb3b33794 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -171,9 +171,9 @@ bool NetworkContentSocketHandler::HandlePacket(Packet *p) default: if (this->HasClientQuit()) { - DEBUG(net, 0, "[tcp/content] received invalid packet type %d from %s", type, this->client_addr.GetAddressAsString()); + DEBUG(net, 0, "[tcp/content] received invalid packet type %d from %s", type, this->client_addr.GetAddressAsString().c_str()); } else { - DEBUG(net, 0, "[tcp/content] received illegal packet from %s", this->client_addr.GetAddressAsString()); + DEBUG(net, 0, "[tcp/content] received illegal packet from %s", this->client_addr.GetAddressAsString().c_str()); } return false; } @@ -224,7 +224,7 @@ bool NetworkContentSocketHandler::ReceivePackets() */ bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type) { - DEBUG(net, 0, "[tcp/content] received illegal packet type %d from %s", type, this->client_addr.GetAddressAsString()); + DEBUG(net, 0, "[tcp/content] received illegal packet type %d from %s", type, this->client_addr.GetAddressAsString().c_str()); return false; } diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 1236838732..57352412b4 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -100,10 +100,10 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a /* Send the buffer */ int res = sendto(s.second, (const char*)p->buffer, p->size, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength()); - DEBUG(net, 7, "[udp] sendto(%s)", send.GetAddressAsString()); + DEBUG(net, 7, "[udp] sendto(%s)", send.GetAddressAsString().c_str()); /* Check for any errors, but ignore it otherwise */ - if (res == -1) DEBUG(net, 1, "[udp] sendto(%s) failed with: %i", send.GetAddressAsString(), GET_LAST_ERROR()); + if (res == -1) DEBUG(net, 1, "[udp] sendto(%s) failed with: %i", send.GetAddressAsString().c_str(), GET_LAST_ERROR()); if (!all) break; } @@ -136,7 +136,7 @@ void NetworkUDPSocketHandler::ReceivePackets() /* If the size does not match the packet must be corrupted. * Otherwise it will be marked as corrupted later on. */ if (nbytes != p.size) { - DEBUG(net, 1, "received a packet with mismatching size from %s", address.GetAddressAsString()); + DEBUG(net, 1, "received a packet with mismatching size from %s", address.GetAddressAsString().c_str()); continue; } @@ -313,9 +313,9 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_ default: if (this->HasClientQuit()) { - DEBUG(net, 0, "[udp] received invalid packet type %d from %s", type, client_addr->GetAddressAsString()); + DEBUG(net, 0, "[udp] received invalid packet type %d from %s", type, client_addr->GetAddressAsString().c_str()); } else { - DEBUG(net, 0, "[udp] received illegal packet from %s", client_addr->GetAddressAsString()); + DEBUG(net, 0, "[udp] received illegal packet from %s", client_addr->GetAddressAsString().c_str()); } break; } @@ -328,7 +328,7 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_ */ void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress *client_addr) { - DEBUG(net, 0, "[udp] received packet type %d on wrong port from %s", type, client_addr->GetAddressAsString()); + DEBUG(net, 0, "[udp] received packet type %d on wrong port from %s", type, client_addr->GetAddressAsString().c_str()); } void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index c4488f35d9..ab72d9521c 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -664,7 +664,9 @@ public: DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_SERVER_VERSION); // server version y += FONT_HEIGHT_NORMAL; - SetDParamStr(0, sel->address.GetAddressAsString()); + char network_addr_buffer[NETWORK_HOSTNAME_LENGTH + 6 + 7]; + sel->address.GetAddressAsString(network_addr_buffer, lastof(network_addr_buffer)); + SetDParamStr(0, network_addr_buffer); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_SERVER_ADDRESS); // server address y += FONT_HEIGHT_NORMAL; diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 03344fe579..0fd20b5f45 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -244,7 +244,7 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_GET_NEWGRFS(Packet *p, Networ uint8 in_reply_count = 0; size_t packet_len = 0; - DEBUG(net, 6, "[udp] newgrf data request from %s", client_addr->GetAddressAsString()); + DEBUG(net, 6, "[udp] newgrf data request from %s", client_addr->GetAddressAsString().c_str()); num_grfs = p->Recv_uint8 (); if (num_grfs > NETWORK_MAX_GRF_COUNT) return; @@ -307,7 +307,7 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *p, NetworkAd /* Just a fail-safe.. should never happen */ if (_network_udp_server) return; - DEBUG(net, 4, "[udp] server response from %s", client_addr->GetAddressAsString()); + DEBUG(net, 4, "[udp] server response from %s", client_addr->GetAddressAsString().c_str()); /* Find next item */ item = NetworkGameListAddItem(*client_addr); @@ -407,7 +407,7 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_NEWGRFS(Packet *p, NetworkAdd uint8 num_grfs; uint i; - DEBUG(net, 6, "[udp] newgrf data reply from %s", client_addr->GetAddressAsString()); + DEBUG(net, 6, "[udp] newgrf data reply from %s", client_addr->GetAddressAsString().c_str()); num_grfs = p->Recv_uint8 (); if (num_grfs > NETWORK_MAX_GRF_COUNT) return; @@ -477,7 +477,7 @@ void NetworkUDPQueryMasterServer() _udp_client_socket->SendPacket(&p, &out_addr, true); - DEBUG(net, 2, "[udp] master server queried at %s", out_addr.GetAddressAsString()); + DEBUG(net, 2, "[udp] master server queried at %s", out_addr.GetAddressAsString().c_str()); } /** Find all servers */ @@ -541,8 +541,8 @@ static void NetworkUDPAdvertiseThread() if (_session_key == 0 && session_key_retries++ == 2) { DEBUG(net, 0, "[udp] advertising to the master server is failing"); DEBUG(net, 0, "[udp] we are not receiving the session key from the server"); - DEBUG(net, 0, "[udp] please allow udp packets from %s to you to be delivered", out_addr.GetAddressAsString(false)); - DEBUG(net, 0, "[udp] please allow udp packets from you to %s to be delivered", out_addr.GetAddressAsString(false)); + DEBUG(net, 0, "[udp] please allow udp packets from %s to you to be delivered", out_addr.GetAddressAsString(false).c_str()); + DEBUG(net, 0, "[udp] please allow udp packets from you to %s to be delivered", out_addr.GetAddressAsString(false).c_str()); } if (_session_key != 0 && _network_advertise_retries == 0) { DEBUG(net, 0, "[udp] advertising to the master server is failing"); From e6f3e15c32b51f4cc430a9bc9d0b1fc708135a77 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 21 Jun 2020 23:47:45 +0100 Subject: [PATCH 35/41] Fix 63ccb36e: Incorrect string type for OrderBackup::name save/load In 63ccb36e BaseConsist::name was changed from a malloced char* to a std::string. OrderBackup inherits from BaseConsist. The saveload of OrderBackup::name was not updated. --- src/saveload/order_sl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index c8747d36bb..1292c1b056 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -241,7 +241,7 @@ const SaveLoad *GetOrderBackupDescription() SLE_VAR(OrderBackup, group, SLE_UINT16), SLE_CONDVAR(OrderBackup, service_interval, SLE_FILE_U32 | SLE_VAR_U16, SL_MIN_VERSION, SLV_192), SLE_CONDVAR(OrderBackup, service_interval, SLE_UINT16, SLV_192, SL_MAX_VERSION), - SLE_STR(OrderBackup, name, SLE_STR, 0), + SLE_SSTR(OrderBackup, name, SLE_STR), SLE_CONDNULL(2, SL_MIN_VERSION, SLV_192), // clone (2 bytes of pointer, i.e. garbage) SLE_CONDREF(OrderBackup, clone, REF_VEHICLE, SLV_192, SL_MAX_VERSION), SLE_VAR(OrderBackup, cur_real_order_index, SLE_UINT8), From 87a069c887267ff375c35fdbe5d95fbe71ff0579 Mon Sep 17 00:00:00 2001 From: glx22 Date: Mon, 22 Jun 2020 14:21:11 +0200 Subject: [PATCH 36/41] Fix #8230: Resolve ".." when opening files in .tar (#8231) --- src/fileio.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/fileio.cpp b/src/fileio.cpp index f17a0ffc0e..7340fa1722 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -25,6 +25,7 @@ #endif #include #include +#include #ifdef WITH_XDG_BASEDIR #include @@ -481,6 +482,28 @@ FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, strecpy(resolved_name, filename, lastof(resolved_name)); strtolower(resolved_name); + /* Resolve ".." */ + std::istringstream ss(resolved_name); + std::vector tokens; + std::string token; + while (std::getline(ss, token, PATHSEPCHAR)) { + if (token == "..") { + if (tokens.size() < 2) return nullptr; + tokens.pop_back(); + } else { + tokens.push_back(token); + } + } + resolved_name[0] = '\0'; + bool first = true; + for (const std::string &token : tokens) { + if (!first) { + strecat(resolved_name, PATHSEP, lastof(resolved_name)); + } + strecat(resolved_name, token.c_str(), lastof(resolved_name)); + first = false; + } + size_t resolved_len = strlen(resolved_name); /* Resolve ONE directory link */ From 6d135d4b01d80d8f42038c80d2d53210955a7c56 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 22 Jun 2020 19:45:40 +0200 Subject: [PATCH 37/41] Update: Translations from eints ukrainian: 1 change by nsergiy korean: 1 change by telk5093 --- src/lang/korean.txt | 2 +- src/lang/ukrainian.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 077deaec7c..9823599b33 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1663,7 +1663,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :장갑 화물 STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :다른 화물에 대한 분배 형식: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"불균형"은 화물이 아무 방향이나 임의의 양만큼 가게 됨을 뜻합니다. "수동"은 자동적인 화물 분배가 일어나지 않고 기존 방식을 사용하겠음을 뜻합니다. 특별한 이유가 없는 한, "불균형"이나 "수동"으로 설정하십시오. STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :분배 정확도: {STRING} -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :값이 높으면 높을수록 CPU가 연결 상태를 계산하는 시간이 더 오래 걸립니다. 만약 이 시간이 너무 오래 걸리면 랙 현상이 나타날 것입니다. 하지만, 낮은 값으로 설정하면 분배가 부정확하게 일어나서, 화물이 원하는 곳으로 분배되지 않을 수 있습니다. +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :값이 높으면 높을수록 CPU가 연결 상태를 계산하는 시간이 더 오래 걸립니다. 만약 이 시간이 너무 오래 걸리면 게임이 버벅일 것입니다. 하지만, 낮은 값으로 설정하면 분배가 부정확하게 일어나서, 화물이 원하는 곳으로 분배되지 않을 수 있습니다. STR_CONFIG_SETTING_DEMAND_DISTANCE :거리에 따른 수요 효과: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :이 값을 0보다 크게 설정하면, 어떤 화물이 있는 A역과 목적지가 될 수 있는 역 B 사이의 거리는 A에서 B로 가는 화물의 양에 영향을 미치게 됩니다. A역에서 B역이 더 멀리 떨어질 수록 이동하는 화물의 양은 적어질 것입니다. 값이 크면 클 수록 화물은 멀리 이동하지 않고 가까운 역으로 가게 됩니다. STR_CONFIG_SETTING_DEMAND_SIZE :균형 모드에서 되돌아오는 화물의 양: {STRING} diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 855995759d..ecc43503ff 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -4299,6 +4299,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Вибр STR_AI_LIST_CANCEL :{BLACK}Відміна STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Не міняти скрипт +STR_SCREENSHOT_CAPTION :{WHITE}Зробити знімок екрану # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Параметри From 78b6587c4048886bec976476c781fe7059f601cd Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 24 Jun 2020 19:45:42 +0200 Subject: [PATCH 38/41] Update: Translations from eints swedish: 3 changes by Joel_A --- src/lang/swedish.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 3efe13f451..6c265b85ab 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -864,6 +864,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLAC STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Ny {STRING} är nu tillgänglig - {ENGINE} +STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Öppna gruppfönstret fokuserat på fordonets grupp STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO :{WHITE}{STATION} tar inte längre emot {STRING} STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_OR_CARGO :{WHITE}{STATION} tar inte längre emot {STRING} eller {STRING} @@ -3126,6 +3127,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Byt namn på st # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} lokala myndigheter +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zon +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Visa zonen som ryms inom de lokala myndigheternas gränser STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Transportföretags värderingar: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Tillgängliga åtgärder: From b84d61ef6ed5cb79273b752b6031d9574ed735ab Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 25 Jun 2020 19:45:42 +0200 Subject: [PATCH 39/41] Update: Translations from eints indonesian: 16 changes by adjayanto --- src/lang/indonesian.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 3096e17f8c..d8acc468e6 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -988,6 +988,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Kali empat STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Ukuran font STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Kali dua STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :4 kali STR_GAME_OPTIONS_BASE_GRF :{BLACK}Set Grafik Dasar @@ -1523,10 +1524,12 @@ STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Penuh STR_CONFIG_SETTING_COLOURED_NEWS_YEAR :Berita berwarna tampil pada: {STRING} STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT :Tahun saat surat kabar/koran menjadi berwarna. Sebelum tahun ini, koran menggunakan warna hitam-putih STR_CONFIG_SETTING_STARTING_YEAR :Tahun mulai: {STRING} +STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Tidak pernah STR_CONFIG_SETTING_SMOOTH_ECONOMY :Aktifkan pertumbuhan ekonomi yang stabil (jarang berubah): {STRING} STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :Ketika diaktifkan, produksi industri mengalami perubahan lebih sering, dalam gerakan kecil. Pengaturan tidak berpengaruh jika jenis industri disediakan oleh NewGRF STR_CONFIG_SETTING_ALLOW_SHARES :Ijinkan pembelian saham perusahaan lain: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Jika diaktifkan, pemain dibolehkan membeli saham suatu perusahaan. Saham hanya bisa dibeli saat perusahaan memasuki umur tertentu +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Set umur minimal perusahaan saat sahamnya dapat dibeli atau dijual. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Persentase keuntungan akhir dari sistem pengisi: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Persentase pendapatan yang diberikan dari sistem pengisi, memberikan lebih banyak kendali pendapatan STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Saat menyeret, tempatkan sinyal setiap: {STRING} @@ -2700,10 +2703,12 @@ STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Rata sim STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Jumlah detak permainan tersimulasi per detik. STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Beberapa cepat permainan lagi berjalan, dibanding dengan kecepatan diharapkan memakai rata simulasi biasa. STR_FRAMERATE_CURRENT :{WHITE}Sekarang +STR_FRAMERATE_MEMORYUSE :{WHITE}Memori STR_FRAMERATE_DATA_POINTS :{WHITE}Data tergantung oleh ukuran {COMMA} STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE} ms STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE} ms +STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} bingkai/dtk STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} ms STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} s ############ Leave those lines in this order!! @@ -2713,6 +2718,7 @@ STR_FRAMERATE_GL_ROADVEHS :{WHITE} Titik k STR_FRAMERATE_GL_SHIPS :{WHITE} Titik kapal: STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Titik pesawat: STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Titik dunia: +STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Jarak tunda linkgraph: STR_FRAMERATE_DRAWING :{BLACK}Render grafis: STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Viewport dunia: STR_FRAMERATE_VIDEO :{BLACK}Keluaran Video: @@ -2869,6 +2875,8 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}Versi: { STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}Versi kompatibel min.: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Palet/warna: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Standar (D) +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Standar (D) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Parameter: {SILVER}{STRING} STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}Tidak ada informasi yang tersedia @@ -2917,6 +2925,7 @@ STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Lanjutka STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Mewakili sprite yang sedang dipilih. Penjajaran diabaikan ketika sprite ini digambar STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Pindahkan sprite, mengubah offset X dan Y STR_SPRITE_ALIGNER_RESET_BUTTON :{BLACK}Reset relatif +STR_SPRITE_ALIGNER_RESET_TOOLTIP :{BLACK}Reset offset relatif saat ini STR_SPRITE_ALIGNER_PICKER_BUTTON :{BLACK}Pilih sprite STR_SPRITE_ALIGNER_PICKER_TOOLTIP :{BLACK}Pilih sebuah sprite di manapun pada layar @@ -3119,6 +3128,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik pad # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Buku Cerita STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Buku Cerita Global +STR_STORY_BOOK_SPECTATOR :Buku Cerita Global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Halaman {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Loncat ke halaman yang dipilih dari daftar drop-down ini @@ -3311,6 +3321,7 @@ STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industri STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Tidak Ada - STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nama-nama industri - klik di nama untuk mengarahkan pandangan utama pada industri. Ctrl+Click akan membuka viewport baru pada lokasi industri +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Muatan diterima: {SILVER}{STRING} # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} @@ -3322,6 +3333,7 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Industr STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Membutuhkan: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} menunggu{STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Perubahan produksi (kelipatan 8, hingga 2040) @@ -3559,10 +3571,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Pesan da STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Kami telah mendesain {STRING} baru - apakah anda tertarik mempergunakan kendaraan ini secara eksklusif , sehingga kami dapat melihat bagaimana kemampuannya sebelum dijual secara masal? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :lokomotif kereta +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :lokomotif rel kereta listrik STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :lokomotif monorel STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :lokomotif maglev STR_ENGINE_PREVIEW_ROAD_VEHICLE :kendaraan jalan raya +STR_ENGINE_PREVIEW_TRAM_VEHICLE :kendaraan jalan trem STR_ENGINE_PREVIEW_AIRCRAFT :pesawat STR_ENGINE_PREVIEW_SHIP :kapal @@ -4063,6 +4077,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Pilih sk STR_AI_LIST_CANCEL :{BLACK}Batal STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Jangan mengubah skrip AI +STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Tangkapan layar Peta Ketinggian # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parameter @@ -4355,6 +4370,7 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Tidak da STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Tidak dapat membongkar jalur trem disini... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... tidak ada jalan STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... tidak ada jalur trem +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Jalur Tram tidak ada yang cocok # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Tidak dapat membangun kanal disini... From c9abf6ade60f6b6e9c540ba84ce76afc0d243c1f Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Fri, 12 Jun 2020 09:34:34 +1200 Subject: [PATCH 40/41] Revert: "Cleanup: Give `SetDirtyBlocks` a more descriptive name." This reverts commit 8652a4db76c978598918bfdb600a3453d794930a. This is necessary to aid in the cherry-picking of commits from JGRPP. --- src/gfx.cpp | 27 +++++++++------------------ src/gfx_func.h | 2 +- src/news_gui.cpp | 2 +- src/viewport.cpp | 2 +- src/widget.cpp | 2 +- src/window.cpp | 4 ++-- 6 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 6039946fc6..a5e5772050 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1416,16 +1416,6 @@ void DrawMouseCursor() _cursor.dirty = false; } -/** - * Repaints a specific rectangle of the screen. - * - * @param left,top,right,bottom The area of the screen that needs repainting - * @pre The rectangle should have been previously marked dirty with \c AddDirtyBlock. - * @see AddDirtyBlock - * @see DrawDirtyBlocks - * @ingroup dirty - * - */ void RedrawScreenRect(int left, int top, int right, int bottom) { assert(right <= _screen.width && bottom <= _screen.height); @@ -1448,9 +1438,7 @@ void RedrawScreenRect(int left, int top, int right, int bottom) /** * Repaints the rectangle blocks which are marked as 'dirty'. * - * @see AddDirtyBlock - * - * @ingroup dirty + * @see SetDirtyBlocks */ void DrawDirtyBlocks() { @@ -1553,18 +1541,21 @@ void DrawDirtyBlocks() } /** - * Extend the internal _invalid_rect rectangle to contain the rectangle - * defined by the given parameters. Note the point (0,0) is top left. + * This function extends the internal _invalid_rect rectangle as it + * now contains the rectangle defined by the given parameters. Note + * the point (0,0) is top left. * * @param left The left edge of the rectangle * @param top The top edge of the rectangle * @param right The right edge of the rectangle * @param bottom The bottom edge of the rectangle * @see DrawDirtyBlocks - * @ingroup dirty * + * @todo The name of the function should be called like @c AddDirtyBlock as + * it neither set a dirty rect nor add several dirty rects although + * the function name is in plural. (Progman) */ -void AddDirtyBlock(int left, int top, int right, int bottom) +void SetDirtyBlocks(int left, int top, int right, int bottom) { byte *b; int width; @@ -1609,7 +1600,7 @@ void AddDirtyBlock(int left, int top, int right, int bottom) */ void MarkWholeScreenDirty() { - AddDirtyBlock(0, 0, _screen.width, _screen.height); + SetDirtyBlocks(0, 0, _screen.width, _screen.height); } /** diff --git a/src/gfx_func.h b/src/gfx_func.h index 0edbf722a1..0ccdabac3d 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -131,7 +131,7 @@ Point GetCharPosInString(const char *str, const char *ch, FontSize start_fontsiz const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize = FS_NORMAL); void DrawDirtyBlocks(); -void AddDirtyBlock(int left, int top, int right, int bottom); +void SetDirtyBlocks(int left, int top, int right, int bottom); void MarkWholeScreenDirty(); void GfxInitPalettes(); diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 9993645c43..01b69677e3 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -571,7 +571,7 @@ private: if (this->viewport != nullptr) this->viewport->top += newtop - this->top; this->top = newtop; - AddDirtyBlock(this->left, mintop, this->left + this->width, maxtop + this->height); + SetDirtyBlocks(this->left, mintop, this->left + this->width, maxtop + this->height); } StringID GetCompanyMessageString() const diff --git a/src/viewport.cpp b/src/viewport.cpp index 28345db607..1c9dca1ef6 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1886,7 +1886,7 @@ static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, if (top >= vp->virtual_height) return; - AddDirtyBlock( + SetDirtyBlocks( UnScaleByZoomLower(left, vp->zoom) + vp->left, UnScaleByZoomLower(top, vp->zoom) + vp->top, UnScaleByZoom(right, vp->zoom) + vp->left + 1, diff --git a/src/widget.cpp b/src/widget.cpp index 579b7efb64..eb683c4128 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -774,7 +774,7 @@ void NWidgetBase::SetDirty(const Window *w) const { int abs_left = w->left + this->pos_x; int abs_top = w->top + this->pos_y; - AddDirtyBlock(abs_left, abs_top, abs_left + this->current_x, abs_top + this->current_y); + SetDirtyBlocks(abs_left, abs_top, abs_left + this->current_x, abs_top + this->current_y); } /** diff --git a/src/window.cpp b/src/window.cpp index 9fea6d1026..f9f05d75a3 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -983,7 +983,7 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom) */ void Window::SetDirty() const { - AddDirtyBlock(this->left, this->top, this->left + this->width, this->top + this->height); + SetDirtyBlocks(this->left, this->top, this->left + this->width, this->top + this->height); } /** @@ -3493,7 +3493,7 @@ static int PositionWindow(Window *w, WindowClass clss, int setting) default: w->left = 0; break; } if (w->viewport != nullptr) w->viewport->left += w->left - old_left; - AddDirtyBlock(0, w->top, _screen.width, w->top + w->height); // invalidate the whole row + SetDirtyBlocks(0, w->top, _screen.width, w->top + w->height); // invalidate the whole row return w->left; } From fd2a120c9d97e148452ccf50fd1186f3773abbe1 Mon Sep 17 00:00:00 2001 From: TechGeekNZ Date: Wed, 17 Jun 2020 12:07:28 +1200 Subject: [PATCH 41/41] Cleanup: Improve documentation of dirty block system. Partially re-applies 8652a4db76c978598918bfdb600a3453d794930a, which was reverted to allow commits to be cherry-picked from JGRPP. --- src/gfx.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index a5e5772050..15653c0c48 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1416,6 +1416,16 @@ void DrawMouseCursor() _cursor.dirty = false; } +/** + * Repaints a specific rectangle of the screen. + * + * @param left,top,right,bottom The area of the screen that needs repainting + * @pre The rectangle is assumed to have been previously marked dirty with \c SetDirtyBlocks. + * @see SetDirtyBlocks + * @see DrawDirtyBlocks + * @ingroup dirty + * + */ void RedrawScreenRect(int left, int top, int right, int bottom) { assert(right <= _screen.width && bottom <= _screen.height); @@ -1439,6 +1449,8 @@ void RedrawScreenRect(int left, int top, int right, int bottom) * Repaints the rectangle blocks which are marked as 'dirty'. * * @see SetDirtyBlocks + * + * @ingroup dirty */ void DrawDirtyBlocks() { @@ -1541,9 +1553,9 @@ void DrawDirtyBlocks() } /** - * This function extends the internal _invalid_rect rectangle as it - * now contains the rectangle defined by the given parameters. Note - * the point (0,0) is top left. + * Add the specified rectangle to the collection of screen areas to be + * invalidated and redrawn. + * Note the point (0,0) is top left. * * @param left The left edge of the rectangle * @param top The top edge of the rectangle @@ -1551,9 +1563,7 @@ void DrawDirtyBlocks() * @param bottom The bottom edge of the rectangle * @see DrawDirtyBlocks * - * @todo The name of the function should be called like @c AddDirtyBlock as - * it neither set a dirty rect nor add several dirty rects although - * the function name is in plural. (Progman) + * @ingroup dirty */ void SetDirtyBlocks(int left, int top, int right, int bottom) {