diff --git a/clang/include/clang/Driver/CMakeLists.txt b/clang/include/clang/Driver/CMakeLists.txt --- a/clang/include/clang/Driver/CMakeLists.txt +++ b/clang/include/clang/Driver/CMakeLists.txt @@ -1,3 +1,3 @@ set(LLVM_TARGET_DEFINITIONS Options.td) -tablegen(LLVM Options.inc -gen-opt-parser-defs) +tablegen(LLVM Options.inc -gen-opt-parser-defs -dependency-guard=ClangDriverOptions) add_public_tablegen_target(ClangDriverOptions) diff --git a/clang/lib/ARCMigrate/CMakeLists.txt b/clang/lib/ARCMigrate/CMakeLists.txt --- a/clang/lib/ARCMigrate/CMakeLists.txt +++ b/clang/lib/ARCMigrate/CMakeLists.txt @@ -44,4 +44,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt b/clang/lib/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt --- a/clang/lib/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt +++ b/clang/lib/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt @@ -3,7 +3,16 @@ ) set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CheckerDependencyHandlingAnalyzerPlugin.exports) -add_llvm_library(CheckerDependencyHandlingAnalyzerPlugin MODULE BUILDTREE_ONLY CheckerDependencyHandling.cpp) +add_llvm_library( + CheckerDependencyHandlingAnalyzerPlugin + + MODULE + BUILDTREE_ONLY + + CheckerDependencyHandling.cpp + + DEPENDS + ClangDriverOptions) clang_target_link_libraries(CheckerDependencyHandlingAnalyzerPlugin PRIVATE clangAnalysis diff --git a/clang/lib/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt b/clang/lib/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt --- a/clang/lib/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt +++ b/clang/lib/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt @@ -3,7 +3,16 @@ ) set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CheckerOptionHandlingAnalyzerPlugin.exports) -add_llvm_library(CheckerOptionHandlingAnalyzerPlugin MODULE BUILDTREE_ONLY CheckerOptionHandling.cpp) +add_llvm_library( + CheckerOptionHandlingAnalyzerPlugin + + MODULE + BUILDTREE_ONLY + + CheckerOptionHandling.cpp + + DEPENDS + ClangDriverOptions) clang_target_link_libraries(CheckerOptionHandlingAnalyzerPlugin PRIVATE clangAnalysis diff --git a/clang/lib/Analysis/plugins/SampleAnalyzer/CMakeLists.txt b/clang/lib/Analysis/plugins/SampleAnalyzer/CMakeLists.txt --- a/clang/lib/Analysis/plugins/SampleAnalyzer/CMakeLists.txt +++ b/clang/lib/Analysis/plugins/SampleAnalyzer/CMakeLists.txt @@ -3,7 +3,16 @@ ) set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/SampleAnalyzerPlugin.exports) -add_llvm_library(SampleAnalyzerPlugin MODULE BUILDTREE_ONLY MainCallChecker.cpp) +add_llvm_library( + SampleAnalyzerPlugin + + MODULE + BUILDTREE_ONLY + + MainCallChecker.cpp + + DEPENDS + ClangDriverOptions) clang_target_link_libraries(SampleAnalyzerPlugin PRIVATE clangAnalysis diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -91,6 +91,7 @@ DEPENDS intrinsics_gen + ClangDriverOptions LINK_LIBS clangAST diff --git a/clang/lib/CrossTU/CMakeLists.txt b/clang/lib/CrossTU/CMakeLists.txt --- a/clang/lib/CrossTU/CMakeLists.txt +++ b/clang/lib/CrossTU/CMakeLists.txt @@ -11,4 +11,7 @@ clangBasic clangFrontend clangIndex + + DEPENDS + ClangDriverOptions ) diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -99,4 +99,4 @@ LINK_LIBS clangBasic ${system_libs} - ) + ) \ No newline at end of file diff --git a/clang/lib/ExtractAPI/CMakeLists.txt b/clang/lib/ExtractAPI/CMakeLists.txt --- a/clang/lib/ExtractAPI/CMakeLists.txt +++ b/clang/lib/ExtractAPI/CMakeLists.txt @@ -19,4 +19,7 @@ clangFrontend clangIndex clangLex + + DEPENDS + ClangDriverOptions ) diff --git a/clang/lib/Frontend/Rewrite/CMakeLists.txt b/clang/lib/Frontend/Rewrite/CMakeLists.txt --- a/clang/lib/Frontend/Rewrite/CMakeLists.txt +++ b/clang/lib/Frontend/Rewrite/CMakeLists.txt @@ -23,4 +23,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Index/CMakeLists.txt b/clang/lib/Index/CMakeLists.txt --- a/clang/lib/Index/CMakeLists.txt +++ b/clang/lib/Index/CMakeLists.txt @@ -28,4 +28,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt --- a/clang/lib/StaticAnalyzer/Core/CMakeLists.txt +++ b/clang/lib/StaticAnalyzer/Core/CMakeLists.txt @@ -64,5 +64,6 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/StaticAnalyzer/Frontend/CMakeLists.txt b/clang/lib/StaticAnalyzer/Frontend/CMakeLists.txt --- a/clang/lib/StaticAnalyzer/Frontend/CMakeLists.txt +++ b/clang/lib/StaticAnalyzer/Frontend/CMakeLists.txt @@ -26,4 +26,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Tooling/ASTDiff/CMakeLists.txt b/clang/lib/Tooling/ASTDiff/CMakeLists.txt --- a/clang/lib/Tooling/ASTDiff/CMakeLists.txt +++ b/clang/lib/Tooling/ASTDiff/CMakeLists.txt @@ -11,4 +11,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Tooling/DumpTool/CMakeLists.txt b/clang/lib/Tooling/DumpTool/CMakeLists.txt --- a/clang/lib/Tooling/DumpTool/CMakeLists.txt +++ b/clang/lib/Tooling/DumpTool/CMakeLists.txt @@ -2,6 +2,9 @@ add_clang_executable(clang-ast-dump ASTSrcLocProcessor.cpp ClangSrcLocDump.cpp + + DEPENDS + ClangDriverOptions ) target_link_libraries(clang-ast-dump diff --git a/clang/lib/Tooling/Refactoring/CMakeLists.txt b/clang/lib/Tooling/Refactoring/CMakeLists.txt --- a/clang/lib/Tooling/Refactoring/CMakeLists.txt +++ b/clang/lib/Tooling/Refactoring/CMakeLists.txt @@ -26,4 +26,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Tooling/Syntax/CMakeLists.txt b/clang/lib/Tooling/Syntax/CMakeLists.txt --- a/clang/lib/Tooling/Syntax/CMakeLists.txt +++ b/clang/lib/Tooling/Syntax/CMakeLists.txt @@ -19,4 +19,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/lib/Tooling/Transformer/CMakeLists.txt b/clang/lib/Tooling/Transformer/CMakeLists.txt --- a/clang/lib/Tooling/Transformer/CMakeLists.txt +++ b/clang/lib/Tooling/Transformer/CMakeLists.txt @@ -22,4 +22,5 @@ DEPENDS omp_gen + ClangDriverOptions ) diff --git a/clang/tools/arcmt-test/CMakeLists.txt b/clang/tools/arcmt-test/CMakeLists.txt --- a/clang/tools/arcmt-test/CMakeLists.txt +++ b/clang/tools/arcmt-test/CMakeLists.txt @@ -4,6 +4,9 @@ add_clang_executable(arcmt-test arcmt-test.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(arcmt-test diff --git a/clang/tools/c-index-test/CMakeLists.txt b/clang/tools/c-index-test/CMakeLists.txt --- a/clang/tools/c-index-test/CMakeLists.txt +++ b/clang/tools/c-index-test/CMakeLists.txt @@ -5,6 +5,9 @@ add_clang_executable(c-index-test c-index-test.c core_main.cpp + + DEPENDS + ClangDriverOptions ) if(NOT MSVC) diff --git a/clang/tools/clang-check/CMakeLists.txt b/clang/tools/clang-check/CMakeLists.txt --- a/clang/tools/clang-check/CMakeLists.txt +++ b/clang/tools/clang-check/CMakeLists.txt @@ -6,6 +6,9 @@ add_clang_tool(clang-check ClangCheck.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-check diff --git a/clang/tools/clang-diff/CMakeLists.txt b/clang/tools/clang-diff/CMakeLists.txt --- a/clang/tools/clang-diff/CMakeLists.txt +++ b/clang/tools/clang-diff/CMakeLists.txt @@ -4,6 +4,9 @@ add_clang_executable(clang-diff ClangDiff.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-diff diff --git a/clang/tools/clang-extdef-mapping/CMakeLists.txt b/clang/tools/clang-extdef-mapping/CMakeLists.txt --- a/clang/tools/clang-extdef-mapping/CMakeLists.txt +++ b/clang/tools/clang-extdef-mapping/CMakeLists.txt @@ -5,6 +5,8 @@ add_clang_tool(clang-extdef-mapping ClangExtDefMapGen.cpp + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-extdef-mapping diff --git a/clang/tools/clang-fuzzer/handle-cxx/CMakeLists.txt b/clang/tools/clang-fuzzer/handle-cxx/CMakeLists.txt --- a/clang/tools/clang-fuzzer/handle-cxx/CMakeLists.txt +++ b/clang/tools/clang-fuzzer/handle-cxx/CMakeLists.txt @@ -10,6 +10,9 @@ clangLex clangSerialization clangTooling + + DEPENDS + ClangDriverOptions ) target_include_directories(clangHandleCXX PRIVATE .) diff --git a/clang/tools/clang-import-test/CMakeLists.txt b/clang/tools/clang-import-test/CMakeLists.txt --- a/clang/tools/clang-import-test/CMakeLists.txt +++ b/clang/tools/clang-import-test/CMakeLists.txt @@ -8,6 +8,7 @@ clang-import-test.cpp DEPENDS intrinsics_gen + ClangDriverOptions ) set(CLANG_IMPORT_TEST_LIB_DEPS diff --git a/clang/tools/clang-offload-bundler/CMakeLists.txt b/clang/tools/clang-offload-bundler/CMakeLists.txt --- a/clang/tools/clang-offload-bundler/CMakeLists.txt +++ b/clang/tools/clang-offload-bundler/CMakeLists.txt @@ -9,6 +9,7 @@ DEPENDS intrinsics_gen + ClangDriverOptions ) set(CLANG_OFFLOAD_BUNDLER_LIB_DEPS diff --git a/clang/tools/clang-refactor/CMakeLists.txt b/clang/tools/clang-refactor/CMakeLists.txt --- a/clang/tools/clang-refactor/CMakeLists.txt +++ b/clang/tools/clang-refactor/CMakeLists.txt @@ -6,6 +6,9 @@ add_clang_tool(clang-refactor ClangRefactor.cpp TestSupport.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-refactor diff --git a/clang/tools/clang-rename/CMakeLists.txt b/clang/tools/clang-rename/CMakeLists.txt --- a/clang/tools/clang-rename/CMakeLists.txt +++ b/clang/tools/clang-rename/CMakeLists.txt @@ -5,6 +5,9 @@ add_clang_tool(clang-rename ClangRename.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-rename diff --git a/clang/tools/clang-repl/CMakeLists.txt b/clang/tools/clang-repl/CMakeLists.txt --- a/clang/tools/clang-repl/CMakeLists.txt +++ b/clang/tools/clang-repl/CMakeLists.txt @@ -9,6 +9,8 @@ add_clang_tool(clang-repl ClangRepl.cpp + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(clang-repl PRIVATE diff --git a/clang/tools/clang-scan-deps/CMakeLists.txt b/clang/tools/clang-scan-deps/CMakeLists.txt --- a/clang/tools/clang-scan-deps/CMakeLists.txt +++ b/clang/tools/clang-scan-deps/CMakeLists.txt @@ -13,6 +13,7 @@ ClangScanDeps.cpp DEPENDS + ClangDriverOptions ScanDepsOptsTableGen GENERATE_DRIVER ) diff --git a/clang/tools/diagtool/CMakeLists.txt b/clang/tools/diagtool/CMakeLists.txt --- a/clang/tools/diagtool/CMakeLists.txt +++ b/clang/tools/diagtool/CMakeLists.txt @@ -10,6 +10,9 @@ ListWarnings.cpp ShowEnabledWarnings.cpp TreeView.cpp + + DEPENDS + ClangDriverOptions ) clang_target_link_libraries(diagtool diff --git a/clang/tools/driver/CMakeLists.txt b/clang/tools/driver/CMakeLists.txt --- a/clang/tools/driver/CMakeLists.txt +++ b/clang/tools/driver/CMakeLists.txt @@ -31,6 +31,7 @@ DEPENDS intrinsics_gen + ClangDriverOptions ${support_plugins} GENERATE_DRIVER ) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -535,6 +535,10 @@ set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") if(ARG_DEPENDS) + foreach(dependency ${ARG_DEPENDS}) + string(REPLACE "-" "_" dependency ${dependency}) + target_compile_definitions(${obj_name} PUBLIC -DLLVM_DEPENDS_ON_${dependency}=1) + endforeach() add_dependencies(${obj_name} ${ARG_DEPENDS}) endif() # Treat link libraries like PUBLIC dependencies. LINK_LIBS might @@ -565,6 +569,12 @@ if(ARG_OUTPUT_NAME) set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") endif() + if(ARG_DEPENDS) + foreach(dependency ${ARG_DEPENDS}) + string(REPLACE "-" "_" dependency ${dependency}) + target_compile_definitions(${name_static} PRIVATE -DLLVM_DEPENDS_ON_${dependency}=1) + endforeach() + endif() # DEPENDS has been appended to LLVM_COMMON_LIBS. llvm_add_library(${name_static} STATIC ${output_name} @@ -590,6 +600,13 @@ add_library(${name} STATIC ${ALL_FILES}) endif() + if(ARG_DEPENDS) + foreach(dependency ${ARG_DEPENDS}) + string(REPLACE "-" "_" dependency ${dependency}) + target_compile_definitions(${name} PRIVATE -DLLVM_DEPENDS_ON_${dependency}=1) + endforeach() + endif() + if(ARG_COMPONENT_LIB) set_target_properties(${name} PROPERTIES LLVM_COMPONENT TRUE) set_property(GLOBAL APPEND PROPERTY LLVM_COMPONENT_LIBS ${name}) @@ -950,9 +967,9 @@ cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS" "ENTITLEMENTS;BUNDLE_PATH" - "" + "DEPENDS" ${ARGN}) - generate_llvm_objects(${name} ${ARG_UNPARSED_ARGUMENTS}) + generate_llvm_objects(${name} ${ARG_UNPARSED_ARGUMENTS} DEPENDS ${ARG_DEPENDS}) add_windows_version_resource_file(ALL_FILES ${ALL_FILES}) if(XCODE) @@ -967,6 +984,11 @@ add_executable(${name} ${ALL_FILES}) endif() + foreach(dependency ${ARG_DEPENDS}) + string(REPLACE "-" "_" dependency ${dependency}) + target_compile_definitions(${name} PRIVATE -DLLVM_DEPENDS_ON_${dependency}=1) + endforeach() + setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS}) if(NOT ARG_NO_INSTALL_RPATH) diff --git a/llvm/lib/TableGen/Main.cpp b/llvm/lib/TableGen/Main.cpp --- a/llvm/lib/TableGen/Main.cpp +++ b/llvm/lib/TableGen/Main.cpp @@ -96,6 +96,16 @@ return 0; } +static cl::opt +DependencyGuardName("dependency-guard=", cl::Prefix, cl::Hidden, cl::init("")); + +static void EmitDependencyGuard(StringRef Name, raw_ostream &OS) { + OS << "#ifndef LLVM_DEPENDS_ON_" << Name << "\n" + << "# error If you're seeing this message, there is a missing DEPENDS " + << Name << " in the CMake target that includes this file.\n" + << "#endif\n"; +} + int llvm::TableGenMain(const char *argv0, std::function MainFn) { RecordKeeper Records; @@ -139,6 +149,9 @@ status = MainFn(Out, Records); else return 1; + if (!DependencyGuardName.empty()) { + EmitDependencyGuard(DependencyGuardName, Out); + } Records.stopBackendTimer(); if (status) return 1;