From a3bfa6f566da184ddceba6583f357125a2f21b9a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 8 Nov 2016 18:00:03 +0300 Subject: [PATCH] cmake: ccache --- CMakeLists.txt | 2 ++ cmake/OpenCVCompilerOptions.cmake | 34 +++++++++++++++++++++++++++++ cmake/OpenCVDetectCXXCompiler.cmake | 4 ---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 007b80d4da..91a6462012 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,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_DYNAMIC_CUDA "Enabled dynamic CUDA linkage" ON IF ANDROID ) OCV_OPTION(ENABLE_PRECOMPILED_HEADERS "Use precompiled headers" ON IF (NOT IOS) ) OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" (MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) IF (CMAKE_VERSION VERSION_GREATER "2.8.0") ) @@ -731,6 +732,7 @@ else() status(" Linker flags (Release):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}) status(" Linker flags (Debug):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}) endif() +status(" ccache:" CMAKE_COMPILER_IS_CCACHE THEN YES ELSE NO) status(" Precompiled headers:" PCHSupport_FOUND AND ENABLE_PRECOMPILED_HEADERS THEN YES ELSE NO) # ========================== OpenCV modules ========================== diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 499061e28c..57d142eb0b 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -1,3 +1,33 @@ +if(ENABLE_CCACHE AND NOT CMAKE_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) + message(STATUS "Can't replace CMake compiler launcher") + else() + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + # NOTE: Actually this check doesn't work as expected. + # "RULE_LAUNCH_COMPILE" is ignored by CMake during try_compile() step. + # ocv_check_compiler_flag(CXX "" IS_CCACHE_WORKS) + set(IS_CCACHE_WORKS 1) + if(IS_CCACHE_WORKS) + set(CMAKE_COMPILER_IS_CCACHE 1) + else() + message(STATUS "Unable to compile program with enabled ccache, reverting...") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${__OLD_RULE_LAUNCH_COMPILE}") + endif() + else() + message(STATUS "Looking for ccache - not found") + endif() + endif() +endif() + +if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_CCACHE) AND NOT CMAKE_GENERATOR MATCHES "Xcode") + set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) +endif() + if(MINGW OR (X86 AND UNIX AND NOT APPLE)) # mingw compiler is known to produce unstable SSE code with -O3 hence we are trying to use -O2 instead if(CMAKE_COMPILER_IS_GNUCXX) @@ -111,6 +141,10 @@ if(CMAKE_COMPILER_IS_GNUCXX) add_extra_compiler_option(-pthread) endif() + if(CMAKE_COMPILER_IS_CLANGCXX) + add_extra_compiler_option(-Qunused-arguments) + endif() + if(OPENCV_WARNINGS_ARE_ERRORS) add_extra_compiler_option(-Werror) endif() diff --git a/cmake/OpenCVDetectCXXCompiler.cmake b/cmake/OpenCVDetectCXXCompiler.cmake index aa7a8b6a6f..b53f8d7363 100644 --- a/cmake/OpenCVDetectCXXCompiler.cmake +++ b/cmake/OpenCVDetectCXXCompiler.cmake @@ -14,10 +14,6 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang") set(CMAKE_COMPILER_IS_CLANGCC 1) endif() -if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC) AND NOT CMAKE_GENERATOR MATCHES "Xcode") - set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) -endif() - # ---------------------------------------------------------------------------- # Detect Intel ICC compiler -- for -fPIC in 3rdparty ( UNIX ONLY ): # see include/opencv/cxtypes.h file for related ICC & CV_ICC defines.