-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[Clang] [Docs] Add some CMake example code for linking against libclang #166268
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-clang Author: None (Sirraide) ChangesThough we have a few code examples in our documentation that show how to use libclang, we never actually show how to link against it. I myself mostly figured this out through trial and error some time ago, and I’ve since had to explain it to others on several occasions, so I thought adding some very minimal CMake example code might be helpful. Full diff: https://github.com/llvm/llvm-project/pull/166268.diff 1 Files Affected:
diff --git a/clang/docs/LibClang.rst b/clang/docs/LibClang.rst
index e747022b9c173..6c62bcb5f8c29 100644
--- a/clang/docs/LibClang.rst
+++ b/clang/docs/LibClang.rst
@@ -38,6 +38,7 @@ Code example
.. code-block:: cpp
+ // main.cpp
#include <clang-c/Index.h>
#include <iostream>
@@ -57,6 +58,22 @@ Code example
CXCursor cursor = clang_getTranslationUnitCursor(unit); //Obtain a cursor at the root of the translation unit
}
+.. code-block:: cmake
+
+ # CMakeLists.txt
+ cmake_minimum_required(VERSION 3.20)
+ project(my_clang_tool VERSION 0.1.0)
+
+ # This will find the default system installation of Clang; if you want to
+ # use a different build of clang, pass -DClang_DIR=/foobar/lib/cmake/clang
+ # to the CMake configure command, where /foobar is the build directory where
+ # you built Clang.
+ find_package(Clang CONFIG REQUIRED)
+
+ add_executable(my_clang_tool main.cpp)
+ target_include_directories(my_clang_tool PRIVATE ${CLANG_INCLUDE_DIRS})
+ target_link_libraries(my_clang_tool PRIVATE libclang)
+
Visiting elements of an AST
~~~~~~~~~~~~~~~~~~~~~~~~~~~
The elements of an AST can be recursively visited with pre-order traversal with ``clang_visitChildren``.
@@ -283,6 +300,7 @@ Complete example code
.. code-block:: cpp
+ // main.cpp
#include <clang-c/Index.h>
#include <iostream>
@@ -356,6 +374,21 @@ Complete example code
);
}
+.. code-block:: cmake
+
+ # CMakeLists.txt
+ cmake_minimum_required(VERSION 3.20)
+ project(my_clang_tool VERSION 0.1.0)
+
+ # This will find the default system installation of Clang; if you want to
+ # use a different build of clang, pass -DClang_DIR=/foobar/lib/cmake/clang
+ # to the CMake configure command, where /foobar is the build directory where
+ # you built Clang.
+ find_package(Clang CONFIG REQUIRED)
+
+ add_executable(my_clang_tool main.cpp)
+ target_include_directories(my_clang_tool PRIVATE ${CLANG_INCLUDE_DIRS})
+ target_link_libraries(my_clang_tool PRIVATE libclang)
.. _Index.h: https://github.com/llvm/llvm-project/blob/main/clang/include/clang-c/Index.h
|
AaronBallman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM thank you for the improved docs!
| find_package(Clang CONFIG REQUIRED) | ||
| add_executable(my_clang_tool main.cpp) | ||
| target_include_directories(my_clang_tool PRIVATE ${CLANG_INCLUDE_DIRS}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This whole target_include_directories invocation should not have been needed if we had our CMake code in shape, but that's not your fault anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, normally target_link_libraries should set the include directories properly, but I distinctly recall running into horrible crashes on several occasions whenever I forgot this step because it’d find my system clang headers but link against my more up-to-date local clang build, which of course didn’t end well, so I made sure to include that here.
Though we have a few code examples in our documentation that show how to use libclang, we never actually show how to link against it. I myself mostly figured this out through trial and error some time ago, and I’ve since had to explain it to others on several occasions, so I thought adding some very minimal CMake example code might be helpful.