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

Tom Stellard via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 22 20:38:06 PDT 2019


On 04/21/2019 06:34 PM, Wink Saville via cfe-dev wrote:
> 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?
> 

I don't think this is possible.

-Tom

> -- Wink
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> 



More information about the cfe-dev mailing list