diff --git a/CMakeLists.txt b/CMakeLists.txt index dc5ac74681b..43508ae83f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,20 +29,30 @@ ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) SET(TARGET_COPY_FILES "" CACHE INTERNAL "" FORCE) SET(TARGET_COPY_DIRS "" CACHE INTERNAL "" FORCE) -### Define options and editable variables in the section below: -# This is only needed for single configuration generators so don't annoy others -if(NOT CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Default build configuration used." FORCE) - message(WARNING "CMAKE_BUILD_TYPE was not specified, defaulting to Release configuration.") -endif(NOT CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) +get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) # Override standard CMake configurations -set(CMAKE_CONFIGURATION_TYPES Debug Release FastDebug CACHE STRING "Available configurations" FORCE) +set(FSO_BUILD_TYPES Debug Release FastDebug) + +if(is_multi_config) + set(CMAKE_CONFIGURATION_TYPES "${FSO_BUILD_TYPES}" CACHE STRING "Configuration types" FORCE) +elseif(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Default build configuration used." FORCE) + message(WARNING "CMAKE_BUILD_TYPE was not specified, defaulting to Release configuration.") + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${FSO_BUILD_TYPES}") +endif() set(FSO_LANGUAGES C CXX) if(APPLE) set(FSO_LANGUAGES ${FSO_LANGUAGES} OBJC OBJCXX) + + # 10.15 for c++17 std::filesystem + # NOTE: this must be set *before* the project() call to work properly!! + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "macOS deployment target") + + # fix all targets in scheme (so it's not just qtfred) + set(CMAKE_XCODE_GENERATE_SCHEME TRUE) endif() PROJECT(FS2_Open LANGUAGES ${FSO_LANGUAGES}) @@ -196,11 +206,11 @@ include(clang-tidy) include(CheckIPOSupported) check_ipo_supported(RESULT LTO_AVAILABLE) -if (CMAKE_BUILD_TYPE STREQUAL "Release" AND FSO_USE_LTO AND LTO_AVAILABLE) +if (FSO_USE_LTO AND LTO_AVAILABLE) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) - message("Enabled LTO") - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) -endif (CMAKE_BUILD_TYPE STREQUAL "Release" AND FSO_USE_LTO AND LTO_AVAILABLE) + message("Enabled LTO for Release builds") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) +endif (FSO_USE_LTO AND LTO_AVAILABLE) # This includes source code for some tools, either used in the build or also for something else ADD_SUBDIRECTORY(tools) diff --git a/cmake/platform-darwin.cmake b/cmake/platform-darwin.cmake index d24d8616ce4..e886ddbb3ca 100644 --- a/cmake/platform-darwin.cmake +++ b/cmake/platform-darwin.cmake @@ -11,10 +11,6 @@ endif() target_link_libraries(platform INTERFACE ${COCOA_LIBRARY}) -# To support C++17 we need to target at least 10.13. maybe 10.14 for some rare features -# bump to 10.15 for c++17 std::filesystem usage in qtFRED -SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.15") - SET(CMAKE_SKIP_RPATH FALSE) SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) SET(CMAKE_INSTALL_RPATH @loader_path/../Frameworks/) diff --git a/cmake/util.cmake b/cmake/util.cmake index bfce4de182d..d6610d45904 100644 --- a/cmake/util.cmake +++ b/cmake/util.cmake @@ -241,6 +241,17 @@ function(suppress_file_warnings) endif() endfunction(suppress_file_warnings) +# Suppress no symbols warnings in static libraries (on Xcode) +function(suppress_no_symbol_warnings _target) + if(XCODE) + get_target_property(target_type ${_target} TYPE) + if(target_type STREQUAL "STATIC_LIBRARY") + set_property(TARGET ${_target} APPEND PROPERTY + STATIC_LIBRARY_OPTIONS "-no_warning_for_no_symbols" + ) + endif() + endif() +endfunction(suppress_no_symbol_warnings) function(list_target_dependencies _target _out_var) set(out_list) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 4cc52dcea77..5f349771840 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -130,5 +130,8 @@ set_target_properties(code PROPERTIES XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=D set_target_properties(code PROPERTIES XCODE_ATTRIBUTE_STRIP_INSTALLED_PRODUCT[variant=Debug] "NO") set_target_properties(code PROPERTIES XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN[variant=Debug] "NO") +# Prevent warnings on files with no symbols on Mac +suppress_no_symbol_warnings(code) + # Prevent GCC warnings in third-party BitOp... see GitHub #4366 suppress_file_warnings(scripting/lua/bitop/bit.c) diff --git a/freespace2/CMakeLists.txt b/freespace2/CMakeLists.txt index e7ad4eb99e4..ed83791eafb 100644 --- a/freespace2/CMakeLists.txt +++ b/freespace2/CMakeLists.txt @@ -102,3 +102,9 @@ set_target_properties(Freespace2 PROPERTIES XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGI set_target_properties(Freespace2 PROPERTIES XCODE_ATTRIBUTE_COPY_PHASE_STRIP[variant=Debug] "NO") set_target_properties(Freespace2 PROPERTIES XCODE_ATTRIBUTE_STRIP_INSTALLED_PRODUCT[variant=Debug] "NO") set_target_properties(Freespace2 PROPERTIES XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN[variant=Debug] "NO") + +set_target_properties(Freespace2 PROPERTIES XCODE_SCHEME_ARGUMENTS "${FSO_RUN_ARGUMENTS}") + +if(FSO_FREESPACE_PATH AND NOT "${FSO_FREESPACE_PATH}" STREQUAL "${CMAKE_INSTALL_PREFIX}") + set_target_properties(Freespace2 PROPERTIES XCODE_SCHEME_WORKING_DIRECTORY "${FSO_FREESPACE_PATH}") +endif() diff --git a/freespace2/resources.cmake b/freespace2/resources.cmake index ddf00309dc6..94cf4d604ae 100644 --- a/freespace2/resources.cmake +++ b/freespace2/resources.cmake @@ -55,9 +55,10 @@ elseif(PLATFORM_MAC) set_target_properties(Freespace2 PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${FSO_FULL_VERSION_STRING}") set_target_properties(Freespace2 PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING "${FSO_PRODUCT_VERSION_STRING}") set_target_properties(Freespace2 PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "FreeSpace Open") - set_target_properties(Freespace2 PROPERTIES MACOSX_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}") set_target_properties(Freespace2 PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "us.indiegames.scp.FreeSpaceOpen") - + + set_target_properties(Freespace2 PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "us.indiegames.scp.FreeSpaceOpen") + # Copy everything from the Resources directory add_custom_command(TARGET Freespace2 POST_BUILD COMMAND cp -a "${CMAKE_CURRENT_SOURCE_DIR}/${subpath}/Resources" "$/../Resources" diff --git a/freespace2/resources/mac/Info.plist.in b/freespace2/resources/mac/Info.plist.in index 44d3c501e96..f1f03017fa0 100644 --- a/freespace2/resources/mac/Info.plist.in +++ b/freespace2/resources/mac/Info.plist.in @@ -29,7 +29,7 @@ LSApplicationCategoryType public.app-category.games LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} + ${CMAKE_OSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass diff --git a/lib/antlr4-cpp-runtime/CMakeLists.txt b/lib/antlr4-cpp-runtime/CMakeLists.txt index 827764823d2..14946528c6e 100644 --- a/lib/antlr4-cpp-runtime/CMakeLists.txt +++ b/lib/antlr4-cpp-runtime/CMakeLists.txt @@ -7,15 +7,16 @@ set(CMAKE_MACOSX_RPATH OFF) set(ANTLR_BUILD_SHARED OFF) -# Detect build type, fallback to release and throw a warning if use didn't specify any -if(NOT CMAKE_BUILD_TYPE) +get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + +if(NOT CMAKE_BUILD_TYPE AND NOT is_multi_config) message(WARNING "Build type not set, falling back to Release mode. To specify build type use: -DCMAKE_BUILD_TYPE= where is Debug or Release.") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release." FORCE) -endif(NOT CMAKE_BUILD_TYPE) +endif(NOT CMAKE_BUILD_TYPE AND NOT is_multi_config) if(NOT WITH_DEMO) message(STATUS "Building without demo. To enable demo build use: -DWITH_DEMO=True") diff --git a/lib/antlr4.cmake b/lib/antlr4.cmake index 1967dac5fa0..6b8d18108c0 100644 --- a/lib/antlr4.cmake +++ b/lib/antlr4.cmake @@ -23,6 +23,9 @@ add_subdirectory(antlr4-cpp-runtime EXCLUDE_FROM_ALL) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/antlr4-cpp-runtime/cmake" PARENT_SCOPE) suppress_warnings(antlr4_static) +# Prevent warnings on files with no symbols on Mac +suppress_no_symbol_warnings(antlr4_static) + target_include_directories(antlr4_static PUBLIC "${CMAKE_CURRENT_LIST_DIR}/antlr4-cpp-runtime/runtime/src") set_target_properties(antlr4_static diff --git a/parsers/CMakeLists.txt b/parsers/CMakeLists.txt index a540a4b494d..70bfa43d16b 100644 --- a/parsers/CMakeLists.txt +++ b/parsers/CMakeLists.txt @@ -50,3 +50,6 @@ add_parser(action_expression/ActionExpression.g4) target_include_directories(parsers PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") suppress_warnings(parsers) + +# Prevent warnings on files with no symbols on Mac +suppress_no_symbol_warnings(parsers) diff --git a/qtfred/CMakeLists.txt b/qtfred/CMakeLists.txt index b8bc0bff4cc..84def10e97d 100644 --- a/qtfred/CMakeLists.txt +++ b/qtfred/CMakeLists.txt @@ -241,10 +241,16 @@ elseif(PLATFORM_MAC) set_target_properties(qtfred PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${FSO_FULL_VERSION_STRING}") set_target_properties(qtfred PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING "${FSO_PRODUCT_VERSION_STRING}") set_target_properties(qtfred PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "qtFRED") - set_target_properties(qtfred PROPERTIES MACOSX_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}") set_target_properties(qtfred PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "us.indiegames.scp.qtFRED") + + set_target_properties(qtfred PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "us.indiegames.scp.qtFRED") set_target_properties(qtfred PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Manual") set_target_properties(qtfred PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") + set_target_properties(qtfred PROPERTIES XCODE_SCHEME_ARGUMENTS "${FSO_RUN_ARGUMENTS}") + + if(FSO_FREESPACE_PATH AND NOT "${FSO_FREESPACE_PATH}" STREQUAL "${CMAKE_INSTALL_PREFIX}") + set_target_properties(qtfred PROPERTIES XCODE_SCHEME_WORKING_DIRECTORY "${FSO_FREESPACE_PATH}") + endif() # Copy everything from the Resources directory add_custom_command(TARGET qtfred POST_BUILD diff --git a/qtfred/resources/mac/Info.plist.in b/qtfred/resources/mac/Info.plist.in index 70e13757559..9dd183d7e5c 100644 --- a/qtfred/resources/mac/Info.plist.in +++ b/qtfred/resources/mac/Info.plist.in @@ -29,7 +29,7 @@ LSApplicationCategoryType public.app-category.games LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} + ${CMAKE_OSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass