# ============================================================================== # # 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") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD"))) 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 14 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 14 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}") file(REMOVE_RECURSE "${test_bindir}") endfunction() _juce_create_atomic_target(juce_atomic_wrapper)