llvm / llvm/llvm-project

confusing error message from cmake

Open
#177,162 2 comments 1 reaction 0 assignees View on GitHub
clang documentation
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

I'm trying to follow this tutorial:
https://www.freecodecamp.org/news/clang-ast-based-static-analysis-tools/

Now I have the CMakeLists.txt that it's suggesting me to create:
```cmake
set(LLVM_LINK_COMPONENTS support)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

add_clang_executable(class-analyzer
ClassAnalzyer.cpp
MyFrontendActionFactory.cpp
MyFrontendAction.cpp
MyASTConsumer.cpp
)
target_link_libraries(class-analyzer
PRIVATE
clangAST
clangFrontend
clangTooling
)
```
And the files look like this:
```
$ ls clang-tools-extra/class-analyzer/
CMakeLists.txt MyASTConsumer.cpp MyFrontendAction.cpp MyFrontendActionFactory.cpp
ClassAnalyzer.cpp MyASTConsumer.h MyFrontendAction.h MyFrontendActionFactory.h
```
One thing that the tutorial fails to mention is that I should add the following line to the `CMakeLists.txt` in the `clang-tools-extra` directory, otherwise my directory seems to be ignored (is this correct?)
```
add_subdirectory(class-analyzer)
```
But then when I run cmake (using `cmake -S llvm -B build -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra"`) I get the following error:
```
CMake Error at cmake/modules/LLVMProcessSources.cmake:113 (message):
Found erroneous configuration for source file ClassAnalyzer.cpp

LLVM's build system enforces that all source files are added to a build
target, that exactly one build target exists in each directory, and that
this target lists all files in that directory. If you want multiple
targets in the same directory, add PARTIAL_SOURCES_INTENDED to the target
specification, though it is discouraged.

Please update
/.../llvm-project/clang-tools-extra/class-analyzer/CMakeLists.txt

Call Stack (most recent call first):
cmake/modules/LLVMProcessSources.cmake:59 (llvm_check_source_file_list)
cmake/modules/AddLLVM.cmake:978 (llvm_process_sources)
cmake/modules/AddLLVM.cmake:1033 (generate_llvm_objects)
/.../llvm-project/clang/cmake/modules/AddClang.cmake:160 (add_llvm_executable)
/.../llvm-project/clang-tools-extra/class-analyzer/CMakeLists.txt:4 (add_clang_executable)
```
In what way is the configuration erroneous?
- all source files are added to a build target - I assume this is true, because I have `add_clang_executable(class-analyzer` which I assume is a "target" and it lists all the .cpp files in the directory (I assume by "source files" it refers to .cpp files)
- that exactly one build target exists in each directory - I assume this is true because the only "target" is `add_clang_executable(class-analyzer`, and there are no other `CMakeLists.txt` files in this directory that might contain other targets
- and that this target lists all files in that directory - this one I was not sure about, because there are also .h files in the directory, but I did try adding them to the list under `add_clang_executable(class-analyzer` and it doesn't change anything, not even the error message, also the error message refers to `ClassAnalyzer.cpp` and not any of the `.h` files
- If you want multiple targets in the same directory - no, I don't think there is any need to put any more targets in that directory

Any idea what I'm doing wrong? It might be helpful to improve the error message to provide more details.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.