[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