diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d7b42cd58..d44e93ab08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,7 @@ configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" "${JUCE_BINARY_DIR}/JUCEConfig.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake" + "${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake" "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard" "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in" diff --git a/extras/Build/CMake/JUCECheckAtomic.cmake b/extras/Build/CMake/JUCECheckAtomic.cmake new file mode 100644 index 0000000000..2a0cfceb22 --- /dev/null +++ b/extras/Build/CMake/JUCECheckAtomic.cmake @@ -0,0 +1,82 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2020 - Raw Material Software Limited +# +# JUCE is an open source library subject to commercial or open-source +# licensing. +# +# By using JUCE, you agree to the terms of both the JUCE 6 End-User License +# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# +# End User License Agreement: www.juce.com/juce-6-licence +# Privacy Policy: www.juce.com/juce-privacy-policy +# +# Or: You may also use this code under the terms of the GPL v3 (see +# www.gnu.org/licenses). +# +# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER +# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE +# DISCLAIMED. +# +# ============================================================================== + +function(_juce_create_atomic_target target_name) + add_library("${target_name}" INTERFACE) + add_library("juce::${target_name}" ALIAS "${target_name}") + + if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux")) + return() + endif() + + set(test_file_contents + [[ + #include + + int main (int argc, char** argv) + { + std::atomic ll { static_cast (argc) }; + ll ^= 1; + return static_cast (ll); + } + ]]) + + string(RANDOM LENGTH 16 random_file_string) + set(test_file_name "${CMAKE_CURRENT_BINARY_DIR}/check_atomic_${random_file_string}.cpp") + + string(RANDOM LENGTH 16 random_dir_string) + set(test_bindir "${CMAKE_CURRENT_BINARY_DIR}/check_atomic_dir_${random_dir_string}") + + file(WRITE "${test_file_name}" "${test_file_contents}") + + try_compile(compile_result "${test_bindir}" "${test_file_name}" + OUTPUT_VARIABLE test_build_output_0 + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED TRUE + CXX_EXTENSIONS FALSE) + + if(NOT compile_result) + try_compile(compile_result "${test_bindir}" "${test_file_name}" + OUTPUT_VARIABLE test_build_output_1 + LINK_LIBRARIES atomic + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED TRUE + CXX_EXTENSIONS FALSE) + + if (NOT compile_result) + message(FATAL_ERROR + "First build output:\n" + "${test_build_output_0}" + "\n\nSecond build output:\n" + "${test_build_output_1}" + "\n\nJUCE requires support for std::atomic, but this system cannot " + "successfully compile a program which uses std::atomic. " + "You may need to install a dedicated libatomic package using your " + "system's package manager.") + endif() + + target_link_libraries("${target_name}" INTERFACE atomic) + endif() + + file(REMOVE "${test_file_name}") +endfunction() diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index 2f3d679334..c94d57139d 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -123,6 +123,9 @@ set(JUCE_CMAKE_UTILS_DIR ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "The path to the folder holding this file and other resources") include("${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake") +include("${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake") + +_juce_create_atomic_target(juce_atomic_wrapper) # Tries to discover the target platform architecture, which is necessary for # naming VST3 bundle folders correctly. @@ -518,6 +521,8 @@ function(juce_add_module module_path) if(${module_name} STREQUAL "juce_core") _juce_add_standard_defs(${module_name}) + target_link_libraries(juce_core INTERFACE juce::juce_atomic_wrapper) + if(CMAKE_SYSTEM_NAME STREQUAL "Android") target_sources(juce_core INTERFACE "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c") target_include_directories(juce_core INTERFACE "${ANDROID_NDK}/sources/android/cpufeatures")