From 777ec2c04d90a4c5a45dcfe51427409e5313fff2 Mon Sep 17 00:00:00 2001 From: Ceylo Date: Fri, 12 Jan 2018 21:34:22 +0100 Subject: [PATCH] Fix launch of Cocoa example due to missing MainMenu.nib in bundle app --- cmake/Macros.cmake | 30 ++++++++---- examples/cocoa/CMakeLists.txt | 84 ++++++++++++++++------------------ examples/opengl/CMakeLists.txt | 3 +- examples/pong/CMakeLists.txt | 3 +- examples/shader/CMakeLists.txt | 3 +- examples/sound/CMakeLists.txt | 3 +- examples/win32/CMakeLists.txt | 3 +- 7 files changed, 69 insertions(+), 60 deletions(-) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 0f3160348..ae53369ad 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -151,21 +151,29 @@ endmacro() # add a new target which is a SFML example # ex: sfml_add_example(ftp # SOURCES ftp.cpp ... -# DEPENDS sfml-network sfml-system) +# BUNDLE_RESOURCES MainMenu.nib ... # Files to be added in target but not installed next to the executable +# DEPENDS sfml-network sfml-system +# [INSTALL_RESOURCES_DIR]) # In addition to the sources, also install the "resources" directory macro(sfml_add_example target) # parse the arguments - cmake_parse_arguments(THIS "GUI_APP" "" "SOURCES;DEPENDS" ${ARGN}) + cmake_parse_arguments(THIS "GUI_APP;INSTALL_RESOURCES_DIR" "" "SOURCES;BUNDLE_RESOURCES;DEPENDS" ${ARGN}) # set a source group for the source files source_group("" FILES ${THIS_SOURCES}) + # check whether resources must be added in target + set(target_input ${THIS_SOURCES}) + if(THIS_BUNDLE_RESOURCES) + set(target_input ${target_input} ${THIS_BUNDLE_RESOURCES}) + endif() + # create the target if(THIS_GUI_APP AND SFML_OS_WINDOWS AND NOT DEFINED CMAKE_CONFIGURATION_TYPES AND ${CMAKE_BUILD_TYPE} STREQUAL "Release") - add_executable(${target} WIN32 ${THIS_SOURCES}) + add_executable(${target} WIN32 ${target_input}) target_link_libraries(${target} sfml-main) else() - add_executable(${target} ${THIS_SOURCES}) + add_executable(${target} ${target_input}) endif() # set the debug suffix @@ -198,12 +206,14 @@ macro(sfml_add_example target) DESTINATION ${INSTALL_MISC_DIR}/examples/${target} COMPONENT examples) - # install the example's resources as well - set(EXAMPLE_RESOURCES "${CMAKE_SOURCE_DIR}/examples/${target}/resources") - if(EXISTS ${EXAMPLE_RESOURCES}) - install(DIRECTORY ${EXAMPLE_RESOURCES} - DESTINATION ${INSTALL_MISC_DIR}/examples/${target} - COMPONENT examples) + if (THIS_INSTALL_RESOURCES_DIR) + # install the example's resources as well + set(EXAMPLE_RESOURCES "${CMAKE_SOURCE_DIR}/examples/${target}/resources") + if(EXISTS ${EXAMPLE_RESOURCES}) + install(DIRECTORY ${EXAMPLE_RESOURCES} + DESTINATION ${INSTALL_MISC_DIR}/examples/${target} + COMPONENT examples) + endif() endif() endmacro() diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt index 5f67a1d40..22b9f94a5 100644 --- a/examples/cocoa/CMakeLists.txt +++ b/examples/cocoa/CMakeLists.txt @@ -1,6 +1,34 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/cocoa) +# Usage: compile_xib(INPUT path/to/file.xib OUTPUT path/to/file.nib) +function(compile_xib) + cmake_parse_arguments(THIS "" "INPUT;OUTPUT" "" ${ARGN}) + if (NOT THIS_INPUT) + message(FATAL_ERROR "Missing required argument INPUT in call to compile_xib()") + endif() + + if (NOT THIS_OUTPUT) + message(FATAL_ERROR "Missing required argument OUTPUT in call to compile_xib()") + endif() + + if (NOT DEFINED IBTOOL) + find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") + endif() + if(NOT IBTOOL) + message(FATAL_ERROR "ibtool is required to compile .xib files but wasn't found.") + endif() + + # Default args taken from Xcode 9 when it generates a nib from a xib + set(DEFAULT_ARGS --errors --warnings --notices --module cocoa --auto-activate-custom-fonts --target-device mac --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET} --output-format human-readable-text) + + add_custom_command(OUTPUT "${THIS_OUTPUT}" + COMMAND "${IBTOOL}" ${DEFAULT_ARGS} "${THIS_INPUT}" --compile "${THIS_OUTPUT}" + DEPENDS "${THIS_INPUT}" + COMMENT "Generating ${THIS_OUTPUT}" + VERBATIM) +endfunction() + # all source files set(SRC ${SRCROOT}/CocoaAppDelegate.h ${SRCROOT}/CocoaAppDelegate.mm @@ -8,8 +36,7 @@ set(SRC ${SRCROOT}/CocoaAppDelegate.h ${SRCROOT}/NSString+stdstring.mm ${SRCROOT}/main.m) -# all XIB files -set(XIBS MainMenu) +compile_xib(INPUT "${SRCROOT}/MainMenu.xib" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MainMenu.nib") # all resource files set(RESOURCES ${SRCROOT}/resources/logo.png @@ -18,50 +45,17 @@ set(RESOURCES ${SRCROOT}/resources/logo.png ${SRCROOT}/resources/blue.png ${SRCROOT}/resources/green.png ${SRCROOT}/resources/red.png - ${SRCROOT}/resources/Credits.rtf) - -# define the cocoa target and customize it -add_executable(cocoa MACOSX_BUNDLE ${SRC} ${RESOURCES}) + ${SRCROOT}/resources/Credits.rtf + ${CMAKE_CURRENT_BINARY_DIR}/MainMenu.nib) set_source_files_properties(${RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + +# define the cocoa target and customize it +sfml_add_example(cocoa + SOURCES ${SRC} + BUNDLE_RESOURCES ${RESOURCES} + DEPENDS sfml-system sfml-window sfml-graphics) set_target_properties(cocoa PROPERTIES + MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${SRCROOT}/resources/Cocoa-Info.plist) -target_link_libraries(cocoa "-framework Cocoa -framework Foundation" - sfml-system sfml-window sfml-graphics) - -# set the target's folder (for IDEs that support it, e.g. Visual Studio) -set_target_properties(cocoa PROPERTIES FOLDER "Examples") - -# compile XIB files -find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") -if(${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") - message(FATAL_ERROR "ibtool is required to compile .xib files but wasn't found.") -endif() -set(RESOURCE_PATH "cocoa.app/Contents/Resources") -set(XIB_OUTPUT_PATH "${RESOURCE_PATH}/") -set(XIB_INPUT_PATH "${SRCROOT}/") -foreach(XIB ${XIBS}) - add_custom_command(TARGET cocoa - POST_BUILD - COMMAND ${IBTOOL} --errors - --output-format human-readable-text - --compile ${XIB_OUTPUT_PATH}/${XIB}.nib - ${XIB_INPUT_PATH}/${XIB}.xib - COMMENT "Compiling ${XIB}.xib") - # deactivated options: --warnings --notices -endforeach() - -# add install rule -install(TARGETS cocoa - BUNDLE DESTINATION ${INSTALL_MISC_DIR}/examples/cocoa - COMPONENT examples) - -# -# define the cocoa target -# sfml_add_example is not compatible with application bundles ! -# -#sfml_add_example(cocoa -# SOURCES ${SRC} -# DEPENDS sfml-system sfml-window sfml-graphics) -# - +target_link_libraries(cocoa "-framework Cocoa -framework Foundation") diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 3bac2b907..33ee64dd3 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -12,4 +12,5 @@ set(ADDITIONAL_LIBRARIES ${OPENGL_LIBRARIES}) # define the opengl target sfml_add_example(opengl GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES}) + DEPENDS sfml-graphics sfml-window sfml-system ${ADDITIONAL_LIBRARIES} + INSTALL_RESOURCES_DIR) diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt index 8b1c4bcb0..4bec54744 100644 --- a/examples/pong/CMakeLists.txt +++ b/examples/pong/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Pong.cpp) # define the pong target sfml_add_example(pong GUI_APP SOURCES ${SRC} - DEPENDS sfml-audio sfml-graphics sfml-window sfml-system) + DEPENDS sfml-audio sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt index eb908b253..0b85f4a52 100644 --- a/examples/shader/CMakeLists.txt +++ b/examples/shader/CMakeLists.txt @@ -9,4 +9,5 @@ set(SRC # define the shader target sfml_add_example(shader GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system) + DEPENDS sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt index 01085771f..b266356ad 100644 --- a/examples/sound/CMakeLists.txt +++ b/examples/sound/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Sound.cpp) # define the sound target sfml_add_example(sound SOURCES ${SRC} - DEPENDS sfml-audio sfml-system) + DEPENDS sfml-audio sfml-system + INSTALL_RESOURCES_DIR) diff --git a/examples/win32/CMakeLists.txt b/examples/win32/CMakeLists.txt index c0bea6e29..3155b28aa 100644 --- a/examples/win32/CMakeLists.txt +++ b/examples/win32/CMakeLists.txt @@ -7,4 +7,5 @@ set(SRC ${SRCROOT}/Win32.cpp) # define the win32 target sfml_add_example(win32 GUI_APP SOURCES ${SRC} - DEPENDS sfml-graphics sfml-window sfml-system) + DEPENDS sfml-graphics sfml-window sfml-system + INSTALL_RESOURCES_DIR)