@@ -71,6 +71,33 @@ namespace :compile do
7171 "CGO_ENABLED" => "1" # Ensure CGO is enabled for c-shared
7272 }
7373
74+ # Set platform-specific C toolchain environment vars so cgo invokes the correct compiler/assembler/linker.
75+ case config [ :goos ]
76+ when "linux"
77+ if config [ :goarch ] == "arm64" || config [ :goarch ] == "arm" || arch . include? ( "aarch64" )
78+ # Use the aarch64 cross-compiler installed via apt (aarch64-linux-gnu-*)
79+ env [ "CC" ] = ENV . fetch ( "CC" , "aarch64-linux-gnu-gcc" )
80+ env [ "CXX" ] = ENV . fetch ( "CXX" , "aarch64-linux-gnu-g++" )
81+ env [ "AR" ] = ENV . fetch ( "AR" , "aarch64-linux-gnu-ar" )
82+ env [ "RANLIB" ] = ENV . fetch ( "RANLIB" , "aarch64-linux-gnu-ranlib" )
83+ else
84+ # For x86_64 linux, host gcc should work on linux runners
85+ env [ "CC" ] ||= ENV . fetch ( "CC" , "gcc" )
86+ end
87+ when "windows"
88+ # Use mingw-w64 cross compiler binaries (installed via apt on linux)
89+ if config [ :goarch ] == "amd64" || arch . include? ( "mingw" ) || arch . include? ( "x64" )
90+ env [ "CC" ] = ENV . fetch ( "CC" , "x86_64-w64-mingw32-gcc" )
91+ env [ "CXX" ] = ENV . fetch ( "CXX" , "x86_64-w64-mingw32-g++" )
92+ env [ "AR" ] = ENV . fetch ( "AR" , "x86_64-w64-mingw32-ar" )
93+ env [ "RANLIB" ] = ENV . fetch ( "RANLIB" , "x86_64-w64-mingw32-ranlib" )
94+ end
95+ when "darwin"
96+ # Note: cross-compiling darwin/arm64 on an x86 mac runner is NOT reliably supported
97+ # unless you use osxcross or an ARM mac runner. We try nothing here; rely on runner's clang.
98+ env [ "CC" ] ||= ENV . fetch ( "CC" , "clang" )
99+ end
100+
74101 command = [
75102 "go" , "build" ,
76103 "-buildmode=c-shared" ,
0 commit comments