Fixed #970: Launch Amiberry binary directly in macOS app bundle

This commit is contained in:
Dimitris Panokostas 2022-05-16 22:58:19 +02:00
parent c324ce5dc8
commit 13179ac5bd
4 changed files with 128 additions and 87 deletions

View file

@ -4,28 +4,28 @@
<plist version="1.0">
<dict>
<key>CFBundleGetInfoString</key>
<string>LONGVERSION</string>
<string>LONGVERSION</string>
<key>CFBundleExecutable</key>
<string>run_amiberry.zsh</string>
<string>Amiberry</string>
<key>CFBundleIdentifier</key>
<string>com.midwan.amiberry</string>
<string>com.blitterstudio.amiberry</string>
<key>CFBundleName</key>
<string>Amiberry.app</string>
<string>Amiberry.app</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<string>AppIcon</string>
<key>CFBundleIconFile</key>
<string>docs/resources/icon.png</string>
<key>UIPrerenderedIcon</key>
<true/>
<string>docs/resources/icon.png</string>
<key>UIPrerenderedIcon</key>
<true/>
<key>CFBundleShortVersionString</key>
<string>VERSION</string>
<string>VERSION</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<string>APPL</string>
<key>IFMajorVersion</key>
<integer>MAJOR</integer>
<integer>MAJOR</integer>
<key>IFMinorVersion</key>
<integer>MINOR</integer>
<integer>MINOR</integer>
</dict>
</plist>

View file

@ -3,70 +3,6 @@
CWD_VAR=$(cd "$(dirname "$0")"; pwd)
USERDIR=`echo ~`
if [[ ! -d "$USERDIR/Documents/Amiberry/Hard Drives" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Hard Drives"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Configurations" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Configurations"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Controllers" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Controllers"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Logfiles" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Logfiles"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Kickstarts" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Kickstarts"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/game-data" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/game-data"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/save-data" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/save-data"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/save-data/Autoboots" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/save-data/Autoboots"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/save-data/Debugs" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/save-data/Debugs"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/save-data/Kickstarts" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/save-data/Kickstarts"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Whdboot/save-data/Savegames" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Whdboot/save-data/Savegames"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Data/Floppy_Sounds" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Data/Floppy_Sounds"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Savestates" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Savestates"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Screenshots" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Screenshots"
fi
if [[ ! -d "$USERDIR/Documents/Amiberry/Docs" ]]; then
mkdir -p "$USERDIR/Documents/Amiberry/Docs"
fi
if [[ ! -f "$USERDIR/Documents/Amiberry/Configurations/amiberry.conf" ]]; then
cat $CWD_VAR/../Resources/Configurations/amiberry-osx.conf | sed -e "s#USERDIR#$USERDIR#g" > "$USERDIR/Documents/Amiberry/Configurations/amiberry.conf"
fi
@ -122,7 +58,3 @@ for file in $CWD_VAR/../Resources/Whdboot/**/*(.); do
cp $file "$USERDIR/Documents/Amiberry/Whdboot${file##*/Whdboot}"
fi
done
echo "Running Amiberry"
$CWD_VAR/Amiberry

View file

@ -16,9 +16,9 @@ mkdir -p Amiberry.app/Contents/Frameworks
mkdir -p Amiberry.app/Contents/Resources
# Copy executable into App bundle
cp amiberry Amiberry.app/Contents/MacOS/Amiberry
# Copy launch script into the bundle
cp run_amiberry.zsh Amiberry.app/Contents/MacOS
chmod +x Amiberry.app/Contents/MacOS/run_amiberry.zsh
# Copy init script into the bundle
cp macos_init_amiberry.zsh Amiberry.app/Contents/Resources
chmod +x Amiberry.app/Contents/Resources/macos_init_amiberry.zsh
# Copy parameter list into the bundle
cat Info.plist.template | sed -e "s/LONGVERSION/$LONGVER/" | sed -e "s/VERSION/$VERSION/" | sed -e "s/MAJOR/$MAJOR/" | sed -e "s/MINOR/$MINOR/" > Amiberry.app/Contents/Info.plist
# Self-sign binary

View file

@ -3118,6 +3118,107 @@ static int get_env_dir( char * path, const char *path_template, const char *envn
return ret;
}
void init_macos_amiberry_folders(std::string macos_amiberry_directory)
{
if (!my_existsdir(macos_amiberry_directory.c_str()))
my_mkdir(macos_amiberry_directory.c_str());
std::string directory = macos_amiberry_directory + "/Hard Drives";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Configurations";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Controllers";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Logfiles";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Kickstarts";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/game-data";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/save-data";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/save-data/Autoboots";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/save-data/Debugs";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/save-data/Kickstarts";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Whdboot/save-data/Savegames";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Data";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Data/Floppy_Sounds";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Savestates";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Screenshots";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
directory = macos_amiberry_directory + "/Docs";
if (!my_existsdir(directory.c_str()))
my_mkdir(directory.c_str());
}
#ifdef __MACH__
#include <mach-o/dyld.h>
void macos_copy_amiberry_files_to_userdir(std::string macos_amiberry_directory)
{
char exepath[MAX_DPATH];
uint32_t size = sizeof exepath;
if (_NSGetExecutablePath(exepath, &size) == 0)
{
std::string directory;
size_t last_slash_idx = string(exepath).rfind('/');
if (std::string::npos != last_slash_idx)
{
directory = string(exepath).substr(0, last_slash_idx);
}
last_slash_idx = directory.rfind('/');
if (std::string::npos != last_slash_idx)
{
directory = directory.substr(0, last_slash_idx);
}
char command[MAX_DPATH];
sprintf(command, "%s/%s", directory.c_str(), "Resources/macos_init_amiberry.zsh");
system(command);
}
}
#endif
static void init_amiberry_paths(void)
{
strncpy(current_dir, start_path_data, MAX_DPATH - 1);
@ -3143,9 +3244,17 @@ static void init_amiberry_paths(void)
snprintf(rp9_path, MAX_DPATH, "%s/rp9/", start_path_data);
#ifdef __MACH__
// Open amiberry.conf from Application Data directory
string macos_home_directory = getenv("HOME");
snprintf(amiberry_conf_file, MAX_DPATH, "%s", (macos_home_directory + "/Documents/Amiberry/Configurations/amiberry.conf").c_str());
printf("Using configuration: %s\n", (macos_home_directory + "/Documents/Amiberry/Configurations/amiberry.conf").c_str());
const std::string macos_home_directory = getenv("HOME");
const std::string macos_amiberry_directory = macos_home_directory + "/Documents/Amiberry";
if (!my_existsdir(macos_amiberry_directory.c_str()))
{
// Amiberry home dir is missing, generate it and all directories under it
init_macos_amiberry_folders(macos_amiberry_directory);
macos_copy_amiberry_files_to_userdir(macos_amiberry_directory);
}
snprintf(amiberry_conf_file, MAX_DPATH, "%s", (macos_amiberry_directory + "/Configurations/amiberry.conf").c_str());
write_log("Using configuration: %s\n", (macos_amiberry_directory + "/Configurations/amiberry.conf").c_str());
#else
snprintf(amiberry_conf_file, MAX_DPATH, "%s/conf/amiberry.conf", start_path_data);
#endif