[cfe-dev] How to build shared and static libclang* files

Wink Saville via cfe-dev cfe-dev at lists.llvm.org
Sun Apr 21 18:34:37 PDT 2019


I'm trying to build LLVM, clang and lld release/8.x from
https://github.com/llvm/llvm-project.

I'm on Arch Linux system using gcc:

  $ uname -a
  Linux wink-desktop 5.0.7-arch1-1-ARCH #1 SMP PREEMPT Mon Apr 8
10:37:08 UTC 2019 x86_64 GNU/Linux

  $ gcc --version
  gcc (GCC) 8.2.1 20181127
  Copyright (C) 2018 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

One way I've been able to do this is to first build LLVM, clang and
lld which creates the static libraries, libclang*.a:

  $ git clone https://github.com/llvm/llvm-project && \
  cd llvm-project/ && \
  git checkout release/8.x && \
  cd llvm && \
  mkdir build && \
  cd build && \
  cmake .. -G Ninja -DCMAKE_INSTALL_PREFIX=$HOME/local
-DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_LLVM_DYLIB=ON
-DLLVM_ENABLE_PROJECTS="clang;lld" && \
  ninja install


At this point we have libclang*.a and libclang.so. But this
libclang.so only exposes the 380 C API globals and there are no
libclang*.so matching the libclang*.a files:

  wink at wink-desktop:~/local/lib
  $ ls libclang*
  libclangAnalysis.a            libclangFrontendTool.a
libclang.so.8                          libclangTidyModernizeModule.a
  libclangApplyReplacements.a   libclangHandleCXX.a
libclangStaticAnalyzerCheckers.a       libclangTidyMPIModule.a
  libclangARCMigrate.a          libclangHandleLLVM.a
libclangStaticAnalyzerCore.a           libclangTidyObjCModule.a
  libclangAST.a                 libclangIncludeFixer.a
libclangStaticAnalyzerFrontend.a       libclangTidyPerformanceModule.a
  libclangASTMatchers.a         libclangIncludeFixerPlugin.a
libclangTidy.a                         libclangTidyPlugin.a
  libclangBasic.a               libclangIndex.a
libclangTidyAbseilModule.a             libclangTidyPortabilityModule.a
  libclangChangeNamespace.a     libclangLex.a
libclangTidyAndroidModule.a            libclangTidyReadabilityModule.a
  libclangCodeGen.a             libclangMove.a
libclangTidyBoostModule.a              libclangTidyUtils.a
  libclangCrossTU.a             libclangParse.a
libclangTidyBugproneModule.a           libclangTidyZirconModule.a
  libclangDaemon.a              libclangQuery.a
libclangTidyCERTModule.a               libclangTooling.a
  libclangDoc.a                 libclangReorderFields.a
libclangTidyCppCoreGuidelinesModule.a  libclangToolingASTDiff.a
  libclangDriver.a              libclangRewrite.a
libclangTidyFuchsiaModule.a            libclangToolingCore.a
  libclangDynamicASTMatchers.a  libclangRewriteFrontend.a
libclangTidyGoogleModule.a             libclangToolingInclusions.a
  libclangEdit.a                libclangSema.a
libclangTidyHICPPModule.a              libclangToolingRefactor.a
  libclangFormat.a              libclangSerialization.a
libclangTidyLLVMModule.a
  libclangFrontend.a            libclang.so
libclangTidyMiscModule.a
  wink at wink-desktop:~/local/lib
  $ objdump -tC libclang.so.8 | grep ' g   ' | wc -l
  380


Now, if I do a second build from within clang and use BUILD_SHARED_LIBS=ON:

  $ cd ../../clang && \
  mkdir build && \
  cd build && \
  cmake .. -G Ninja -DCMAKE_INSTALL_PREFIX=$HOME/local
-DCMAKE_PREFIX_PATH=$HOME/local -DCMAKE_BUILD_TYPE=Release
-DBUILD_SHARED_LIBS=ON && \
  ninja install

And now have both libclang*.so and libclang*.a:

  wink at wink-desktop:~/local/lib
  $ ls libclang*
  libclangAnalysis.a               libclangEdit.a
