Skip to content

Commit

Permalink
Generate and build macOS app bundles through CMake.
Browse files Browse the repository at this point in the history
This uses the OpenLoco logo by Zcooger as the app icon.

Co-authored-by: Marijn van der Werf <marijn.vanderwerf@gmail.com>
Co-authored-by: Tom Lankhorst <hello@tomlankhorst.nl>
  • Loading branch information
3 people committed Feb 26, 2019
1 parent 33b8799 commit fd764a1
Show file tree
Hide file tree
Showing 11 changed files with 213 additions and 6 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,6 +1,8 @@
artefacts/
bin.*/
boost/
lib/
vcpkg/

## Visual Studio Code
.vscode/
Expand Down
8 changes: 6 additions & 2 deletions .travis.yml
Expand Up @@ -53,7 +53,9 @@ matrix:
- brew install https://raw.githubusercontent.com/OpenLoco/Dependencies/master/macos/boost.rb
script:
- curl -L https://github.com/OpenLoco/Dependencies/releases/download/v1.1.0/openloco.dependencies.macos.1.1.0.zip -o dependencies.zip
- unzip dependencies.zip -d vcpkg/
- unzip -q dependencies.zip -d vcpkg/
- curl -L https://github.com/OpenLoco/Dependencies/releases/download/v1.1.1/macos-x86-static-boost-1.68.0.zip -o boost.zip
- unzip -q boost.zip -d boost/
- mkdir build && cd build
- cmake .. "-DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x86-osx
- make -j2
Expand All @@ -68,7 +70,9 @@ matrix:
- brew install https://raw.githubusercontent.com/OpenLoco/Dependencies/master/macos/boost.rb
script:
- curl -L https://github.com/OpenLoco/Dependencies/releases/download/v1.1.0/openloco.dependencies.macos.1.1.0.zip -o dependencies.zip
- unzip dependencies.zip -d vcpkg/
- unzip -q dependencies.zip -d vcpkg/
- curl -L https://github.com/OpenLoco/Dependencies/releases/download/v1.1.1/macos-x86-static-boost-1.68.0.zip -o boost.zip
- unzip -q boost.zip -d boost/
- mkdir build && cd build
- cmake .. "-DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x86-osx
- make -j2
Expand Down
51 changes: 50 additions & 1 deletion CMakeLists.txt
@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.8)
cmake_minimum_required(VERSION 3.9)
cmake_policy(VERSION 3.9)

set (PROJECT openloco)

Expand Down Expand Up @@ -230,6 +231,54 @@ endif()
if (APPLE)
target_link_libraries(${PROJECT} "-framework Cocoa")

set_target_properties(${PROJECT} PROPERTIES
MACOSX_BUNDLE ON
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/distribution/macos/Info.plist.in)

set(MACOSX_BUNDLE_BUNDLE_NAME "OpenLoco")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${OPENRCT2_COMMIT_SHA1_SHORT}")
set(MACOSX_BUNDLE_COPYRIGHT "OpenLoco is licensed under the MIT License")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "io.openloco.OpenLoco")
set(MACOSX_BUNDLE_ICON_FILE "AppIcon")

