From 8215380336b98f69d805dc366b46226a881b267e Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 15 Jan 2021 19:25:55 +0000 Subject: [PATCH] cmake: support ccache with Xcode generator --- CMakeLists.txt | 2 +- cmake/OpenCVCompilerOptions.cmake | 18 +++++++++++++++-- cmake/templates/xcode-launch-c.in | 11 ++++++++++ cmake/templates/xcode-launch-cxx.in | 11 ++++++++++ .../Toolchains/common-ios-toolchain.cmake | 20 ++++++++++++++----- 5 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 cmake/templates/xcode-launch-c.in create mode 100644 cmake/templates/xcode-launch-cxx.in diff --git a/CMakeLists.txt b/CMakeLists.txt index fcb4a1d88f..d66b22426c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,7 +477,7 @@ OCV_OPTION(INSTALL_TESTS "Install accuracy and performance test binar # OpenCV build options # =================================================== -OCV_OPTION(ENABLE_CCACHE "Use ccache" (UNIX AND NOT IOS AND (CMAKE_GENERATOR MATCHES "Makefile" OR CMAKE_GENERATOR MATCHES "Ninja")) ) +OCV_OPTION(ENABLE_CCACHE "Use ccache" (UNIX AND (CMAKE_GENERATOR MATCHES "Makefile" OR CMAKE_GENERATOR MATCHES "Ninja" OR CMAKE_GENERATOR MATCHES "Xcode")) ) OCV_OPTION(ENABLE_PRECOMPILED_HEADERS "Use precompiled headers" MSVC IF (MSVC OR (NOT IOS AND NOT CMAKE_CROSSCOMPILING) ) ) OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" (MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) ) OCV_OPTION(ENABLE_PROFILING "Enable profiling in the GCC compiler (Add flags: -g -pg)" OFF IF CV_GCC ) diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 8a3dcdbb63..3cb10a1878 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -8,13 +8,27 @@ function(access_CMAKE_COMPILER_IS_CCACHE) endif() endfunction() variable_watch(CMAKE_COMPILER_IS_CCACHE access_CMAKE_COMPILER_IS_CCACHE) -if(ENABLE_CCACHE AND NOT OPENCV_COMPILER_IS_CCACHE AND NOT CMAKE_GENERATOR MATCHES "Xcode") +if(ENABLE_CCACHE AND NOT OPENCV_COMPILER_IS_CCACHE) # This works fine with Unix Makefiles and Ninja generators find_host_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) message(STATUS "Looking for ccache - found (${CCACHE_PROGRAM})") get_property(__OLD_RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE) - if(__OLD_RULE_LAUNCH_COMPILE) + if(CMAKE_GENERATOR MATCHES "Xcode") + configure_file("${CMAKE_CURRENT_LIST_DIR}/templates/xcode-launch-c.in" "${CMAKE_BINARY_DIR}/xcode-launch-c") + configure_file("${CMAKE_CURRENT_LIST_DIR}/templates/xcode-launch-cxx.in" "${CMAKE_BINARY_DIR}/xcode-launch-cxx") + execute_process(COMMAND chmod a+rx + "${CMAKE_BINARY_DIR}/xcode-launch-c" + "${CMAKE_BINARY_DIR}/xcode-launch-cxx" + ) + # Xcode project attributes + set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/xcode-launch-c") + set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/xcode-launch-cxx") + set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_BINARY_DIR}/xcode-launch-c") + set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/xcode-launch-cxx") + set(OPENCV_COMPILER_IS_CCACHE 1) + message(STATUS "ccache: enable support through Xcode project properties") + elseif(__OLD_RULE_LAUNCH_COMPILE) message(STATUS "Can't replace CMake compiler launcher") else() set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") diff --git a/cmake/templates/xcode-launch-c.in b/cmake/templates/xcode-launch-c.in new file mode 100644 index 0000000000..609dbf47b1 --- /dev/null +++ b/cmake/templates/xcode-launch-c.in @@ -0,0 +1,11 @@ +#!/bin/sh +# https://crascit.com/2016/04/09/using-ccache-with-cmake/ + +# Xcode generator doesn't include the compiler as the +# first argument, Ninja and Makefiles do. Handle both cases. +if [[ "$1" = "${CMAKE_C_COMPILER}" ]] ; then + shift +fi + +export CCACHE_CPP2=true +exec "${CCACHE_PROGRAM}" "${CMAKE_C_COMPILER}" "$@" diff --git a/cmake/templates/xcode-launch-cxx.in b/cmake/templates/xcode-launch-cxx.in new file mode 100644 index 0000000000..09233b3859 --- /dev/null +++ b/cmake/templates/xcode-launch-cxx.in @@ -0,0 +1,11 @@ +#!/bin/sh +# https://crascit.com/2016/04/09/using-ccache-with-cmake/ + +# Xcode generator doesn't include the compiler as the +# first argument, Ninja and Makefiles do. Handle both cases. +if [[ "$1" = "${CMAKE_CXX_COMPILER}" ]] ; then + shift +fi + +export CCACHE_CPP2=true +exec "${CCACHE_PROGRAM}" "${CMAKE_CXX_COMPILER}" "$@" diff --git a/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake b/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake index 13aea357f1..735c75f1f3 100644 --- a/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake +++ b/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake @@ -160,10 +160,20 @@ set(CMAKE_CXX_COMPILER_ABI ELF) set(CMAKE_CXX_COMPILER_WORKS TRUE) set(CMAKE_C_COMPILER_WORKS TRUE) -# Search for programs in the build host directories -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) -# for libraries and headers in the target directories -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +endif() toolchain_save_config(IOS_ARCH IPHONEOS_DEPLOYMENT_TARGET)