Skip to content

Commit f2c83a6

Browse files
committed
Fix package for local testing
1 parent 3fb4098 commit f2c83a6

File tree

6 files changed

+166
-185
lines changed

6 files changed

+166
-185
lines changed

.github/workflows/naive-build.yml

Lines changed: 18 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,7 @@ jobs:
2020
strategy:
2121
fail-fast: false
2222
matrix:
23-
include:
24-
- arch: amd64
25-
clang_target: x86_64-linux-gnu
26-
sysroot_arch: amd64
27-
- arch: arm64
28-
clang_target: aarch64-linux-gnu
29-
sysroot_arch: arm64
30-
- arch: "386"
31-
clang_target: i686-linux-gnu
32-
sysroot_arch: i386
33-
- arch: arm
34-
clang_target: arm-linux-gnueabihf
35-
sysroot_arch: armhf
23+
arch: [amd64, arm64, "386", arm]
3624
steps:
3725
- uses: actions/checkout@v4
3826
with:
@@ -74,7 +62,7 @@ jobs:
7462
if: steps.build-cache.outputs.cache-hit != 'true'
7563
run: ccache -s
7664
- name: Package
77-
run: go run ./cmd/build-naive --target=linux/${{ matrix.arch }} package
65+
run: go run ./cmd/build-naive --target=linux/${{ matrix.arch }} package --local
7866
- name: Cache toolchain
7967
uses: actions/cache@v4
8068
with:
@@ -89,42 +77,28 @@ jobs:
8977
run: |
9078
sudo apt update
9179
sudo apt install -y qemu-user-binfmt
92-
- name: Get CGO flags
93-
id: cgo-flags
94-
run: |
95-
CGO_FLAGS=$(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} cgo-flags)
96-
echo "CGO_FLAGS: $CGO_FLAGS"
97-
echo "flags=$CGO_FLAGS" >> $GITHUB_OUTPUT
9880
- name: Build test binary
9981
run: |
100-
CLANG=$PWD/naiveproxy/src/third_party/llvm-build/Release+Asserts/bin/clang
101-
SYSROOT=$PWD/naiveproxy/src/out/sysroot-build/bullseye/bullseye_${{ matrix.sysroot_arch }}_staging
102-
CC="$CLANG --target=${{ matrix.clang_target }} --sysroot=$SYSROOT" \
103-
CXX="$CLANG++ --target=${{ matrix.clang_target }} --sysroot=$SYSROOT" \
104-
CGO_ENABLED=1 \
105-
CGO_LDFLAGS="${{ steps.cgo-flags.outputs.flags }}" \
106-
GOOS=linux \
107-
GOARCH=${{ matrix.arch }} \
108-
go test -c -o cronet.test .
82+
eval $(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} env --export)
83+
CGO_ENABLED=1 GOOS=linux GOARCH=${{ matrix.arch }} go test -c -o cronet.test .
10984
- name: Run test binary
11085
run: |
86+
eval $(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} env --export)
11187
if [ "${{ matrix.arch }}" != "amd64" ] && [ "${{ matrix.arch }}" != "386" ]; then
112-
export QEMU_LD_PREFIX=$PWD/naiveproxy/src/out/sysroot-build/bullseye/bullseye_${{ matrix.sysroot_arch }}_staging
88+
export QEMU_LD_PREFIX
11389
fi
11490
./cronet.test -test.v -test.run=TestEngineVersion
11591
- name: Build purego test binary
11692
if: matrix.arch == 'amd64' || matrix.arch == 'arm64'
11793
run: |
11894
cp lib/linux_${{ matrix.arch }}/libcronet.so .
119-
CGO_ENABLED=0 \
120-
GOOS=linux \
121-
GOARCH=${{ matrix.arch }} \
122-
go test -tags with_purego -c -o cronet.purego.test .
95+
CGO_ENABLED=0 GOOS=linux GOARCH=${{ matrix.arch }} go test -tags with_purego -c -o cronet.purego.test .
12396
- name: Run purego test binary
12497
if: matrix.arch == 'amd64' || matrix.arch == 'arm64'
12598
run: |
12699
if [ "${{ matrix.arch }}" != "amd64" ]; then
127-
export QEMU_LD_PREFIX=$PWD/naiveproxy/src/out/sysroot-build/bullseye/bullseye_${{ matrix.sysroot_arch }}_staging
100+
eval $(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} env --export)
101+
export QEMU_LD_PREFIX
128102
fi
129103
export LD_LIBRARY_PATH=$PWD
130104
./cronet.purego.test -test.v -test.run=TestEngineVersion
@@ -200,15 +174,11 @@ jobs:
200174
if: steps.build-cache.outputs.cache-hit != 'true'
201175
run: ccache -s
202176
- name: Package
203-
run: go run ./cmd/build-naive --target=${{ matrix.target }} package
177+
run: go run ./cmd/build-naive --target=${{ matrix.target }} package --local
204178
- name: Build and run test binary
205-
if: startsWith(matrix.target, 'darwin/')
179+
if: matrix.target == 'darwin/arm64'
206180
run: |
207-
CGO_ENABLED=1 \
208-
CGO_LDFLAGS="$(go run ./cmd/build-naive --target=${{ matrix.target }} cgo-flags)" \
209-
GOOS=$(echo "${{ matrix.target }}" | cut -d/ -f1) \
210-
GOARCH=$(echo "${{ matrix.target }}" | cut -d/ -f2) \
211-
go test -c -o cronet.test .
181+
CGO_ENABLED=1 go test -c -o cronet.test .
212182
./cronet.test -test.v -test.run=TestEngineVersion
213183
- uses: actions/upload-artifact@v4
214184
with:
@@ -343,26 +313,16 @@ jobs:
343313
if: steps.build-cache.outputs.cache-hit != 'true'
344314
run: ccache -s
345315
- name: Package
346-
run: go run ./cmd/build-naive --target=android/${{ matrix.arch }} package
316+
run: go run ./cmd/build-naive --target=android/${{ matrix.arch }} package --local
347317
- name: Setup Android NDK
348318
uses: nttld/setup-ndk@v1
349319
id: setup-ndk
350320
with:
351321
ndk-version: r28
352-
- name: Get CGO flags
353-
id: cgo-flags
354-
run: |
355-
CGO_FLAGS=$(go run ./cmd/build-naive --target=android/${{ matrix.arch }} cgo-flags)
356-
echo "CGO_FLAGS: $CGO_FLAGS"
357-
echo "flags=$CGO_FLAGS" >> $GITHUB_OUTPUT
358322
- name: Build test binary
359323
run: |
360324
CC=${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin/${{ matrix.cc }} \
361-
CGO_ENABLED=1 \
362-
CGO_LDFLAGS="${{ steps.cgo-flags.outputs.flags }}" \
363-
GOOS=android \
364-
GOARCH=${{ matrix.arch }} \
365-
go test -c -o cronet.test .
325+
CGO_ENABLED=1 GOOS=android GOARCH=${{ matrix.arch }} go test -c -o cronet.test .
366326
- uses: actions/upload-artifact@v4
367327
with:
368328
name: cronet-android-${{ matrix.arch }}
@@ -377,23 +337,7 @@ jobs:
377337
strategy:
378338
fail-fast: false
379339
matrix:
380-
include:
381-
- arch: amd64
382-
cpu: x64
383-
clang_target: x86_64-openwrt-linux-musl
384-
openwrt_arch: x86_64
385-
- arch: arm64
386-
cpu: arm64
387-
clang_target: aarch64-openwrt-linux-musl
388-
openwrt_arch: aarch64
389-
- arch: "386"
390-
cpu: x86
391-
clang_target: i486-openwrt-linux-musl
392-
openwrt_arch: i386_pentium4
393-
- arch: arm
394-
cpu: arm
395-
clang_target: arm-openwrt-linux-musleabi
396-
openwrt_arch: arm_cortex-a15_neon-vfpv4
340+
arch: [amd64, arm64, "386", arm]
397341
steps:
398342
- uses: actions/checkout@v4
399343
with:
@@ -435,7 +379,7 @@ jobs:
435379
if: steps.build-cache.outputs.cache-hit != 'true'
436380
run: ccache -s
437381
- name: Package
438-
run: go run ./cmd/build-naive --target=linux/${{ matrix.arch }} --libc=musl package
382+
run: go run ./cmd/build-naive --target=linux/${{ matrix.arch }} --libc=musl package --local
439383
- name: Cache toolchain
440384
uses: actions/cache@v4
441385
with:
@@ -450,23 +394,10 @@ jobs:
450394
run: |
451395
sudo apt update
452396
sudo apt install -y qemu-user-binfmt
453-
- name: Get CGO flags
454-
id: cgo-flags
455-
run: |
456-
CGO_FLAGS=$(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} --libc=musl cgo-flags)
457-
echo "CGO_FLAGS: $CGO_FLAGS"
458-
echo "flags=$CGO_FLAGS" >> $GITHUB_OUTPUT
459397
- name: Build test binary
460398
run: |
461-
CLANG=$PWD/naiveproxy/src/third_party/llvm-build/Release+Asserts/bin/clang
462-
SYSROOT=$PWD/naiveproxy/src/out/sysroot-build/openwrt/23.05.5/${{ matrix.openwrt_arch }}
463-
CC="$CLANG --target=${{ matrix.clang_target }} --sysroot=$SYSROOT" \
464-
CXX="$CLANG++ --target=${{ matrix.clang_target }} --sysroot=$SYSROOT" \
465-
CGO_ENABLED=1 \
466-
CGO_LDFLAGS="${{ steps.cgo-flags.outputs.flags }}" \
467-
GOOS=linux \
468-
GOARCH=${{ matrix.arch }} \
469-
go test -c -o cronet.test .
399+
eval $(go run ./cmd/build-naive --target=linux/${{ matrix.arch }} --libc=musl env --export)
400+
CGO_ENABLED=1 GOOS=linux GOARCH=${{ matrix.arch }} go test -c -o cronet.test .
470401
- name: Run test binary
471402
continue-on-error: true # musl/QEMU test is flaky, don't block CI
472403
run: |

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ CLAUDE.md
1010
/lib/
1111
/include/
1212
/cgo_*.go
13+
/lib_*_cgo.go

Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
TARGET ?=
2+
TARGET_FLAG = $(if $(TARGET),--target=$(TARGET),)
3+
14
build:
2-
go run -v ./cmd/build-naive build
3-
go run -v ./cmd/build-naive package
5+
go run -v ./cmd/build-naive build $(TARGET_FLAG)
6+
go run -v ./cmd/build-naive package --local $(TARGET_FLAG)
47

58
test: make
69
go test -v .

cmd/build-naive/cmd_cgo_flags.go

Lines changed: 0 additions & 61 deletions
This file was deleted.

cmd/build-naive/cmd_env.go

Lines changed: 72 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,29 @@ import (
44
"fmt"
55
"log"
66
"path/filepath"
7+
"strings"
78

89
"github.com/spf13/cobra"
910
)
1011

11-
var commandEnv = &cobra.Command{
12-
Use: "env",
13-
Short: "Output environment variables for building downstream projects",
14-
Run: func(cmd *cobra.Command, args []string) {
15-
targets := parseTargets()
16-
if len(targets) != 1 {
17-
log.Fatal("env requires exactly one target")
18-
}
19-
printEnv(targets[0])
20-
},
21-
}
12+
var (
13+
commandEnv = &cobra.Command{
14+
Use: "env",
15+
Short: "Output environment variables for building downstream projects",
16+
Run: func(cmd *cobra.Command, args []string) {
17+
targets := parseTargets()
18+
if len(targets) != 1 {
19+
log.Fatal("env requires exactly one target")
20+
}
21+
printEnv(targets[0])
22+
},
23+
}
24+
envExport bool
25+
)
2226

2327
func init() {
2428
mainCommand.AddCommand(commandEnv)
29+
commandEnv.Flags().BoolVar(&envExport, "export", false, "Prefix output with 'export' for use with eval")
2530
}
2631

2732
func getClangTarget(t Target) string {
@@ -65,25 +70,66 @@ func getSysrootPath(t Target) string {
6570
}
6671

6772
func printEnv(t Target) {
68-
if t.GOOS != "linux" {
69-
log.Fatal("env command is only supported for Linux targets")
73+
if t.GOOS == "windows" {
74+
log.Fatal("env command is not supported for Windows (use purego mode with embedded DLL)")
75+
}
76+
77+
outputDirectory := getOutputDirectory(t)
78+
linkFlags, err := extractLinkFlags(outputDirectory)
79+
if err != nil {
80+
log.Fatalf("failed to extract link flags: %v", err)
7081
}
7182

72-
clangPath := filepath.Join(srcRoot, "third_party/llvm-build/Release+Asserts/bin/clang")
73-
clangTarget := getClangTarget(t)
74-
sysroot := getSysrootPath(t)
83+
// Build CGO_LDFLAGS with library path and link flags
84+
var ldFlags []string
85+
libraryDirectory := filepath.Join(projectRoot, "lib", getLibraryDirectoryName(t))
86+
87+
if t.GOOS == "darwin" || t.GOOS == "ios" {
88+
ldFlags = append(ldFlags, filepath.Join(libraryDirectory, "libcronet.a"))
89+
} else {
90+
ldFlags = append(ldFlags, "-L"+libraryDirectory, "-l:libcronet.a")
91+
}
7592

76-
cc := fmt.Sprintf("%s --target=%s --sysroot=%s", clangPath, clangTarget, sysroot)
77-
cxx := fmt.Sprintf("%s++ --target=%s --sysroot=%s", clangPath, clangTarget, sysroot)
93+
ldFlags = append(ldFlags, linkFlags.LDFlags...)
94+
ldFlags = append(ldFlags, linkFlags.Libs...)
95+
ldFlags = append(ldFlags, linkFlags.Frameworks...)
7896

79-
fmt.Printf("CC=%s\n", cc)
80-
fmt.Printf("CXX=%s\n", cxx)
97+
// Platform-specific linker flags
98+
if t.GOOS == "linux" {
99+
ldFlags = append(ldFlags, "-fuse-ld=lld")
100+
if t.ARCH == "386" || t.ARCH == "arm" {
101+
ldFlags = append(ldFlags, "-no-pie")
102+
}
103+
if t.Libc == "musl" {
104+
ldFlags = append(ldFlags, "-static")
105+
}
106+
}
107+
108+
prefix := ""
109+
if envExport {
110+
prefix = "export "
111+
}
112+
113+
fmt.Printf("%sCGO_LDFLAGS=%s\n", prefix, shellQuote(strings.Join(ldFlags, " ")))
114+
115+
// Linux-specific: CC, CXX for cross-compilation, QEMU_LD_PREFIX for running binaries
116+
if t.GOOS == "linux" {
117+
clangPath := filepath.Join(srcRoot, "third_party/llvm-build/Release+Asserts/bin/clang")
118+
clangTarget := getClangTarget(t)
119+
sysroot := getSysrootPath(t)
120+
121+
cc := fmt.Sprintf("%s --target=%s --sysroot=%s", clangPath, clangTarget, sysroot)
122+
cxx := fmt.Sprintf("%s++ --target=%s --sysroot=%s", clangPath, clangTarget, sysroot)
123+
124+
fmt.Printf("%sCC=%s\n", prefix, shellQuote(cc))
125+
fmt.Printf("%sCXX=%s\n", prefix, shellQuote(cxx))
126+
fmt.Printf("%sQEMU_LD_PREFIX=%s\n", prefix, sysroot)
127+
}
128+
}
81129

82-
// Output CGO_LDFLAGS for flags not allowed in #cgo LDFLAGS directive
83-
cgoLDFlags := "-fuse-ld=lld"
84-
// 32-bit builds need -no-pie to avoid relocation errors with static linking
85-
if t.ARCH == "386" || t.ARCH == "arm" {
86-
cgoLDFlags += " -no-pie"
130+
func shellQuote(s string) string {
131+
if strings.ContainsAny(s, " \t\n\"'\\$") {
132+
return "\"" + strings.ReplaceAll(s, "\"", "\\\"") + "\""
87133
}
88-
fmt.Printf("CGO_LDFLAGS=%s\n", cgoLDFlags)
134+
return s
89135
}

0 commit comments

Comments
 (0)