Warning, /sdk/clazy/CMakeLists.txt is written in an unsupported language. File is not indexed.
0001 # This is the top-level CMakeLists.txt file for the Clazy project. 0002 # 0003 # To build the man page from POD, run 'make man' after CMake (assumes perl is available) 0004 # To install the resulting man page, run 'make install' 0005 # The man page is not available on Windows. 0006 # 0007 0008 cmake_minimum_required(VERSION 3.7) 0009 0010 project(clazy) 0011 0012 if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") 0013 cmake_policy(SET CMP0074 NEW) 0014 endif() 0015 0016 include(FeatureSummary) 0017 include(GenerateExportHeader) 0018 include(GNUInstallDirs) 0019 0020 # Version setup 0021 set(CLAZY_VERSION_MAJOR "1") 0022 set(CLAZY_VERSION_MINOR "12") 0023 set(CLAZY_VERSION_PATCH "0") 0024 set(CLAZY_VERSION "${CLAZY_VERSION_MAJOR}.${CLAZY_VERSION_MINOR}.${CLAZY_VERSION_PATCH}") 0025 set(CLAZY_PRINT_VERSION "${CLAZY_VERSION_MAJOR}.${CLAZY_VERSION_MINOR}") 0026 0027 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/cmake) 0028 if (NOT CLAZY_BUILD_WITH_CLANG) 0029 find_package(Clang 8.0 MODULE REQUIRED) 0030 0031 if (CLANG_CLANG-CPP_LIB AND NOT APPLE) 0032 set(default_use_clang_cpp ON) 0033 else() 0034 set(default_use_clang_cpp OFF) 0035 endif() 0036 option(CLAZY_LINK_CLANG_DYLIB "Link clazy to dynamic Clang C++ library clang-cpp." ${default_use_clang_cpp}) 0037 endif() 0038 0039 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 0040 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 0041 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 0042 0043 add_definitions(-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS) 0044 add_definitions(-D_GNU_SOURCE -DHAVE_CLANG_CONFIG_H) 0045 0046 option(CLAZY_AST_MATCHERS_CRASH_WORKAROUND "Disable AST Matchers if being built with clang. See bug #392223" ON) 0047 option(LINK_CLAZY_TO_LLVM "Links the clazy plugin to LLVM. Switch to OFF if your clang binary has all symbols already. Might need to be OFF if your LLVM is static." ON) 0048 option(APPIMAGE_HACK "Links the clazy plugin to the clang tooling libs only. For some reason this is needed when building on our old CentOS 6.8 to create the AppImage." OFF) 0049 option(CLAZY_MAN_PAGE "Builds the man page." ON) 0050 option(CLAZY_ENABLE_SANITIZERS "Builds clazy with ASAN/UBSAN. For clazy's own development only." OFF) 0051 0052 if (CLAZY_ENABLE_SANITIZERS) 0053 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") 0054 if (NOT MSVC) 0055 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") 0056 endif() 0057 endif() 0058 0059 if (CLAZY_AST_MATCHERS_CRASH_WORKAROUND AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.0 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) 0060 message("Enabling AST Matchers workaround. Consider updating clang or building with gcc instead. See bug #392223.") 0061 add_definitions(-DCLAZY_DISABLE_AST_MATCHERS) 0062 endif() 0063 0064 if(NOT CLAZY_BUILD_WITH_CLANG AND MSVC AND NOT CLANG_LIBRARY_IMPORT) 0065 message(FATAL_ERROR "\nOn MSVC you need to pass -DCLANG_LIBRARY_IMPORT=C:/path/to/llvm-build/lib/clang.lib to cmake when building Clazy.\nAlso make sure you've built LLVM with -DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS=ON") 0066 endif() 0067 0068 if(MSVC) 0069 # disable trigger-happy warnings from Clang/LLVM headers 0070 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4244 /wd4291 /wd4800 /wd4141 /wd4146 /wd4251") 0071 elseif(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") 0072 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual -Wcast-qual -fno-strict-aliasing -pedantic -Wno-long-long -Wall -W -Wno-unused-parameter -Wwrite-strings -fno-exceptions -fno-rtti") 0073 endif() 0074 0075 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 0076 if(WIN32) 0077 add_definitions(-D_CRT_SECURE_NO_WARNINGS) 0078 else() 0079 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") 0080 endif() 0081 0082 # Look for std::regex support 0083 message("Looking for std::regex support...") 0084 try_run(REGEX_RUN_RESULT COMPILE_RESULT ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/.cmake_has_regex_test.cpp CXX_STANDARD 17 CXX_STANDARD_REQUIRED true) 0085 0086 if(NOT REGEX_RUN_RESULT EQUAL 0) 0087 message("Using boost::regex instead of std::regex") 0088 set(CLAZY_USES_BOOST_REGEX TRUE) 0089 add_definitions(-DCLAZY_USES_BOOST_REGEX) 0090 find_package(Boost REQUIRED COMPONENTS regex) 0091 include_directories(${Boost_INCLUDE_DIRS}) 0092 endif() 0093 0094 set(CMAKE_CXX_STANDARD 17) 0095 set(CXX_STANDARD_REQUIRED ON) 0096 0097 # Compiler might support c++17 but not have std::filesystem in the standard library 0098 message("Looking for std::filesystem support...") 0099 try_run(FILESYSTEM_RUN_RESULT COMPILE_RESULT ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/.cmake_has_filesystem_test.cpp OUTPUT_VARIABLE foo CXX_STANDARD 17 CXX_STANDARD_REQUIRED true) 0100 0101 if (FILESYSTEM_RUN_RESULT EQUAL 0 AND COMPILE_RESULT) 0102 add_definitions(-DHAS_STD_FILESYSTEM) 0103 endif() 0104 0105 include(ClazySources.cmake) 0106 0107 include_directories(${CMAKE_BINARY_DIR}) 0108 include_directories(${CLANG_INCLUDE_DIRS} ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/src) 0109 link_directories("${LLVM_INSTALL_PREFIX}/lib" ${LLVM_LIBRARY_DIRS}) 0110 0111 if (${LLVM_VERSION} VERSION_GREATER_EQUAL "9.0.0") 0112 set(clang_tooling_refactoring_lib clangToolingRefactoring) 0113 else() 0114 set(clang_tooling_refactoring_lib clangToolingRefactor) 0115 endif() 0116 0117 if (${LLVM_VERSION} VERSION_GREATER_EQUAL "15.0.0") 0118 set(clang_support_lib clangSupport) 0119 endif() 0120 0121 macro(link_to_llvm name is_standalone) 0122 if (CLAZY_LINK_CLANG_DYLIB) 0123 target_link_libraries(${name} clang-cpp) 0124 else() 0125 foreach(clang_lib ${CLANG_LIBS}) 0126 if(MSVC) 0127 get_filename_component(LIB_FILENAME ${clang_lib} NAME) 0128 if(LIB_FILENAME STREQUAL "clangFrontend.lib") 0129 # On MSVC we don't link against clangFrontend.lib, instead we link against clang.exe (via clang.lib) 0130 # Otherwise the clazy plugin would have it's own plugin registry and clang wouldn't see it. 0131 # This way clazy registers with clang. 0132 continue() 0133 endif() 0134 endif() 0135 0136 target_link_libraries(${name} ${clang_lib}) 0137 endforeach() 0138 target_link_libraries(${name} ${clang_support_lib}) 0139 target_link_libraries(${name} clangTooling) 0140 target_link_libraries(${name} clangToolingCore) 0141 target_link_libraries(${name} ${clang_tooling_refactoring_lib}) 0142 endif() 0143 0144 foreach(llvm_lib ${LLVM_LIBS}) 0145 if(NOT ${is_standalone} AND NOT APPLE AND NOT MINGW AND NOT MSVC) 0146 ## Don't link against LLVMSupport, causes: CommandLine Error: Option 'view-background' registered more than once! 0147 if (NOT llvm_lib MATCHES ".*LLVMSupport.*") 0148 target_link_libraries(${name} ${llvm_lib}) 0149 endif() 0150 else() 0151 target_link_libraries(${name} ${llvm_lib}) 0152 endif() 0153 endforeach() 0154 0155 foreach(user_lib ${USER_LIBS}) 0156 target_link_libraries(${name} ${user_lib}) 0157 endforeach() 0158 0159 foreach(llvm_system_lib ${LLVM_SYSTEM_LIBS}) 0160 target_link_libraries(${name} ${llvm_system_lib}) 0161 endforeach() 0162 0163 if(WIN32) 0164 target_link_libraries(${name} version.lib) 0165 endif() 0166 if (CLAZY_USES_BOOST_REGEX) 0167 target_link_libraries(${name} ${Boost_LIBRARIES}) 0168 endif() 0169 endmacro() 0170 0171 macro(add_clang_plugin name) 0172 set(srcs ${ARGN}) 0173 0174 add_library(${name} SHARED ${srcs}) 0175 0176 if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0") 0177 # 30% speedup 0178 target_precompile_headers(${name} PRIVATE src/checkbase.h) 0179 endif() 0180 0181 if(SYMBOL_FILE) 0182 set_target_properties(${name} PROPERTIES LINK_FlAGS "-exported_symbols_list ${SYMBOL_FILE}") 0183 endif() 0184 0185 if (LINK_CLAZY_TO_LLVM) 0186 link_to_llvm(${name} FALSE) 0187 else() 0188 if (APPIMAGE_HACK) 0189 # Hack to build on old CentOS 6.8 0190 target_link_libraries(${name} clangTooling) 0191 target_link_libraries(${name} clangToolingCore) 0192 target_link_libraries(${name} ${clang_tooling_refactoring_lib}) 0193 endif() 0194 endif() 0195 0196 if(MSVC) 0197 target_link_libraries(${name} ${CLANG_LIBRARY_IMPORT}) # Link against clang.exe to share the plugin registry 0198 endif() 0199 0200 endmacro() 0201 0202 set(SYMBOL_FILE Lazy.exports) 0203 0204 if (NOT CLAZY_BUILD_WITH_CLANG) 0205 set(CLAZY_MINI_AST_DUMPER_SRCS src/MiniAstDumper.cpp) 0206 add_clang_plugin(ClazyPlugin ${CLAZY_PLUGIN_SRCS} ${CLAZY_MINI_AST_DUMPER_SRCS}) 0207 set_target_properties(ClazyPlugin PROPERTIES 0208 LINKER_LANGUAGE CXX 0209 PREFIX "" 0210 ) 0211 0212 install(TARGETS ClazyPlugin 0213 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 0214 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 0215 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 0216 ) 0217 0218 if(NOT WIN32) 0219 if(APPLE) 0220 find_program(READLINK_CMD greadlink) 0221 else() 0222 find_program(READLINK_CMD readlink) 0223 endif() 0224 if(NOT READLINK_CMD) 0225 message(FATAL_ERROR "Could not find a proper readlink. On Mac OSX you should install coreutils using homebrew in order to use the GNU readlink") 0226 endif() 0227 file(RELATIVE_PATH BIN_RELATIVE_LIBDIR "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}") 0228 file(RELATIVE_PATH BIN_RELATIVE_SHAREDIR "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_DATAROOTDIR}") 0229 configure_file(${CMAKE_CURRENT_LIST_DIR}/clazy.cmake ${CMAKE_BINARY_DIR}/clazy @ONLY) 0230 install(PROGRAMS ${CMAKE_BINARY_DIR}/clazy DESTINATION bin) 0231 else() 0232 install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/clazy.bat DESTINATION ${CMAKE_INSTALL_BINDIR}) 0233 if(MSVC) 0234 install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/clazy-cl.bat DESTINATION ${CMAKE_INSTALL_BINDIR}) 0235 endif() 0236 endif() 0237 0238 # Install the explanation README's 0239 include(${CMAKE_CURRENT_LIST_DIR}/readmes.cmake) 0240 0241 install(FILES ${README_LEVEL0_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level0) 0242 install(FILES ${README_LEVEL1_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level1) 0243 install(FILES ${README_LEVEL2_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level2) 0244 install(FILES ${README_manuallevel_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/manuallevel) 0245 0246 # Install more doc files 0247 install(FILES README.md COPYING-LGPL2.txt checks.json DESTINATION ${CMAKE_INSTALL_DOCDIR}) 0248 0249 # Build docs 0250 if (CLAZY_MAN_PAGE) 0251 add_subdirectory(docs) 0252 endif() 0253 0254 # rpath 0255 set(CMAKE_SKIP_BUILD_RPATH FALSE) 0256 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 0257 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 0258 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 0259 list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) 0260 if("${isSystemDir}" STREQUAL "-1") 0261 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 0262 endif("${isSystemDir}" STREQUAL "-1") 0263 0264 # Build clazy-standalone 0265 add_executable(clazy-standalone ${CLAZY_STANDALONE_SRCS}) 0266 0267 if(MSVC) 0268 # On MSVC clang-standalone crashes with a meaningless backtrace if linked to ClazyPlugin.dll 0269 target_link_libraries(clazy-standalone clangFrontend) 0270 else() 0271 target_link_libraries(clazy-standalone ClazyPlugin) 0272 endif() 0273 0274 link_to_llvm(clazy-standalone TRUE) 0275 0276 install(TARGETS clazy-standalone DESTINATION bin PERMISSIONS OWNER_WRITE OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE) 0277 0278 set(CPACK_PACKAGE_VERSION_MAJOR ${CLAZY_VERSION_MAJOR}) 0279 set(CPACK_PACKAGE_VERSION_MINOR ${CLAZY_VERSION_MINOR}) 0280 set(CPACK_PACKAGE_VERSION_PATCH ${CLAZY_VERSION_PATCH}) 0281 include(CPack) 0282 else() 0283 set(LLVM_LINK_COMPONENTS 0284 Support 0285 ) 0286 add_clang_library(clazyPlugin 0287 ${CLAZY_PLUGIN_SRCS} 0288 0289 LINK_LIBS 0290 clangToolingCore 0291 clangToolingInclusions 0292 ${clang_tooling_refactoring_lib} 0293 clangFrontend 0294 clangDriver 0295 clangCodeGen 0296 clangSema 0297 clangAnalysis 0298 clangRewriteFrontend 0299 clangRewrite 0300 clangAST 0301 clangASTMatchers 0302 clangParse 0303 clangLex 0304 clangBasic 0305 clangARCMigrate 0306 clangEdit 0307 clangFrontendTool 0308 clangRewrite 0309 clangSerialization 0310 ${clang_support_lib} 0311 clangTooling 0312 clangStaticAnalyzerCheckers 0313 clangStaticAnalyzerCore 0314 clangStaticAnalyzerFrontend 0315 ) 0316 add_executable(clazy-standalone ${CLAZY_STANDALONE_SRCS}) 0317 0318 target_link_libraries(clazy-standalone clazyPlugin) 0319 0320 install(TARGETS clazy-standalone DESTINATION bin PERMISSIONS OWNER_WRITE OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE) 0321 endif() 0322 0323 function(to_raw_string_literal input_string output_string) 0324 if (MSVC) 0325 # Work around "C2026: string too big, trailing characters truncated" 0326 # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2026?view=vs-2019 0327 # The limit is 16380 single-byte characters, so split up the string as 0328 # suggested on the site. 0329 set(str ${input_string}) 0330 set(chunk_size 1000) 0331 set(result "\n") 0332 string(LENGTH ${str} str_size) 0333 while (${str_size} GREATER ${chunk_size}) 0334 string(SUBSTRING ${str} 0 ${chunk_size} chunk) 0335 string(SUBSTRING ${str} ${chunk_size} -1 str) 0336 set(chunk "R\"meta(${chunk})meta\"\n") 0337 string(APPEND result ${chunk}) 0338 string(LENGTH ${str} str_size) 0339 endwhile() 0340 if (str_size GREATER 0) 0341 string(APPEND result "R\"meta(${str})meta\"\n") 0342 endif() 0343 set(${output_string} ${result} PARENT_SCOPE) 0344 else() 0345 set(result "\nR\"meta(${input_string})meta\"\n") 0346 set(${output_string} ${result} PARENT_SCOPE) 0347 endif() 0348 endfunction() 0349 0350 file(READ checks.json SUPPORTED_CHECKS_JSON_STR) 0351 to_raw_string_literal(${SUPPORTED_CHECKS_JSON_STR} SUPPORTED_CHECKS_JSON_STR) 0352 configure_file(checks.json.h.in checks.json.h) 0353 0354 enable_testing() 0355 include(ClazyTests.cmake) 0356 0357 install(FILES org.kde.clazy.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo)