环境 ArchLinux
pacman -S archlinuxcn/clang-git archlinuxcn/polly-git
git clone --depth 1 --recursive https://github.com/MaskRay/ccls
然后更改 CLANG_LINK_CLANG_DYLIB 相关的条件语句,把动态链接库删掉,只留下静态库
执行 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
执行 make
这时编译出来的 ccls 大概 46MB,然后执行
ldd ccls | awk {'print $1'} | xargs -I {} cp -L -n '/usr/lib/{}' .
然后把拷贝失败的库手动拷贝一下
然后执行:
sed -i -e 's#/usr#././#g' ccls
sed -i -e 's#/lib64#././#g' ccls
这时的 ccls 就是完全没依赖的了。执行的时候需要加上 export LD_LIBRARY_PATH=\
pwd`:$PATH`
然后执行的时候告诉我内核版本太低。md
file 看一下可以知道内核版本
下面是 Fedora 下失败的产物,不用看
LspInstall 没有 ccls,原因是 ccls 没有提供 build。所以我在这里记一下编译方式,有空做个 github action,然后给 lspinstall 提个 pr。理想情况下是把代码合并到 ccls 中
首先是 clone:
git clone --depth 1 --recursive https://github.com/MaskRay/ccls
然后安装依赖和静态库:
dnf in clang-devel llvm-devel libstdc++-static.x86_64 glibc-static llvm-static
然后进入 ccls 中,执行
cmake -B build/Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS='-static'
cmake --build build/Release
报错:
/usr/bin/ld: 试图静态链结的动态对象 /usr/lib64/libclang-cpp.so.13
这个库文件是 clang-libs 提供的,Fedora 的描述为:
| clang-libs.x86_64 : Runtime library for clang
因此没有静态库
原因是在 CMakeLists 中的第 74,75 行:
if(CLANG_LINK_CLANG_DYLIB)
target_link_libraries(ccls PRIVATE clang-cpp)
但是即使是加了 -DCLANG_LINK_CLANG_DYLIB=OFF 也没用。细看发现上文没有 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