libclangReorderFields.a                libclangTidyFuchsiaModule.a
  libclangAnalysis.so              libclangEdit.so
libclangRewrite.a                      libclangTidyGoogleModule.a
  libclangAnalysis.so.8            libclangEdit.so.8
libclangRewriteFrontend.a              libclangTidyHICPPModule.a
  libclangApplyReplacements.a      libclangFormat.a
libclangRewriteFrontend.so             libclangTidyLLVMModule.a
  libclangARCMigrate.a             libclangFormat.so
libclangRewriteFrontend.so.8           libclangTidyMiscModule.a
  libclangARCMigrate.so            libclangFormat.so.8
libclangRewrite.so                     libclangTidyModernizeModule.a
  libclangARCMigrate.so.8          libclangFrontend.a
libclangRewrite.so.8                   libclangTidyMPIModule.a
  libclangAST.a                    libclangFrontend.so
libclangSema.a                         libclangTidyObjCModule.a
  libclangASTMatchers.a            libclangFrontend.so.8
libclangSema.so                        libclangTidyPerformanceModule.a
  libclangASTMatchers.so           libclangFrontendTool.a
libclangSema.so.8                      libclangTidyPlugin.a
  libclangASTMatchers.so.8         libclangFrontendTool.so
libclangSerialization.a                libclangTidyPortabilityModule.a
  libclangAST.so                   libclangFrontendTool.so.8
libclangSerialization.so               libclangTidyReadabilityModule.a
  libclangAST.so.8                 libclangHandleCXX.a
libclangSerialization.so.8             libclangTidyUtils.a
  libclangBasic.a                  libclangHandleCXX.so
libclang.so                            libclangTidyZirconModule.a
  libclangBasic.so                 libclangHandleCXX.so.8
libclang.so.8                          libclangTooling.a
  libclangBasic.so.8               libclangHandleLLVM.a
libclangStaticAnalyzerCheckers.a       libclangToolingASTDiff.a
  libclangChangeNamespace.a        libclangHandleLLVM.so
libclangStaticAnalyzerCheckers.so      libclangToolingASTDiff.so
  libclangCodeGen.a                libclangHandleLLVM.so.8
libclangStaticAnalyzerCheckers.so.8    libclangToolingASTDiff.so.8
  libclangCodeGen.so               libclangIncludeFixer.a
libclangStaticAnalyzerCore.a           libclangToolingCore.a
  libclangCodeGen.so.8             libclangIncludeFixerPlugin.a
libclangStaticAnalyzerCore.so          libclangToolingCore.so
  libclangCrossTU.a                libclangIndex.a
libclangStaticAnalyzerCore.so.8        libclangToolingCore.so.8
  libclangCrossTU.so               libclangIndex.so
libclangStaticAnalyzerFrontend.a       libclangToolingInclusions.a
  libclangCrossTU.so.8             libclangIndex.so.8
libclangStaticAnalyzerFrontend.so      libclangToolingInclusions.so
  libclangDaemon.a                 libclangLex.a
libclangStaticAnalyzerFrontend.so.8    libclangToolingInclusions.so.8
  libclangDoc.a                    libclangLex.so
libclangTidy.a                         libclangToolingRefactor.a
  libclangDriver.a                 libclangLex.so.8
libclangTidyAbseilModule.a             libclangToolingRefactor.so
  libclangDriver.so                libclangMove.a
libclangTidyAndroidModule.a            libclangToolingRefactor.so.8
  libclangDriver.so.8              libclangParse.a
libclangTidyBoostModule.a              libclangTooling.so
  libclangDynamicASTMatchers.a     libclangParse.so
libclangTidyBugproneModule.a           libclangTooling.so.8
  libclangDynamicASTMatchers.so    libclangParse.so.8
libclangTidyCERTModule.a
  libclangDynamicASTMatchers.so.8  libclangQuery.a
libclangTidyCppCoreGuidelinesModule.a

So it "worked", but seems harder than it should be.

Is there a way to have both the libclang*.a and libclang*.so files
built at the same time while building LLVM?

-- Wink


More information about the cfe-dev mailing list