mstorsjo added a comment.

FYI, I'm seeing occasional spurious build breakage from this change.

The issue is that even if we've got 
`add_dependencies(clangAnalysisFlowSensitive 
clangAnalysisFlowSensitiveResources)`, it looks like 
`clangAnalysisFlowSensitiveResources` only is considered a dependency to the 
whole `clangAnalysisFlowSensitive` library target, but the individual 
`HTMLLogger.cpp.o` object file doesn't have a dependency on the generated 
`HTMLLogger.inc` file. So when building, it may start building 
`HTMLLogger.cpp.o` before `HTMLLogger.inc` has been generated.

To reproduce it:

  $ cd llvm-project/llvm
  $ mkdir build
  $ cd build
  $ cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang"
  $ ninja 
tools/clang/lib/Analysis/FlowSensitive/CMakeFiles/obj.clangAnalysisFlowSensitive.dir/HTMLLogger.cpp.o
  ../tools/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp:72:10: fatal error: 
HTMLLogger.inc: No such file or directory
     72 | #include "HTMLLogger.inc"
        |          ^~~~~~~~~~~~~~~~

If you've built this successfully once, then ninja also has picked up the 
dependency between `HTMLLogger.cpp.o` and `HTMLLogger.inc`, but it's possible 
to reproduce this in a clean build dir with the commands above.

Looking at the generated `build.ninja`, we've got this:

  build cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive: phony 
|| tools/clang/clang-tablegen-targets
  
  build cmake_object_order_depends_target_clangAnalysisFlowSensitive: phony || 
cmake_object_order_depends_target_LLVMAggressiveInstCombine 
cmake_object_order_depends_target_LLVMAnalysis 
cmake_object_order_depends_target_LLVMAsmParser 
cmake_object_order_depends_target_LLVMBinaryFormat 
cmake_object_order_depends_target_LLVMBitReader 
cmake_object_order_depends_target_LLVMBitstreamReader 
cmake_object_order_depends_target_LLVMCore 
cmake_object_order_depends_target_LLVMDebugInfoCodeView 
cmake_object_order_depends_target_LLVMDebugInfoDWARF 
cmake_object_order_depends_target_LLVMDebugInfoMSF 
cmake_object_order_depends_target_LLVMDebugInfoPDB 
cmake_object_order_depends_target_LLVMDemangle 
cmake_object_order_depends_target_LLVMFrontendOpenMP 
cmake_object_order_depends_target_LLVMIRReader 
cmake_object_order_depends_target_LLVMInstCombine 
cmake_object_order_depends_target_LLVMMC 
cmake_object_order_depends_target_LLVMMCParser 
cmake_object_order_depends_target_LLVMObject 
cmake_object_order_depends_target_LLVMProfileData 
cmake_object_order_depends_target_LLVMRemarks 
cmake_object_order_depends_target_LLVMScalarOpts 
cmake_object_order_depends_target_LLVMSupport 
cmake_object_order_depends_target_LLVMSymbolize 
cmake_object_order_depends_target_LLVMTargetParser 
cmake_object_order_depends_target_LLVMTextAPI 
cmake_object_order_depends_target_LLVMTransformUtils 
cmake_object_order_depends_target_clangAST 
cmake_object_order_depends_target_clangASTMatchers 
cmake_object_order_depends_target_clangAnalysis 
cmake_object_order_depends_target_clangBasic 
cmake_object_order_depends_target_clangLex 
cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive 
tools/clang/clang-tablegen-targets 
tools/clang/lib/Analysis/FlowSensitive/clangAnalysisFlowSensitiveResources
  
  build 
tools/clang/lib/Analysis/FlowSensitive/CMakeFiles/obj.clangAnalysisFlowSensitive.dir/HTMLLogger.cpp.o:
 CXX_COMPILER__obj.2eclangAnalysisFlowSensitive_Release 
../tools/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp || 
cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive

`HTMLLogger.cpp.o` depends on 
`cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive`, but that 
one doesn't depend on `clangAnalysisFlowSensitiveResources`. Only 
`cmake_object_order_depends_target_clangAnalysisFlowSensitive` (note the 
missing `obj.` in the middle) depends on it.

Looking at the similarly handled `HTMLForestResources.inc` in `clang-pseudo`, 
that one does work correctly. That one is set up with `add_clang_tool`, where 
there's no intermediate object library between the target itself and the object 
files as for `add_clang_library`.

Not sure what the right CMake way to handle it is - should the dependency be 
added for the intermediate object library? (Looking in the cmake files, it 
doesn't seem like we always generate object libraries.) Or should we add an 
explicit dependency for the `HTMLLogger.cpp` source file?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D146591/new/

https://reviews.llvm.org/D146591

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to