daeuniverse / dae

eBPF-based Linux high-performance transparent proxy solution.
GNU Affero General Public License v3.0
2.62k stars 165 forks source link

chore/docs: enable cgo as much as possible #564

Open mzz2017 opened 4 days ago

mzz2017 commented 4 days ago

Background

根据 #557 所述,应尽量开启 CGO。对于跨平台移植性,使用 static link 来保证。因此检查 musl-gcc 和 zig 的可用性并调整 CC 进行 static link。

Checklist

Full Changelogs

Issue Reference

Closes #557

Test Result

douglarek commented 2 days ago

Forgive my frankness, but this PR is adding unprecedented complexity to the build. For proprietary builds of various distributions, using CGO is a given fact. This PR wants to cover all possible CGO builds, which doesn't seem very necessary. I think it's unnecessary to make a big fuss over a rare DNS resolution issue; a document explanation or emphasis would suffice.

mzz2017 commented 2 days ago

@douglarek 从用户的角度来说,如果没有安装两个工具,行为是和之前一样的,不是强制的。只是尽量在工具存在的情况下绕过glibc进行静态编译

mzz2017 commented 2 days ago

@douglarek CGO_ENABLED=0 可能会带来其他潜在问题,另外由关闭 cgo 导致的 dns 解析失败的问题很难排查,考虑到用户的环境复杂度,使用 libc 而不是 pure go 实现将问题复杂度从用户转移给更为专业的打包者我认为是可接受的。 欢迎大家进行讨论,特别是用户和打包者等不同角色的参与。

douglarek commented 2 days ago

另外由关闭 cgo 导致的 dns 解析失败的问题很难排查

How about outputting whether a cgo is enabled in the version information? like this:

dae version 0.7.0rc1.r5.g64ebfea
go runtime go1.22.4 linux/amd64
CGO: enabled
Copyright (c) 2022-2024 @daeuniverse
License GNU AGPLv3 <https://github.com/daeuniverse/dae/blob/main/LICENSE>

if not:

dae version 0.7.0rc1.r5.g64ebfea
go runtime go1.22.4 linux/amd64
CGO: disabled (perhaps it will cause some dns issues)
Copyright (c) 2022-2024 @daeuniverse
License GNU AGPLv3 <https://github.com/daeuniverse/dae/blob/main/LICENSE>
mzz2017 commented 6 hours ago

@douglarek What about the following compromise:

  1. Only statically link in CI/Dockerfile instead of make manually
  2. Revert related modification in Makefile
  3. Use musl-cross for static link instead of zig cc
  4. Give a docs to explain how to statically link
douglarek commented 32 minutes ago

Only statically link in CI/Dockerfile instead of make manually

I think this is quite good; the binary released by the project can make such guarantees. However, when it comes to users compiling on their own, they can decide for themselves. For actual distribution packaging, relying on glibc to enable cgo is a very normal operation(dae-git).