summaryrefslogtreecommitdiff
path: root/build/unix/prepare-install-package.sh
blob: 9a89f8d4e08768963ce08ada619ffbf9046945c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#!/bin/bash

#
#
# This is the Bash equivalent of ../windows/prepare-install-package.ps1.
# When making changes, both scripts should be updated.
#
#


##########
## Constants
##########
# paths
gamePath="/home/pathoschild/Stardew Valley"
bundleModNames=("ConsoleCommands" "ErrorHandler" "SaveBackup")

# build configuration
buildConfig="Release"
folders=("linux" "macOS" "windows")
declare -A runtimes=(["linux"]="linux-x64" ["macOS"]="osx-x64" ["windows"]="win-x64")
declare -A msBuildPlatformNames=(["linux"]="Unix" ["macOS"]="OSX" ["windows"]="Windows_NT")


##########
## Move to SMAPI root
##########
cd "`dirname "$0"`/../.."


##########
## Clear old build files
##########
echo "Clearing old builds..."
echo "-------------------------------------------------"
for path in bin */**/bin */**/obj; do
    echo "$path"
    rm -rf $path
done
echo ""

##########
## Compile files
##########
for folder in ${folders[@]}; do
    runtime=${runtimes[$folder]}
    msbuildPlatformName=${msBuildPlatformNames[$folder]}

    echo "Compiling SMAPI for $folder..."
    echo "-------------------------------------------------"
    dotnet publish src/SMAPI --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained true
    echo ""
    echo ""

    echo "Compiling installer for $folder..."
    echo "-------------------------------------------------"
    dotnet publish src/SMAPI.Installer --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" -p:PublishTrimmed=True -p:TrimMode=Link --self-contained true
    echo ""
    echo ""

    for modName in ${bundleModNames[@]}; do
        echo "Compiling $modName for $folder..."
        echo "-------------------------------------------------"
        dotnet publish src/SMAPI.Mods.$modName --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false"
        echo ""
        echo ""
    done
done


##########
## Prepare install package
##########
echo "Preparing install package..."
echo "-------------------------------------------------"

# init paths
installAssets="src/SMAPI.Installer/assets"
packagePath="bin/SMAPI installer"
packageDevPath="bin/SMAPI installer for developers"

# init structure
for folder in ${folders[@]}; do
    mkdir "$packagePath/internal/$folder/bundle/smapi-internal" --parents
done

# copy base installer files
for name in "install on Linux.sh" "install on macOS.command" "install on Windows.bat" "README.txt"; do
    cp "$installAssets/$name" "$packagePath"
done

