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 11.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 set(CMAKE_CXX_STANDARD 17) 0083 set(CXX_STANDARD_REQUIRED ON) 0084 0085 # Look for std::regex support 0086 if(NOT DEFINED REGEX_RUN_RESULT) 0087 message("Looking for std::regex support...") 0088 try_compile(REGEX_RUN_RESULT SOURCES ${CMAKE_CURRENT_LIST_DIR}/.cmake_has_regex_test.cpp) 0089 endif() 0090 0091 if(NOT DEFINED REGEX_RUN_RESULT) 0092 message(FATAL_ERROR "std::regex support is mndatory") 0093 endif() 0094 0095 # Compiler might support c++17 but not have std::filesystem in the standard library 0096 if (NOT FILESYSTEM_RUN_RESULT) 0097 try_compile(FILESYSTEM_RUN_RESULT SOURCES ${CMAKE_CURRENT_LIST_DIR}/.cmake_has_filesystem_test.cpp OUTPUT_VARIABLE foo CXX_STANDARD 17 CXX_STANDARD_REQUIRED true) 0098 endif() 0099 0100 if (NOT FILESYSTEM_RUN_RESULT) 0101 message(FATAL_ERROR "std::filesystem support is mndatory") 0102 endif() 0103 0104 include(ClazySources.cmake) 0105 0106 include_directories(${CMAKE_BINARY_DIR}) 0107 include_directories(${CLANG_INCLUDE_DIRS} ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/src) 0108 link_directories("${LLVM_INSTALL_PREFIX}/lib" ${LLVM_LIBRARY_DIRS}) 0109 0110 set(clang_tooling_refactoring_lib clangToolingRefactoring) 0111 0112 if (${LLVM_VERSION} VERSION_GREATER_EQUAL "15.0.0") 0113 set(clang_support_lib clangSupport) 0114 endif() 0115 0116 macro(link_to_llvm name is_standalone) 0117 if (CLAZY_LINK_CLANG_DYLIB) 0118 target_link_libraries(${name} clang-cpp) 0119 else() 0120 foreach(clang_lib ${CLANG_LIBS}) 0121 if(MSVC) 0122 get_filename_component(LIB_FILENAME ${clang_lib} NAME) 0123 if(LIB_FILENAME STREQUAL "clangFrontend.lib") 0124 # On MSVC we don't link against clangFrontend.lib, instead we link against clang.exe (via clang.lib) 0125 # Otherwise the clazy plugin would have it's own plugin registry and clang wouldn't see it. 0126 # This way clazy registers with clang. 0127 continue() 0128 endif() 0129 endif() 0130 0131 target_link_libraries(${name} ${clang_lib}) 0132 endforeach() 0133 target_link_libraries(${name} ${clang_support_lib}) 0134 target_link_libraries(${name} clangTooling) 0135 target_link_libraries(${name} clangToolingCore) 0136 target_link_libraries(${name} ${clang_tooling_refactoring_lib}) 0137 endif() 0138 0139 foreach(llvm_lib ${LLVM_LIBS}) 0140 if(NOT ${is_standalone} AND NOT APPLE AND NOT MINGW AND NOT MSVC) 0141 ## Don't link against LLVMSupport, causes: CommandLine Error: Option 'view-background' registered more than once! 0142 if (NOT llvm_lib MATCHES ".*LLVMSupport.*") 0143 target_link_libraries(${name} ${llvm_lib}) 0144 endif() 0145 else() 0146 target_link_libraries(${name} ${llvm_lib}) 0147 endif() 0148 endforeach() 0149 0150 foreach(user_lib ${USER_LIBS}) 0151 target_link_libraries(${name} ${user_lib}) 0152 endforeach() 0153 0154 foreach(llvm_system_lib ${LLVM_SYSTEM_LIBS}) 0155 target_link_libraries(${name} ${llvm_system_lib}) 0156 endforeach() 0157 0158 if(WIN32) 0159 target_link_libraries(${name} version.lib) 0160 endif() 0161 endmacro() 0162 0163 macro(add_clang_plugin name) 0164 set(srcs ${ARGN}) 0165 0166 add_library(${name} SHARED ${srcs}) 0167 0168 if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0") 0169 # 30% speedup 0170 target_precompile_headers(${name} PRIVATE src/checkbase.h) 0171 endif() 0172 0173 if(SYMBOL_FILE) 0174 set_target_properties(${name} PROPERTIES LINK_FlAGS "-exported_symbols_list ${SYMBOL_FILE}") 0175 endif() 0176 0177 if (LINK_CLAZY_TO_LLVM) 0178 link_to_llvm(${name} FALSE) 0179 else() 0180 if (APPIMAGE_HACK) 0181 # Hack to build on old CentOS 6.8 0182 target_link_libraries(${name} clangTooling) 0183 target_link_libraries(${name} clangToolingCore) 0184 target_link_libraries(${name} ${clang_tooling_refactoring_lib}) 0185 endif() 0186 endif() 0187 0188 if(MSVC) 0189 target_link_libraries(${name} ${CLANG_LIBRARY_IMPORT}) # Link against clang.exe to share the plugin registry 0190 endif() 0191 0192 endmacro() 0193 0194 set(SYMBOL_FILE Lazy.exports) 0195 0196 if (NOT CLAZY_BUILD_WITH_CLANG) 0197 set(CLAZY_MINI_AST_DUMPER_SRCS src/MiniAstDumper.cpp) 0198 add_clang_plugin(ClazyPlugin ${CLAZY_PLUGIN_SRCS} ${CLAZY_MINI_AST_DUMPER_SRCS}) 0199 set_target_properties(ClazyPlugin PROPERTIES 0200 LINKER_LANGUAGE CXX 0201 PREFIX "" 0202 ) 0203 0204 install(TARGETS ClazyPlugin 0205 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 0206 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 0207 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 0208 ) 0209 0210 if(NOT WIN32) 0211 if(APPLE) 0212 find_program(READLINK_CMD greadlink) 0213 else() 0214 find_program(READLINK_CMD readlink) 0215 endif() 0216 if(NOT READLINK_CMD) 0217 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") 0218 endif() 0219 file(RELATIVE_PATH BIN_RELATIVE_LIBDIR "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}") 0220 file(RELATIVE_PATH BIN_RELATIVE_SHAREDIR "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_DATAROOTDIR}") 0221 configure_file(${CMAKE_CURRENT_LIST_DIR}/clazy.cmake ${CMAKE_BINARY_DIR}/clazy @ONLY) 0222 install(PROGRAMS ${CMAKE_BINARY_DIR}/clazy DESTINATION bin) 0223 else() 0224 install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/clazy.bat DESTINATION ${CMAKE_INSTALL_BINDIR}) 0225 if(MSVC) 0226 install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/clazy-cl.bat DESTINATION ${CMAKE_INSTALL_BINDIR}) 0227 endif() 0228 endif() 0229 0230 # Install the explanation README's 0231 include(${CMAKE_CURRENT_LIST_DIR}/readmes.cmake) 0232 0233 install(FILES ${README_LEVEL0_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level0) 0234 install(FILES ${README_LEVEL1_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level1) 0235 install(FILES ${README_LEVEL2_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/level2) 0236 install(FILES ${README_manuallevel_FILES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/manuallevel) 0237 0238 # Install more doc files 0239 install(FILES README.md LICENSES/LGPL-2.0-or-later.txt checks.json DESTINATION ${CMAKE_INSTALL_DOCDIR}) 0240 0241 # Build docs 0242 if (CLAZY_MAN_PAGE) 0243 add_subdirectory(docs) 0244 endif() 0245 0246 # rpath 0247 set(CMAKE_SKIP_BUILD_RPATH FALSE) 0248 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 0249 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 0250 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 0251 list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) 0252 if("${isSystemDir}" STREQUAL "-1") 0253 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") 0254 endif("${isSystemDir}" STREQUAL "-1") 0255 0256 # Build clazy-standalone 0257 add_executable(clazy-standalone ${CLAZY_STANDALONE_SRCS}) 0258 0259 if(MSVC) 0260 # On MSVC clang-standalone crashes with a meaningless backtrace if linked to ClazyPlugin.dll 0261 target_link_libraries(clazy-standalone clangFrontend) 0262 else() 0263 target_link_libraries(clazy-standalone ClazyPlugin) 0264 endif() 0265 0266 link_to_llvm(clazy-standalone TRUE) 0267 0268 install(TARGETS clazy-standalone DESTINATION bin PERMISSIONS OWNER_WRITE OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE) 0269 0270 set(CPACK_PACKAGE_VERSION_MAJOR ${CLAZY_VERSION_MAJOR}) 0271 set(CPACK_PACKAGE_VERSION_MINOR ${CLAZY_VERSION_MINOR}) 0272 set(CPACK_PACKAGE_VERSION_PATCH ${CLAZY_VERSION_PATCH}) 0273 include(CPack) 0274 else() 0275 set(LLVM_LINK_COMPONENTS 0276 Support 0277 ) 0278 add_clang_library(clazyPlugin 0279 ${CLAZY_PLUGIN_SRCS} 0280 0281 LINK_LIBS 0282 clangToolingCore 0283 clangToolingInclusions 0284 ${clang_tooling_refactoring_lib} 0285 clangFrontend 0286 clangDriver 0287 clangCodeGen 0288 clangSema 0289 clangAnalysis 0290 clangRewriteFrontend 0291 clangRewrite 0292 clangAST 0293 clangASTMatchers 0294 clangParse 0295 clangLex 0296 clangBasic 0297 clangARCMigrate 0298 clangEdit 0299 clangFrontendTool 0300 clangRewrite 0301 clangSerialization 0302 ${clang_support_lib} 0303 clangTooling 0304 clangStaticAnalyzerCheckers 0305 clangStaticAnalyzerCore 0306 clangStaticAnalyzerFrontend 0307 ) 0308 add_executable(clazy-standalone ${CLAZY_STANDALONE_SRCS}) 0309 0310 target_link_libraries(clazy-standalone clazyPlugin) 0311 0312 install(TARGETS clazy-standalone DESTINATION bin PERMISSIONS OWNER_WRITE OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE) 0313 endif() 0314 0315 function(to_raw_string_literal input_string output_string) 0316 if (MSVC) 0317 # Work around "C2026: string too big, trailing characters truncated" 0318 # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2026?view=vs-2019 0319 # The limit is 16380 single-byte characters, so split up the string as 0320 # suggested on the site. 0321 set(str ${input_string}) 0322 set(chunk_size 1000) 0323 set(result "\n") 0324 string(LENGTH ${str} str_size) 0325 while (${str_size} GREATER ${chunk_size}) 0326 string(SUBSTRING ${str} 0 ${chunk_size} chunk) 0327 string(SUBSTRING ${str} ${chunk_size} -1 str) 0328 set(chunk "R\"meta(${chunk})meta\"\n") 0329 string(APPEND result ${chunk}) 0330 string(LENGTH ${str} str_size) 0331 endwhile() 0332 if (str_size GREATER 0) 0333 string(APPEND result "R\"meta(${str})meta\"\n") 0334 endif() 0335 set(${output_string} ${result} PARENT_SCOPE) 0336 else() 0337 set(result "\nR\"meta(${input_string})meta\"\n") 0338 set(${output_string} ${result} PARENT_SCOPE) 0339 endif() 0340 endfunction() 0341 0342 file(READ checks.json SUPPORTED_CHECKS_JSON_STR) 0343 to_raw_string_literal(${SUPPORTED_CHECKS_JSON_STR} SUPPORTED_CHECKS_JSON_STR) 0344 configure_file(checks.json.h.in checks.json.h) 0345 0346 enable_testing() 0347 include(ClazyTests.generated.cmake) 0348 0349 install(FILES org.kde.clazy.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo)