1
0
mirror of https://github.com/sjwhitworth/golearn.git synced 2025-04-26 13:49:14 +08:00
golearn/ext/make.go
2014-07-02 22:44:46 +01:00

135 lines
2.7 KiB
Go

package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"path/filepath"
"runtime"
)
var (
cmd_cc = flag.String("CC", "gcc", "C compiler, support gcc and clang")
cmd_cxx = flag.String("CXX", "g++", "C++ compiler, support g++ and clang++")
cmd_make = flag.String("MAKE", "make", "support GNU make")
)
func main() {
flag.Parse()
fmt.Println("CC: " + *cmd_cc)
fmt.Println("CXX: " + *cmd_cxx)
fmt.Println("Make: " + *cmd_make)
cmd_rm := "rm"
switch runtime.GOOS {
case "darwin":
case "linux":
case "windows":
cmd_rm = "del"
}
os.Setenv("CC", *cmd_cc)
os.Setenv("CXX", *cmd_cxx)
os.Setenv("RM", cmd_rm)
log.Println("Compiling")
cmd := exec.Command(*cmd_make, "-C", "liblinear_src")
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
log.Println(err.Error())
return
}
os.Mkdir("lib", os.ModeDir | 0777)
log.Println("Installing libs")
if runtime.GOOS == "windows" {
err = copyFile("liblinear_src/linear.dll", "lib/linear.dll")
if err != nil {
log.Println(err.Error())
return
}
} else {
err = copyFile("liblinear_src/liblinear.so", "lib/liblinear.so")
if err != nil {
log.Println(err.Error())
return
}
}
log.Println("Cleaning")
exec.Command(*cmd_make, "-C", "liblinear_src", "clean").Run()
lib_path, err := filepath.Abs("lib")
var target_envir string
switch runtime.GOOS {
case "darwin":
target_envir = "DYLD_LIBRARY_PATH"
case "linux":
target_envir = "LD_LIBRARY_PATH"
case "windows":
target_envir = "PATH"
}
fmt.Println("IMPORTANT:")
fmt.Println("Add \"" + lib_path + "\" to your " + target_envir + " environment manually")
}
func copyFile(src, dst string) error {
sfi, err := os.Stat(src)
if err != nil {
return err
}
if sfi.Mode()&os.ModeType != 0 {
log.Fatalf("mirrorFile can't deal with non-regular file %s", src)
}
dfi, err := os.Stat(dst)
if err == nil &&
isExecMode(sfi.Mode()) == isExecMode(dfi.Mode()) &&
(dfi.Mode()&os.ModeType == 0) &&
dfi.Size() == sfi.Size() &&
dfi.ModTime().Unix() == sfi.ModTime().Unix() {
// Seems to not be modified.
return nil
}
dstDir := filepath.Dir(dst)
if err := os.MkdirAll(dstDir, 0755); err != nil {
return err
}
df, err := os.Create(dst)
if err != nil {
return err
}
sf, err := os.Open(src)
if err != nil {
return err
}
defer sf.Close()
n, err := io.Copy(df, sf)
if err == nil && n != sfi.Size() {
err = fmt.Errorf("copied wrong size for %s -> %s: copied %d; want %d", src, dst, n, sfi.Size())
}
cerr := df.Close()
if err == nil {
err = cerr
}
if err == nil {
err = os.Chmod(dst, sfi.Mode())
}
if err == nil {
err = os.Chtimes(dst, sfi.ModTime(), sfi.ModTime())
}
return err
}
func isExecMode(mode os.FileMode) bool {
return (mode & 0111) != 0
}