You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
4.4 KiB
201 lines
4.4 KiB
//go:build mage
|
|
// +build mage
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
)
|
|
|
|
var (
|
|
soName = "libopenimsdk" //
|
|
outPath = "../shared/"
|
|
goSrc = "go" //
|
|
)
|
|
|
|
var Default = Build
|
|
|
|
// BuildAll compiles the project for all platforms.
|
|
func Build() {
|
|
if err := BuildAndroid(); err != nil {
|
|
fmt.Println("Error building for Android:", err)
|
|
}
|
|
if err := BuildIOS(); err != nil {
|
|
fmt.Println("Error building for iOS:", err)
|
|
}
|
|
if err := BuildLinux(); err != nil {
|
|
fmt.Println("Error building for Linux:", err)
|
|
}
|
|
if err := BuildWindows(); err != nil {
|
|
fmt.Println("Error building for Windows:", err)
|
|
}
|
|
}
|
|
|
|
// BuildAndroid compiles the project for Android.
|
|
func BuildAndroid() error {
|
|
architectures := []struct {
|
|
Arch, API string
|
|
}{
|
|
{"arm", "16"},
|
|
{"arm64", "21"},
|
|
{"386", "16"},
|
|
{"amd64", "21"},
|
|
}
|
|
|
|
for _, arch := range architectures {
|
|
if err := buildAndroid(outPath+"android", arch.Arch, arch.API); err != nil {
|
|
fmt.Printf("Failed to build for %s: %v\n", arch.Arch, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BuildIOS compiles the project for iOS.
|
|
func BuildIOS() error {
|
|
fmt.Println("Building for iOS...")
|
|
outPath += "ios"
|
|
arch := os.Getenv("GOARCH")
|
|
|
|
if len(arch) == 0 {
|
|
arch = runtime.GOARCH
|
|
}
|
|
|
|
os.Setenv("GOOS", "darwin")
|
|
os.Setenv("GOARCH", arch)
|
|
os.Setenv("CGO_ENABLED", "1")
|
|
os.Setenv("CC", "clang")
|
|
|
|
cmd := exec.Command("go", "build", "-buildmode=c-shared", "-o", outPath+"/"+soName+".dylib", ".")
|
|
cmd.Dir = goSrc
|
|
cmd.Env = os.Environ()
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdout = os.Stdout
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
fmt.Printf("Failed to build for iOS: %v\n", err)
|
|
return err
|
|
}
|
|
fmt.Println("Build for iOS completed successfully.")
|
|
return nil
|
|
}
|
|
|
|
// BuildLinux compiles the project for Linux.
|
|
func BuildLinux() error {
|
|
fmt.Println("Building for Linux...")
|
|
|
|
outPath += "linux"
|
|
arch := os.Getenv("GOARCH")
|
|
cc := os.Getenv("CC")
|
|
cxx := os.Getenv("CXX")
|
|
|
|
if len(arch) == 0 {
|
|
arch = runtime.GOARCH
|
|
}
|
|
|
|
if len(cc) == 0 {
|
|
cc = "gcc"
|
|
}
|
|
|
|
if len(cxx) != 0 {
|
|
os.Setenv("CXX", cxx)
|
|
}
|
|
|
|
os.Setenv("GOOS", "linux")
|
|
os.Setenv("GOARCH", arch)
|
|
os.Setenv("CGO_ENABLED", "1")
|
|
os.Setenv("CC", cc) //
|
|
|
|
cmd := exec.Command("go", "build", "-buildmode=c-shared", "-trimpath", "-ldflags=-s -w", "-o", outPath+"/"+soName+".so", ".")
|
|
cmd.Dir = goSrc
|
|
cmd.Env = os.Environ()
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdout = os.Stdout
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
fmt.Printf("Failed to build for Linux: %v\n", err)
|
|
return err
|
|
}
|
|
fmt.Println("Build for Linux completed successfully.")
|
|
return nil
|
|
}
|
|
|
|
// BuildWindows compiles the project for Windows.
|
|
func BuildWindows() error {
|
|
fmt.Println("Building for Windows...")
|
|
|
|
outPath += "windows"
|
|
arch := os.Getenv("GOARCH")
|
|
cc := os.Getenv("CC")
|
|
cxx := os.Getenv("CXX")
|
|
|
|
if len(arch) == 0 {
|
|
arch = runtime.GOARCH
|
|
}
|
|
|
|
if len(cc) == 0 {
|
|
cc = "gcc"
|
|
}
|
|
|
|
if len(cxx) != 0 {
|
|
os.Setenv("CXX", cxx)
|
|
}
|
|
|
|
os.Setenv("GOOS", "windows")
|
|
os.Setenv("GOARCH", arch)
|
|
os.Setenv("CGO_ENABLED", "1")
|
|
os.Setenv("CC", cc)
|
|
|
|
cmd := exec.Command("go", "build", "-buildmode=c-shared", "-trimpath", "-ldflags=-s -w", "-o", outPath+"/"+soName+".dll", ".")
|
|
cmd.Dir = goSrc
|
|
cmd.Env = os.Environ()
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdout = os.Stdout
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
fmt.Printf("Failed to build for Windows: %v\n", err)
|
|
return err
|
|
}
|
|
fmt.Println("Build for Windows completed successfully.")
|
|
return nil
|
|
}
|
|
|
|
// buildAndroid builds the Android library for the specified architecture.
|
|
func buildAndroid(aOutPath, arch, apiLevel string) error {
|
|
fmt.Printf("Building for %s...\n", arch)
|
|
|
|
ndkPath := os.Getenv("ANDROID_NDK_HOME")
|
|
osSuffix := ""
|
|
if runtime.GOOS == "windows" {
|
|
osSuffix = ".cmd" //
|
|
}
|
|
|
|
ccBasePath := ndkPath + "/toolchains/llvm/prebuilt/" + runtime.GOOS + "-x86_64/bin/"
|
|
|
|
var cc string
|
|
switch arch {
|
|
case "arm":
|
|
cc = ccBasePath + "armv7a-linux-androideabi" + apiLevel + "-clang" + osSuffix
|
|
case "arm64":
|
|
cc = ccBasePath + "aarch64-linux-android" + apiLevel + "-clang" + osSuffix
|
|
case "386":
|
|
cc = ccBasePath + "i686-linux-android" + apiLevel + "-clang" + osSuffix
|
|
case "amd64":
|
|
cc = ccBasePath + "x86_64-linux-android" + apiLevel + "-clang" + osSuffix
|
|
}
|
|
|
|
env := []string{
|
|
"CGO_ENABLED=1",
|
|
"GOOS=android",
|
|
"GOARCH=" + arch,
|
|
"CC=" + cc,
|
|
}
|
|
cmd := exec.Command("go", "build", "-buildmode=c-shared", "-trimpath", "-ldflags=-s -w", "-o", aOutPath+"/"+arch+"/"+soName+".so", ".")
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Dir = goSrc
|
|
cmd.Env = append(os.Environ(), env...)
|
|
return cmd.Run()
|
|
}
|
|
|