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

Wink Saville via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 22 23:40:04 PDT 2019


Txs for the reply, hard to believe its impossible, llvm itself can
build both static and shared libraries if -DLLVM_BUILD_LLVM_DYLIB=on.
And actually, as I mentioned in my original post, there is already a
clang shared library, libclang.so.8. The problem with it is that it
only exposes the 380 C API entry points, not the full set of entry
points available with the libclang[[:alpha:]]+.a versions.

Is there something I'm missing?


On Mon, Apr 22, 2019 at 8:38 PM Tom Stellard <tstellar at redhat.com> wrote:
>
> 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