build: added script for creating MacOSX app bundle
This change makes it possible to create a MacOSX app bundle of either Debug or Release builds: * The script setup/MacOSX/bundle_install.sh is configured by cmake to be placed in the apps Debug and Release folders. * Execution of bundle_install.sh creates the bundle file structure and copies binaries, libs, frameworks and resources into it. * The script uses install_name_tool to reconfigure the dynamic library paths and framework paths of the binary, so they won't point to the system libraries, but to the locations in the bundle instead. * An Info.plist file is also configured by cmake and placed in the bundle by the script. Note: It is named bundle_info.plist in the Debug and Release folders after configuration so the start of the binary during developement does not use it. * When opening the bundle it is assured via setup() in src/app/platform_includes/includesMac.h that the working directory of the binary is set to .app/Contents/Resources so the paths to the data files are evaluated correctly. fortune cookie message = Dein Einsatz wird in Kürze belohnt werden.
This commit is contained in:
+51
-9
@@ -13,10 +13,13 @@ set(LIB_PROJECT_NAME "${PROJECT_NAME}_lib")
|
||||
set(TEST_PROJECT_NAME "${PROJECT_NAME}_test")
|
||||
|
||||
if (WIN32)
|
||||
set(PLATFORM_INCLUDES "#include \"includesWindows.h\"")
|
||||
set(PLATFORM_INCLUDE "includesWindows.h")
|
||||
LINK_DIRECTORIES($ENV{VLD_DIR}/lib/Win32) # this adds the library path for VLD, must be done before the project target is created
|
||||
endif()
|
||||
|
||||
elseif (APPLE)
|
||||
set(PLATFORM_INCLUDE "includesMac.h")
|
||||
else ()
|
||||
set(PLATFORM_INCLUDE "includesDefault.h")
|
||||
endif ()
|
||||
|
||||
# Settings ---------------------------------------------------------------------
|
||||
|
||||
@@ -42,9 +45,7 @@ set(Boost_USE_MULTITHREAD ON)
|
||||
set(Boost_USE_STATIC_LIBS OFF)
|
||||
set(Boost_USE_STATIC_RUNTIME OFF)
|
||||
set(BOOST_LIBRARYDIR $ENV{BOOST_155_DIR})
|
||||
find_package( Boost 1.55 COMPONENTS system filesystem REQUIRED )
|
||||
|
||||
message("${BOOST_LIBRARYDIR}")
|
||||
find_package(Boost 1.55 COMPONENTS system filesystem REQUIRED)
|
||||
|
||||
# Lib --------------------------------------------------------------------------
|
||||
|
||||
@@ -123,12 +124,54 @@ qt5_use_modules(${APP_PROJECT_NAME} Widgets)
|
||||
|
||||
# configure platform specific include file
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/src/app/includes.h.in"
|
||||
"${PROJECT_SOURCE_DIR}/src/app/platform_includes/includes.h.in"
|
||||
"${PROJECT_SOURCE_DIR}/build/src/app/includes.h"
|
||||
)
|
||||
|
||||
# add platform specific libraries
|
||||
if (APPLE)
|
||||
find_library(CORE_FOUNDATION CoreFoundation)
|
||||
target_link_libraries(${APP_PROJECT_NAME} ${CORE_FOUNDATION})
|
||||
endif ()
|
||||
|
||||
set(CMAKE_AUTOMOC OFF)
|
||||
|
||||
# MacOSX Bundle ----------------------------------------------------------------
|
||||
|
||||
if (APPLE)
|
||||
|
||||
set(MACOSX_BUNDLE_NAME ${PROJECT_NAME})
|
||||
set(MACOSX_BINARY_NAME ${APP_PROJECT_NAME})
|
||||
|
||||
set(MACOSX_DYNAMIC_LIBRARIES ${Boost_LIBRARIES})
|
||||
string(REPLACE ";" " " MACOSX_DYNAMIC_LIBRARIES "${MACOSX_DYNAMIC_LIBRARIES}")
|
||||
|
||||
get_property(QT_CORE_PATH TARGET ${Qt5Core_LIBRARIES} PROPERTY LOCATION)
|
||||
get_filename_component(QT_CORE_PATH ${QT_CORE_PATH} REALPATH)
|
||||
|
||||
get_property(QT_GUI_PATH TARGET ${Qt5Gui_LIBRARIES} PROPERTY LOCATION)
|
||||
get_filename_component(QT_GUI_PATH ${QT_GUI_PATH} REALPATH)
|
||||
|
||||
get_property(QT_WIDGETS_PATH TARGET ${Qt5Widgets_LIBRARIES} PROPERTY LOCATION)
|
||||
get_filename_component(QT_WIDGETS_PATH ${QT_WIDGETS_PATH} REALPATH)
|
||||
|
||||
list(APPEND MACOSX_FRAMEWORKS ${QT_CORE_PATH} ${QT_GUI_PATH} ${QT_WIDGETS_PATH})
|
||||
string(REPLACE ";" " " MACOSX_FRAMEWORKS "${MACOSX_FRAMEWORKS}")
|
||||
|
||||
configure_file(
|
||||
${PROJECT_SOURCE_DIR}/setup/MacOSX/bundle_install.sh.in
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bundle_install.sh
|
||||
@ONLY
|
||||
)
|
||||
|
||||
configure_file(
|
||||
${PROJECT_SOURCE_DIR}/setup/MacOSX/Info.plist.in
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bundle_info.plist
|
||||
@ONLY
|
||||
)
|
||||
|
||||
endif ()
|
||||
|
||||
# CxxTest ----------------------------------------------------------------------
|
||||
|
||||
if (UNIX)
|
||||
@@ -200,5 +243,4 @@ if (WIN32)
|
||||
|
||||
include_directories($ENV{VLD_DIR}/include)
|
||||
|
||||
endif()
|
||||
|
||||
endif ()
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@MACOSX_BINARY_NAME@</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string></string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>at.ac.fh-salzburg.masterproject</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleLongVersionString</key>
|
||||
<string></string>
|
||||
<key>CFBundleName</key>
|
||||
<string></string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string></string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string></string>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
<true/>
|
||||
<key>LSRequiresCarbon</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string></string>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Executable
+78
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
|
||||
ABORT="\033[31mAbort:\033[00m"
|
||||
SUCCESS="\033[32mSuccess:\033[00m"
|
||||
INFO="\033[33mInfo:\033[00m"
|
||||
|
||||
MY_PATH=`dirname "$0"`
|
||||
cd $MY_PATH
|
||||
|
||||
echo -e $INFO "Creating app bundle for MacOSX."
|
||||
|
||||
BUNDLE_NAME="@MACOSX_BUNDLE_NAME@"
|
||||
APP_NAME="@MACOSX_BINARY_NAME@"
|
||||
DYNLIB_PATHS=(@MACOSX_DYNAMIC_LIBRARIES@)
|
||||
FRAMEWORK_PATHS=(@MACOSX_FRAMEWORKS@)
|
||||
|
||||
if [ ! -x "$APP_NAME" ]
|
||||
then
|
||||
echo -e $ABORT "Executable $APP_NAME does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -e "bundle_info.plist" ]
|
||||
then
|
||||
echo -e $ABORT "bundle_info.plist does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BUNDLE_PATH=$BUNDLE_NAME.app
|
||||
BIN_DIR=$BUNDLE_PATH/Contents/MacOS
|
||||
DYNLIB_DIR=$BUNDLE_PATH/Contents/lib
|
||||
FRAMEWORK_DIR=$BUNDLE_PATH/Contents/Frameworks
|
||||
RES_DIR=$BUNDLE_PATH/Contents/Resources
|
||||
APP_PATH=$BIN_DIR/$APP_NAME
|
||||
|
||||
if [ -d "$BUNDLE_PATH" ]
|
||||
then
|
||||
echo -e $INFO "Removing old bundle."
|
||||
rm -rf $BUNDLE_PATH
|
||||
fi
|
||||
|
||||
echo -e $INFO "Creating bundle folders."
|
||||
mkdir -p $BIN_DIR
|
||||
mkdir -p $DYNLIB_DIR
|
||||
mkdir -p $FRAMEWORK_DIR
|
||||
mkdir -p $RES_DIR
|
||||
|
||||
echo -e $INFO "Copying bundle contents."
|
||||
cp $APP_NAME $APP_PATH
|
||||
cp bundle_info.plist $BUNDLE_PATH/Contents/Info.plist
|
||||
cp -R ../data $RES_DIR/data
|
||||
|
||||
echo -e $INFO "Copying dynamic libraries."
|
||||
for LIB_PATH in ${DYNLIB_PATHS[@]}
|
||||
do
|
||||
LIB_NAME=$(basename $LIB_PATH)
|
||||
cp $LIB_PATH $DYNLIB_DIR/$LIB_NAME
|
||||
install_name_tool -change $LIB_NAME @executable_path/../lib/$LIB_NAME $APP_PATH
|
||||
|
||||
echo $LIB_PATH $LIB_NAME
|
||||
done
|
||||
|
||||
echo -e $INFO "Copying frameworks."
|
||||
for FRAMEWORK_BIN_PATH in ${FRAMEWORK_PATHS[@]}
|
||||
do
|
||||
FRAMEWORK_PATH=$(echo $FRAMEWORK_BIN_PATH | grep -o "\S*.framework")
|
||||
FRAMEWORK_NAME=$(echo $FRAMEWORK_BIN_PATH | grep -o "\w*.framework")
|
||||
cp -R $FRAMEWORK_PATH $FRAMEWORK_DIR/$FRAMEWORK_NAME
|
||||
|
||||
FRAMEWORK_SUB_PATH=$(echo $FRAMEWORK_BIN_PATH | grep -o "\w*.framework\S*")
|
||||
install_name_tool -change $FRAMEWORK_BIN_PATH @loader_path/../Frameworks/$FRAMEWORK_SUB_PATH $APP_PATH
|
||||
|
||||
echo $FRAMEWORK_BIN_PATH $FRAMEWORK_PATH
|
||||
done
|
||||
|
||||
otool -L $APP_PATH
|
||||
|
||||
echo -e $SUCCESS "Installed bundle successfully!"
|
||||
@@ -1,6 +1,10 @@
|
||||
add_files(
|
||||
APP_FILES
|
||||
|
||||
platform_includes/includesDefault.h
|
||||
platform_includes/includesMac.h
|
||||
platform_includes/includesWindows.h
|
||||
|
||||
qt/element/QtCodeFile.cpp
|
||||
qt/element/QtCodeFile.h
|
||||
qt/element/QtButton.cpp
|
||||
@@ -39,6 +43,5 @@ add_files(
|
||||
qt/QtWidgetWrapper.cpp
|
||||
qt/QtWidgetWrapper.h
|
||||
|
||||
includesWindows.h
|
||||
main.cpp
|
||||
)
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#ifndef INCLUDES_H
|
||||
#define INCLUDES_H
|
||||
|
||||
// platform specific includes
|
||||
@PLATFORM_INCLUDES@
|
||||
|
||||
#endif // INCLUDES_H
|
||||
+3
-1
@@ -3,12 +3,14 @@
|
||||
#include <QApplication>
|
||||
|
||||
#include "Application.h"
|
||||
#include "includes.h"
|
||||
#include "includes.h" // defines 'void setup()'
|
||||
#include "qt/QtGuiFactory.h"
|
||||
#include "qt/utility/utilityQt.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
setup();
|
||||
|
||||
QApplication qtApp(argc, argv);
|
||||
QtGuiFactory guiFactory;
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef INCLUDES_H
|
||||
#define INCLUDES_H
|
||||
|
||||
void setup();
|
||||
|
||||
// platform specific include
|
||||
#include "platform_includes/@PLATFORM_INCLUDE@"
|
||||
|
||||
#endif // INCLUDES_H
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef INCLUDES_DEFAULT_H
|
||||
#define INCLUDES_DEFAULT_H
|
||||
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
#endif // INCLUDES_DEFAULT_H
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef INCLUDES_MAC_H
|
||||
#define INCLUDES_MAC_H
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
// ----------------------------------------------------------------------------
|
||||
// This makes relative paths work in C++ in Xcode by changing directory to the Resources folder inside the .app bundle
|
||||
// source: http://stackoverflow.com/questions/516200/relative-paths-not-working-in-xcode-c
|
||||
CFBundleRef mainBundle = CFBundleGetMainBundle();
|
||||
if (!mainBundle)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFStringRef bundleIdentifier = CFBundleGetIdentifier(mainBundle);
|
||||
// std::cout << CFStringGetCStringPtr(id, kCFStringEncodingASCII) << std::endl;
|
||||
if (!bundleIdentifier)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
|
||||
char path[PATH_MAX];
|
||||
if (CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
|
||||
{
|
||||
chdir(path);
|
||||
}
|
||||
CFRelease(resourcesURL);
|
||||
// ----------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
#endif // INCLUDES_MAC_H
|
||||
@@ -3,4 +3,8 @@
|
||||
|
||||
#include "vld.h"
|
||||
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
#endif // INCLUDES_WINDOWS_H
|
||||
Reference in New Issue
Block a user