[cfe-dev] How to build shared and static libclang* files
Tom Stellard via cfe-dev
cfe-dev at lists.llvm.org
Tue Apr 23 09:02:59 PDT 2019
On 04/22/2019 11:40 PM, Wink Saville wrote:
> 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.
>
This is just a difference between llvm and clang. llvm has a special
llvm-shlib target that builds libLLVM.so when LLVM_BUILD_LLVM_DYLIB
is enabled. We could just as easily add this to clang, it's just
that no one has yet.
-Tom
> 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