You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
12 KiB
Bash
349 lines
12 KiB
Bash
#!/bin/bash
|
|
|
|
# $Id$
|
|
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
# This file generates all project files based on sources.list, so everyone who
|
|
# can start a bash process, can update the project files.
|
|
|
|
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_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
|
|
|
|
# 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
|
|
|
|
# openttd_vs100.sln is for MSVC 2010
|
|
# openttd_vs100.vcxproj is for MSVC 2010
|
|
# openttd_vs100.vcxproj.filters is for MSVC 2010
|
|
# langs_vs100.vcxproj is for MSVC 2010
|
|
# strgen_vs100.vcxproj is for MSVC 2010
|
|
# strgen_vs100.vcxproj.filters is for MSVC 2010
|
|
# generate_vs100.vcxproj is for MSVC 2010
|
|
# version_vs100.vcxproj is for MSVC 2010
|
|
|
|
# openttd_vs90.sln is for MSVC 2008
|
|
# openttd_vs90.vcproj is for MSVC 2008
|
|
# langs_vs90.vcproj is for MSVC 2008
|
|
# strgen_vs90.vcproj is for MSVC 2008
|
|
# generate_vs90.vcproj is for MSVC 2008
|
|
# version_vs90.vcproj is for MSVC 2008
|
|
|
|
# openttd_vs80.sln is for MSVC 2005
|
|
# openttd_vs80.vcproj is for MSVC 2005
|
|
# langs_vs80.vcproj is for MSVC 2005
|
|
# strgen_vs80.vcproj is for MSVC 2005
|
|
# generate_vs80.vcproj is for MSVC 2005
|
|
# version_vs80.vcproj is for MSVC 2005
|
|
|
|
|
|
|
|
# First, collect the list of Windows files
|
|
allegro_config=""
|
|
sdl_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 | tr '\r' '\n' | awk '
|
|
/^( *)#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 == "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 == "BEOS" && "'$os'" != "BEOS") { 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 == "LIBTIMIDITY" && "'$libtimidity'" == "" ) { next; }
|
|
if ($0 == "HAVE_THREAD" && "'$with_threads'" == "0") { next; }
|
|
|
|
skip += 1;
|
|
|
|
next;
|
|
}
|
|
/^( *)#/ {
|
|
if (deep == skip) {
|
|
gsub(" ", "", $0);
|
|
gsub("^#", "", $0);
|
|
gsub("^ ", "", $0);
|
|
|
|
if (first_time != 0) {
|
|
print "#1 </Filter>";
|
|
} else {
|
|
first_time = 1;
|
|
}
|
|
|
|
filter = $0;
|
|
print "#1 <Filter";
|
|
print "#1 Name=\\""filter"\\"";
|
|
print "#1 >";
|
|
print "#3 <Filter Include=\\""filter"\\">";
|
|
printf "#3 <UniqueIdentifier>{c76ff9f1-1e62-46d8-8d55-%012d}</UniqueIdentifier>\n", i;
|
|
print "#3 </Filter>";
|
|
i += 1;
|
|
}
|
|
|
|
next;
|
|
}
|
|
/^$/ { next }
|
|
{
|
|
if (deep == skip) {
|
|
gsub(" ", "", $0);
|
|
gsub("/", "\\\\", $0);
|
|
print "#1 <File";
|
|
print "#1 RelativePath=\\".\\\\'$file_prefix'"$0"\\"";
|
|
print "#1 >";
|
|
print "#1 </File>";
|
|
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>"filter"</Filter>";
|
|
print "#4 </"cltype">";
|
|
}
|
|
}
|
|
END { print "#1 </Filter>"; }
|
|
'`"
|
|
|
|
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
|
|
#1 <File
|
|
#1 RelativePath=\"..\\src\\lang\\"$i".txt\"
|
|
#1 >
|
|
#1 <FileConfiguration
|
|
#1 Name=\"Debug|Win32\"
|
|
#1 >
|
|
#1 <Tool
|
|
#1 Name=\"VCCustomBuildTool\"
|
|
#1 Description=\"Generating "$i" language file\"
|
|
#1 CommandLine=\"..\\objs\\strgen\\strgen.exe -s ..\\src\\lang -d ..\\bin\\lang "\$(InputPath)"
exit 0
\"
|
|
#1 AdditionalDependencies=\"..\\src\\lang\\english.txt;..\\objs\\strgen\\strgen.exe\"
|
|
#1 Outputs=\"..\\bin\\lang\\"$i".lng\"
|
|
#1 />
|
|
#1 </FileConfiguration>
|
|
#1 </File>
|
|
#2 <CustomBuild Include=\"..\\src\\lang\\"$i".txt\">
|
|
#2 <Message Condition=\"'\$(Configuration)|\$(Platform)'=='Debug|Win32'\">Generating "$i" language file</Message>
|
|
#2 <Command Condition=\"'\$(Configuration)|\$(Platform)'=='Debug|Win32'\">..\\objs\\strgen\\strgen.exe -s ..\\src\\lang -d ..\\bin\\lang \"%(FullPath)\"</Command>
|
|
#2 <AdditionalInputs Condition=\"'\$(Configuration)|\$(Platform)'=='Debug|Win32'\">..\\src\\lang\\english.txt;..\\objs\\strgen\\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
|
|
#2 <Outputs Condition=\"'\$(Configuration)|\$(Platform)'=='Debug|Win32'\">..\\bin\\lang\\"$i".lng;%(Outputs)</Outputs>
|
|
#2 </CustomBuild>
|
|
#3 <CustomBuild Include=\"..\\src\\lang\\"$i".txt\">
|
|
#3 <Filter>Translations</Filter>
|
|
#3 </CustomBuild>"
|
|
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
|
|
#1 <File
|
|
#1 RelativePath=\"..\\src\\table\\"$i"\"
|
|
#1 >
|
|
#1 </File>
|
|
#2 <None Include=\"..\\src\\table\\"$i"\" />
|
|
#4 <None Include=\"..\\src\\table\\"$i"\">
|
|
#4 <Filter>INI</Filter>
|
|
#4 </None>"
|
|
RES2="$RES2 ..\\src\\table\\"$i
|
|
done
|
|
|
|
eval "$2=\"\$RES\$RES2\""
|
|
}
|
|
|
|
generate() {
|
|
echo "Generating $2..."
|
|
if [ $# -eq 3 ]; then
|
|
# Everything above the !!FILTERS!! marker
|
|
cat "$ROOT_DIR/projects/$2".in | tr '\r' '\n' | awk '
|
|
/^$/ { next }
|
|
/!!FILTERS!!/ { stop = 1; }
|
|
{
|
|
if (stop == 0) { print $0 }
|
|
}
|
|
' > "$ROOT_DIR/projects/$2"
|
|
|
|
echo "$3" >> "$ROOT_DIR/projects/$2"
|
|
|
|
# Everything below the !!FILTERS!! marker and above the !!FILES!! marker
|
|
cat "$ROOT_DIR/projects/$2".in | tr '\r' '\n' | awk '
|
|
BEGIN { stop = 1; }
|
|
/^$/ { next }
|
|
/!!FILTERS!!/ { stop = 2; }
|
|
/!!FILES!!/ { stop = 1; }
|
|
{
|
|
if (stop == 0) { print $0 }
|
|
if (stop == 2) { stop = 0 }
|
|
}
|
|
' >> "$ROOT_DIR/projects/$2"
|
|
else
|
|
# Everything above the !!FILES!! marker
|
|
cat "$ROOT_DIR/projects/$2".in | tr '\r' '\n' | awk '
|
|
/^$/ { next }
|
|
/!!FILES!!/ { stop = 1; }
|
|
{
|
|
if (stop == 0) { print $0 }
|
|
}
|
|
' > "$ROOT_DIR/projects/$2"
|
|
fi
|
|
|
|
echo "$1" >> "$ROOT_DIR/projects/$2"
|
|
|
|
# Everything below the !!FILES!! marker
|
|
cat "$ROOT_DIR/projects/$2".in | tr '\r' '\n' | awk '
|
|
BEGIN { stop = 1; }
|
|
/^$/ { next }
|
|
/!!FILES!!/ { stop = 2; }
|
|
{
|
|
if (stop == 0) { print $0 }
|
|
if (stop == 2) { stop = 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"`
|
|
openttd=`echo "$openttd" | grep "^#1" | sed "s~#1~~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"`
|
|
lang=`echo "$lang" | grep "^#1" | sed "s~#1~~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"`
|
|
settings=`echo "$settings" | grep "^#1" | sed "s~#1~~g"`
|
|
|
|
generate "$openttd" "openttd_vs80.vcproj"
|
|
generate "$openttd" "openttd_vs90.vcproj"
|
|
generate "$openttdvcxproj" "openttd_vs100.vcxproj"
|
|
generate "$openttdfiles" "openttd_vs100.vcxproj.filters" "$openttdfilters"
|
|
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 "$lang" "langs_vs80.vcproj"
|
|
generate "$lang" "langs_vs90.vcproj"
|
|
generate "$langvcxproj" "langs_vs100.vcxproj"
|
|
generate "$langfiles" "langs_vs100.vcxproj.filters"
|
|
generate "$langvcxproj" "langs_vs140.vcxproj"
|
|
generate "$langfiles" "langs_vs140.vcxproj.filters"
|
|
generate "$langvcxproj" "langs_vs141.vcxproj"
|
|
generate "$langfiles" "langs_vs141.vcxproj.filters"
|
|
generate "$settings" "settings_vs80.vcproj" "$settingscommand"
|
|
generate "$settings" "settings_vs90.vcproj" "$settingscommand"
|
|
generate "$settingsvcxproj" "settings_vs100.vcxproj" "$settingscommand"
|
|
generate "$settingsfiles" "settings_vs100.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"
|