# copy per-platform files
for folder in ${folders[@]}; do
    runtime=${runtimes[$folder]}

    # get paths
    smapiBin="src/SMAPI/bin/$buildConfig/$runtime/publish"
    internalPath="$packagePath/internal/$folder"
    bundlePath="$internalPath/bundle"

    # installer files
    cp -r "src/SMAPI.Installer/bin/$buildConfig/$runtime/publish"/* "$internalPath"
    rm -rf "$internalPath/assets"

    # runtime config for SMAPI
    # This is identical to the one generated by the build, except that the min runtime version is
    # set to 5.0.0 (instead of whatever version it was built with) and rollForward is set to latestMinor instead of
    # minor.
    cp "$installAssets/runtimeconfig.json" "$bundlePath/StardewModdingAPI.runtimeconfig.json"

    # installer DLL config
    if [ $folder == "windows" ]; then
        cp "$installAssets/windows-exe-config.xml" "$packagePath/internal/windows/install.exe.config"
    fi

    # bundle root files
    for name in "StardewModdingAPI" "StardewModdingAPI.dll" "StardewModdingAPI.pdb" "StardewModdingAPI.xml" "steam_appid.txt"; do
        if [ $name == "StardewModdingAPI" ] && [ $folder == "windows" ]; then
            name="$name.exe"
        fi

        cp "$smapiBin/$name" "$bundlePath"
    done

    # bundle i18n
    cp -r "$smapiBin/i18n" "$bundlePath/smapi-internal"

    # bundle smapi-internal
    for name in "0Harmony.dll" "0Harmony.xml" "Mono.Cecil.dll" "Mono.Cecil.Mdb.dll" "Mono.Cecil.Pdb.dll" "MonoMod.Common.dll" "Newtonsoft.Json.dll" "TMXTile.dll" "SMAPI.Toolkit.dll" "SMAPI.Toolkit.pdb" "SMAPI.Toolkit.xml" "SMAPI.Toolkit.CoreInterfaces.dll" "SMAPI.Toolkit.CoreInterfaces.pdb" "SMAPI.Toolkit.CoreInterfaces.xml"; do
        cp "$smapiBin/$name" "$bundlePath/smapi-internal"
    done

    cp "$smapiBin/SMAPI.config.json" "$bundlePath/smapi-internal/config.json"
    cp "$smapiBin/SMAPI.metadata.json" "$bundlePath/smapi-internal/metadata.json"
    if [ $folder == "linux" ] || [ $folder == "macOS" ]; then
        cp "$installAssets/unix-launcher.sh" "$bundlePath"
        cp "$smapiBin/System.Runtime.Caching.dll" "$bundlePath/smapi-internal"
    else
        cp "$installAssets/windows-exe-config.xml" "$bundlePath/StardewModdingAPI.exe.config"
    fi

    # copy .NET dependencies
    cp "$smapiBin/System.Configuration.ConfigurationManager.dll" "$bundlePath/smapi-internal"
    cp "$smapiBin/System.Runtime.Caching.dll" "$bundlePath/smapi-internal"
    cp "$smapiBin/System.Security.Permissions.dll" "$bundlePath/smapi-internal"
    if [ $folder == "windows" ]; then
        cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
    fi

    # copy bundled mods
    for modName in ${bundleModNames[@]}; do
        fromPath="src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
        targetPath="$bundlePath/Mods/$modName"

        mkdir "$targetPath" --parents

        cp "$fromPath/$modName.dll" "$targetPath"
        cp "$fromPath/$modName.pdb" "$targetPath"
        cp "$fromPath/manifest.json" "$targetPath"
        if [ -d "$fromPath/i18n" ]; then
            cp -r "$fromPath/i18n" "$targetPath"
        fi
    done
done

# mark scripts executable
for path in "install on Linux.sh" "install on macOS.command" "bundle/unix-launcher.sh"; do
    if [ -f "$packagePath/$path" ]; then
        chmod 755 "$packagePath/$path"
    fi
done

# split into main + for-dev folders
cp -r "$packagePath" "$packageDevPath"
for folder in ${folders[@]}; do
    # disable developer mode in main package
    sed --in-place --expression="s/\"DeveloperMode\": true/\"DeveloperMode\": false/" "$packagePath/internal/$folder/bundle/smapi-internal/config.json"

    # convert bundle folder into final 'install.dat' files
    for path in "$packagePath/internal/$folder" "$packageDevPath/internal/$folder"; do
        pushd "$path/bundle" > /dev/null
        zip "install.dat" * --recurse-paths --quiet
        popd > /dev/null
        mv "$path/bundle/install.dat" "$path/install.dat"
        rm -rf "$path/bundle"
    done
done


##########
## Create release zips
##########
# get version number
version="$1"
if [ $# -eq 0 ]; then
    echo "SMAPI release version (like '4.0.0'):"
    read version
fi

# rename folders
mv "$packagePath" "bin/SMAPI $version installer"
mv "$packageDevPath" "bin/SMAPI $version installer for developers"

# package files
pushd bin > /dev/null
zip -9 "SMAPI $version installer.zip" "SMAPI $version installer" --recurse-paths --quiet
zip -9 "SMAPI $version installer for developers.zip" "SMAPI $version installer for developers" --recurse-paths --quiet
popd > /dev/null

echo ""
echo "Done! Package created in $(pwd)/bin"