if(${OPENLOCO_BRANCH} EQUAL master)
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${OPENLOCO_VERSION_TAG}")
else()
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${OPENLOCO_VERSION_TAG} ${OPENLOCO_BRANCH}")
endif()

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/distribution/macos/AppIcon.iconset DESTINATION ${CMAKE_BINARY_DIR})
set(ICON_TARGET "${CMAKE_BINARY_DIR}/AppIcon.iconset")
set(ICON_OUTPUT "${CMAKE_BINARY_DIR}/AppIcon.icns")
set(SOURCE_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/resources/logo")

add_custom_command(OUTPUT ${ICON_OUTPUT}
COMMAND cp icon_x16.png ${ICON_TARGET}/icon_16x16.png
COMMAND cp icon_x32.png ${ICON_TARGET}/icon_16x16@2x.png
COMMAND cp icon_x32.png ${ICON_TARGET}/icon_32x32.png
COMMAND cp icon_x64.png ${ICON_TARGET}/icon_32x32@2x.png
COMMAND cp icon_x128.png ${ICON_TARGET}/icon_128x128.png
COMMAND cp icon_x256.png ${ICON_TARGET}/icon_128x128@2x.png
COMMAND cp icon_x256.png ${ICON_TARGET}/icon_256x256.png
COMMAND cp icon_x512.png ${ICON_TARGET}/icon_256x256@2x.png
COMMAND cp icon_x512.png ${ICON_TARGET}/icon_512x512.png
COMMAND cp icon_x1024.png ${ICON_TARGET}/icon_512x512@2x.png
COMMAND iconutil -c icns ${ICON_TARGET}
WORKING_DIRECTORY ${SOURCE_ICON_DIR})

set(BUNDLE_RESOURCES ${ICON_OUTPUT})
list(APPEND BUNDLE_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md)
list(APPEND BUNDLE_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CONTRIBUTORS.MD)
set_target_properties(${PROJECT} PROPERTIES RESOURCE "${BUNDLE_RESOURCES}")
target_sources(${PROJECT} PUBLIC ${BUNDLE_RESOURCES})

file(GLOB BUNDLE_LANGUAGES "${CMAKE_CURRENT_SOURCE_DIR}/data/language/*")
target_sources(${PROJECT} PUBLIC ${BUNDLE_LANGUAGES})
set_property(
SOURCE ${BUNDLE_LANGUAGES}
PROPERTY MACOSX_PACKAGE_LOCATION "Resources/language"
)

try_compile(SUPPORT_STD_BYTE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/std_byte.cpp CXX_STANDARD 17)
if (NOT SUPPORT_STD_BYTE)
message(STATUS "std::byte is not supported.")
Expand Down
68 changes: 68 additions & 0 deletions distribution/macos/AppIcon.iconset/Contents.json
@@ -0,0 +1,68 @@
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon_16x16.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon_16x16@2x.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon_32x32.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon_32x32@2x.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon_128x128.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon_128x128@2x.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon_256x256.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon_256x256@2x.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon_512x512.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon_512x512@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
55 changes: 55 additions & 0 deletions distribution/macos/Info.plist.in
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Executable file -->
<key>CFBundleExecutable</key>
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>

<key>CFBundleGetInfoString</key>
<string>${MACOSX_BUNDLE_INFO_STRING}</string>

<!-- Icon file -->
<key>CFBundleIconFile</key>
<string>${MACOSX_BUNDLE_ICON_FILE}</string>

<!-- Bundle identifier -->
<key>CFBundleIdentifier</key>
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>

<!-- InfoDictionary version -->
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>

<!-- Bundle name -->
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>

<!-- Bundle OS Type code -->
<key>CFBundlePackageType</key>
<string>APPL</string>

<!-- Bundle versions string, short -->
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>

<key>CFBundleSignature</key>
<string>????</string>

<!-- Bundle version -->
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>

<!-- Resources should be file-mapped -->
<key>CSResourcesFileMapped</key>
<true/>

<!--High Resolution Capable-->
<key>NSHighResolutionCapable</key>
<true/>

<!--Copyright (human-readable)-->
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
</dict>
</plist>
9 changes: 8 additions & 1 deletion src/openloco/environment.cpp
Expand Up @@ -207,6 +207,12 @@ namespace openloco::environment
case path_id::scores:
case path_id::openloco_yml:
return platform::get_user_directory();
case path_id::language_files:
#if defined(__APPLE__) && defined(__MACH__)
return platform::GetBundlePath();
#else
return platform::GetCurrentExecutablePath().parent_path() / "data";
#endif
default:
return get_loco_install_path();
}
Expand Down Expand Up @@ -263,7 +269,8 @@ namespace openloco::environment
"Data/TUT800_1.DAT",
"Data/TUT800_2.DAT",
"Data/TUT800_3.DAT",
"openloco.yml"
"openloco.yml",
"language",
};

size_t index = (size_t)id;
Expand Down
1 change: 1 addition & 0 deletions src/openloco/environment.h
Expand Up @@ -65,6 +65,7 @@ namespace openloco::environment
tut800_2,
tut800_3,
openloco_yml,
language_files,
};

fs::path get_path(path_id id);
Expand Down
2 changes: 1 addition & 1 deletion src/openloco/localisation/languagefiles.cpp
Expand Up @@ -260,7 +260,7 @@ namespace openloco::localisation
void loadLanguageFile()
{
// First, load en-GB for fallback strings.
fs::path languageDir = platform::GetCurrentExecutablePath().parent_path() / "data" / "language";
fs::path languageDir = environment::get_path(environment::path_id::language_files);
fs::path languageFile = languageDir / "en-GB.yml";
if (!loadLanguageStringTable(languageFile))
throw std::runtime_error("Could not load the en-GB language file!");
Expand Down
3 changes: 2 additions & 1 deletion src/openloco/localisation/languages.cpp
@@ -1,4 +1,5 @@
#include "languages.h"
#include "../environment.h"
#include "../platform/platform.h"
#include "../utility/yaml.hpp"
#include "conversion.h"
Expand Down Expand Up @@ -26,7 +27,7 @@ namespace openloco::localisation
language_descriptors.emplace_back(undefinedLanguage);

// Search the languages dir for YAML language files.
fs::path languageDir = platform::GetCurrentExecutablePath().parent_path() / "data" / "language";
fs::path languageDir = environment::get_path(environment::path_id::language_files);
for (auto& entry : fs::directory_iterator(languageDir))
{
auto filename = entry.path().string();
Expand Down
3 changes: 3 additions & 0 deletions src/openloco/platform/platform.h
Expand Up @@ -16,4 +16,7 @@ namespace openloco::platform
std::string prompt_directory(const std::string& title);
fs::path GetCurrentExecutablePath();
std::vector<fs::path> get_drives();
#if defined(__APPLE__) && defined(__MACH__)
fs::path GetBundlePath();
#endif
}
17 changes: 17 additions & 0 deletions src/openloco/platform/platform.macos.mm
Expand Up @@ -53,4 +53,21 @@
}
}

fs::path openloco::platform::GetBundlePath()
{
@autoreleasepool
{
NSBundle * bundle = [NSBundle mainBundle];
if (bundle)
{
auto resources = bundle.resourcePath.UTF8String;
if (fs::exists(resources))
{
return resources;
}
}
return fs::path();
}
}

#endif

0 comments on commit fd764a1

Please sign in to comment.