環(huán)境 ArchLinux
pacman -S archlinuxcn/clang-git archlinuxcn/polly-git
git clone --depth 1 --recursive https://github.com/MaskRay/ccls
然后更改 CLANG_LINK_CLANG_DYLIB 相關(guān)的條件語(yǔ)句,把動(dòng)態(tài)鏈接庫(kù)刪掉,只留下靜態(tài)庫(kù)
執(zhí)行 cmake -B build
更改 CMakeFiles/ccls.dir/link.txt,將其中帶 so 后綴的盡可能改成 a 文件。并且添加 -static-libstdc++ -static-libgcc 例如:
/usr/lib/ccache/bin/c++ -O3 -DNDEBUG CMakeFiles/ccls.dir/third_party/siphash.cc.o CMakeFiles/ccls.dir/src/clang_tu.cc.o CMakeFiles/ccls.dir/src/config.cc.o CMakeFiles/ccls.dir/src/filesystem.cc.o CMakeFiles/ccls.dir/src/fuzzy_match.cc.o CMakeFiles/ccls.dir/src/main.cc.o CMakeFiles/ccls.dir/src/include_complete.cc.o CMakeFiles/ccls.dir/src/indexer.cc.o CMakeFiles/ccls.dir/src/log.cc.o CMakeFiles/ccls.dir/src/lsp.cc.o CMakeFiles/ccls.dir/src/message_handler.cc.o CMakeFiles/ccls.dir/src/pipeline.cc.o CMakeFiles/ccls.dir/src/platform_posix.cc.o CMakeFiles/ccls.dir/src/platform_win.cc.o CMakeFiles/ccls.dir/src/position.cc.o CMakeFiles/ccls.dir/src/project.cc.o CMakeFiles/ccls.dir/src/query.cc.o CMakeFiles/ccls.dir/src/sema_manager.cc.o CMakeFiles/ccls.dir/src/serializer.cc.o CMakeFiles/ccls.dir/src/test.cc.o CMakeFiles/ccls.dir/src/utils.cc.o CMakeFiles/ccls.dir/src/working_files.cc.o CMakeFiles/ccls.dir/src/messages/ccls_call.cc.o CMakeFiles/ccls.dir/src/messages/ccls_info.cc.o CMakeFiles/ccls.dir/src/messages/ccls_inheritance.cc.o CMakeFiles/ccls.dir/src/messages/ccls_member.cc.o CMakeFiles/ccls.dir/src/messages/ccls_navigate.cc.o CMakeFiles/ccls.dir/src/messages/ccls_reload.cc.o CMakeFiles/ccls.dir/src/messages/ccls_vars.cc.o CMakeFiles/ccls.dir/src/messages/initialize.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_code.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_completion.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_definition.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_did.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_foldingRange.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_formatting.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_document.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_hover.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_references.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_rename.cc.o CMakeFiles/ccls.dir/src/messages/textDocument_signatureHelp.cc.o CMakeFiles/ccls.dir/src/messages/workspace.cc.o -o ccls /usr/lib/libclangIndex.a /usr/lib/libclangFormat.a /usr/lib/libclangTooling.a /usr/lib/libclangToolingInclusions.a /usr/lib/libclangToolingCore.a /usr/lib/libclangFrontend.a /usr/lib/libclangParse.a /usr/lib/libclangSerialization.a /usr/lib/libclangSema.a /usr/lib/libclangAST.a /usr/lib/libclangLex.a /usr/lib/libclangDriver.a /usr/lib/libclangBasic.a /usr/lib/libLLVMOption.a /usr/lib/libLLVMSupport.a /usr/lib/libclangFormat.a /usr/lib/libclangToolingInclusions.a /usr/lib/libclangToolingCore.a /usr/lib/libclangEdit.a /usr/lib/libclangAnalysis.a /usr/lib/libclangRewrite.a /usr/lib/libclangASTMatchers.a /usr/lib/libclangAST.a /usr/lib/libclangLex.a /usr/lib/libclangBasic.a /usr/lib/libLLVM-15.so /usr/lib/librt.a /usr/lib/libdl.a -lm /usr/lib/libz.a /usr/lib/libtinfo.so /usr/lib/libLLVMDemangle.a -static-libstdc++ -static-libgcc
執(zhí)行 make
這時(shí)編譯出來(lái)的 ccls 大概 46MB,然后執(zhí)行
ldd ccls | awk {'print $1'} | xargs -I {} cp -L -n '/usr/lib/{}' .
然后把拷貝失敗的庫(kù)手動(dòng)拷貝一下
然后執(zhí)行:
sed -i -e 's#/usr#././#g' ccls
sed -i -e 's#/lib64#././#g' ccls
這時(shí)的 ccls 就是完全沒(méi)依賴(lài)的了。執(zhí)行的時(shí)候需要加上 export LD_LIBRARY_PATH=\pwd`:$PATH`
然后執(zhí)行的時(shí)候告訴我內(nèi)核版本太低。md
file 看一下可以知道內(nèi)核版本
下面是 Fedora 下失敗的產(chǎn)物,不用看
LspInstall 沒(méi)有 ccls,原因是 ccls 沒(méi)有提供 build。所以我在這里記一下編譯方式,有空做個(gè) github action,然后給 lspinstall 提個(gè) pr。理想情況下是把代碼合并到 ccls 中
首先是 clone:
git clone --depth 1 --recursive https://github.com/MaskRay/ccls
然后安裝依賴(lài)和靜態(tài)庫(kù):
dnf in clang-devel llvm-devel libstdc++-static.x86_64 glibc-static llvm-static
然后進(jìn)入 ccls 中,執(zhí)行
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS='-static'
cmake --build build/Release
報(bào)錯(cuò):
/usr/bin/ld: 試圖靜態(tài)鏈結(jié)的動(dòng)態(tài)對(duì)象 /usr/lib64/libclang-cpp.so.13
這個(gè)庫(kù)文件是 clang-libs 提供的,F(xiàn)edora 的描述為:
| clang-libs.x86_64 : Runtime library for clang
因此沒(méi)有靜態(tài)庫(kù)
原因是在 CMakeLists 中的第 74,75 行:
if(CLANG_LINK_CLANG_DYLIB)
target_link_libraries(ccls PRIVATE clang-cpp)
但是即使是加了 -DCLANG_LINK_CLANG_DYLIB=OFF 也沒(méi)用。細(xì)看發(fā)現(xiàn)上文沒(méi)有 option(CLANG_LINK_CLANG_DYLIB)
git clone --depth 1 --recursive https://github.com/llvm/llvm-project.git
cmake -Hllvm -BRelease -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_PROJECTS=clang
ninja -C Release clangFormat clangFrontendTool clangIndex clangTooling clang