Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor(kclvm-win): rm python39 for kclvm-windows. #385

Merged
merged 5 commits into from
Jan 29, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 9 additions & 15 deletions scripts/build-windows/build.bat
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,26 @@ setlocal

cd %~dp0

go run download-file.go
go run unzip.go

go run gen_pth.go

:: renname
go run rename.go -old="_output\kclvm-windows\python.exe" -new="_output\kclvm-windows\kclvm.exe"

:: install pip
_output\kclvm-windows\kclvm.exe get-pip.py

:: install kclvm
_output\kclvm-windows\kclvm.exe -m pip install kclvm

:: install kclvm-cli
call .\\build_kclvm_cli.bat

:: install kclvm-plugin python module
call .\\build_kclvm_plugin_py.bat

:: Copy KCLVM C API header
call .\\build_kclvm_runtime.bat

:: install hello.k
go run .\copy-file.go --src=..\..\samples\hello.k --dst=.\_output\kclvm-windows\hello.k

:: install tools
go build -o .\_output\kclvm-windows\bin\kcl.exe kcl.go
go build -o .\_output\kclvm-windows\bin\kclvm.exe kclvm.go
go build -o .\_output\kclvm-windows\bin\kcl-plugin.exe kcl-plugin.go
go build -o .\_output\kclvm-windows\bin\kcl-doc.exe kcl-doc.go
go build -o .\_output\kclvm-windows\bin\kcl-test.exe kcl-test.go
go build -o .\_output\kclvm-windows\bin\kcl-lint.exe kcl-lint.go
go build -o .\_output\kclvm-windows\bin\kcl-fmt.exe kcl-fmt.go
go build -o .\_output\kclvm-windows\bin\kcl-plugin.exe kcl-plugin.go
go build -o .\_output\kclvm-windows\bin\kcl-vet.exe kcl-vet.go

:: run hello.k
Expand Down
9 changes: 9 additions & 0 deletions scripts/build-windows/build_kclvm_plugin_py.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
:: Copyright 2021 The KCL Authors. All rights reserved.

setlocal
cd %~dp0

:: install kclvm-plugin python module
cd ..\..\kclvm\plugin
python3 setup.py install_lib --install-dir=..\..\scripts\build-windows\_output\kclvm-windows\lib\site-packages
cd %~dp0
9 changes: 9 additions & 0 deletions scripts/build-windows/build_kclvm_runtime.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
:: Copyright 2021 The KCL Authors. All rights reserved.

setlocal
cd %~dp0

:: Copy KCLVM C API header
cd ..\..\kclvm\runtime
go run .\copy-file.go --src=src\_kclvm.h --dst=..\..\scripts\build-windows\_output\kclvm-windows\include\_kclvm.h
cd %~dp0
95 changes: 63 additions & 32 deletions scripts/build-windows/kcl-doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,85 @@
package main

import (
"fmt"
"os"
"os/exec"
"path/filepath"
"syscall"
"unsafe"
)

func main() {
// kclvm -m kclvm ...
// python3 -m kclvm ...

var args []string
args = append(args, os.Args[0])
args = append(args, "-m", "kclvm.tools.docs")
args = append(args, "/C", "python3", "-m", "kclvm.tools.docs")
args = append(args, os.Args[1:]...)

os.Exit(Py_Main(args))
}

var (
python39_dll = syscall.NewLazyDLL(findKclvm_dllPath())
proc_Py_Main = python39_dll.NewProc("Py_Main")
)

// int Py_Main(int argc, wchar_t **argv)
func Py_Main(args []string) int {
c_args := make([]*uint16, len(args)+1)
for i, s := range args {
c_args[i] = syscall.StringToUTF16Ptr(s)
inputPath, err := os.Executable()
if err != nil {
fmt.Println("Input path does not exist")
zong-zhe marked this conversation as resolved.
Show resolved Hide resolved
os.Exit(1)
}
kclvm_install_dir_bin := filepath.Dir(inputPath)
Install_Kclvm(kclvm_install_dir_bin)
kclvm_install_dir := filepath.Dir(kclvm_install_dir_bin)

cmd := exec.Command("cmd", args...)

Set_Env(kclvm_install_dir, cmd)

cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout

err = cmd.Run()
if err != nil {
fmt.Println("exec failed:", err)
os.Exit(1)
}
ret, _, _ := proc_Py_Main.Call(uintptr(len(args)), uintptr(unsafe.Pointer(&c_args[0])))
return int(ret)
return 0
}

func findKclvm_dllPath() string {
kclvmName := "python39.dll"
func Install_Kclvm(installed_path string) {
// Check if Python3 is installed
cmd := exec.Command("cmd", "/C", "where python3")
_, err := cmd.Output()
if err != nil {
fmt.Println("Python3 is not installed, details: ", err)
zong-zhe marked this conversation as resolved.
Show resolved Hide resolved
os.Exit(1)
}

// Check if "installed" file exists
outputPath := filepath.Join(installed_path, "kclvm_installed")
if _, err := os.Stat(outputPath); err == nil {
return
}

// Install kclvm module using pip
cmd = exec.Command("cmd", "/C", "python3", "-m", "pip", "install", "kclvm")

if exePath, _ := os.Executable(); exePath != "" {
exeDir := filepath.Join(exePath, "..", "..")
if fi, _ := os.Stat(filepath.Join(exeDir, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(exeDir, kclvmName)
}
err = cmd.Run()
if err != nil {
fmt.Println("Pip install kclvm falied ", err)
os.Exit(1)
}
if wd, _ := os.Getwd(); wd != "" {
if fi, _ := os.Stat(filepath.Join(wd, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(wd, kclvmName)
}
wd = filepath.Join(wd, "_output/kclvm-windows")
if fi, _ := os.Stat(filepath.Join(wd, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(wd, kclvmName)
}

// Create "installed" file
f, err := os.Create(outputPath)
if err != nil {
fmt.Printf("Error creating file: %s\n", err)
os.Exit(1)
}
defer f.Close()
}

func Set_Env(kclvm_install_dir string, cmd *exec.Cmd) {
bin_path := filepath.Join(kclvm_install_dir, "bin")
site_packages_path := filepath.Join(kclvm_install_dir, "lib", "site-packages")

return kclvmName
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "KCLVM_CLI_BIN_PATH="+bin_path)
cmd.Env = append(cmd.Env, "PYTHONPATH="+site_packages_path)
}
95 changes: 63 additions & 32 deletions scripts/build-windows/kcl-fmt.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,85 @@
package main

import (
"fmt"
"os"
"os/exec"
"path/filepath"
"syscall"
"unsafe"
)

func main() {
// kclvm -m kclvm ...
// python3 -m kclvm ...

var args []string
args = append(args, os.Args[0])
args = append(args, "-m", "kclvm.tools.format")
args = append(args, "/C", "python3", "-m", "kclvm.tools.format")
args = append(args, os.Args[1:]...)

os.Exit(Py_Main(args))
}

var (
python39_dll = syscall.NewLazyDLL(findKclvm_dllPath())
proc_Py_Main = python39_dll.NewProc("Py_Main")
)

// int Py_Main(int argc, wchar_t **argv)
func Py_Main(args []string) int {
c_args := make([]*uint16, len(args)+1)
for i, s := range args {
c_args[i] = syscall.StringToUTF16Ptr(s)
inputPath, err := os.Executable()
if err != nil {
fmt.Println("Input path does not exist")
os.Exit(1)
}
kclvm_install_dir_bin := filepath.Dir(inputPath)
Install_Kclvm(kclvm_install_dir_bin)
kclvm_install_dir := filepath.Dir(kclvm_install_dir_bin)

cmd := exec.Command("cmd", args...)

Set_Env(kclvm_install_dir, cmd)

cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout

err = cmd.Run()
if err != nil {
fmt.Println("exec failed:", err)
os.Exit(1)
}
ret, _, _ := proc_Py_Main.Call(uintptr(len(args)), uintptr(unsafe.Pointer(&c_args[0])))
return int(ret)
return 0
}

func findKclvm_dllPath() string {
kclvmName := "python39.dll"
func Install_Kclvm(installed_path string) {
// Check if Python3 is installed
cmd := exec.Command("cmd", "/C", "where python3")
_, err := cmd.Output()
if err != nil {
fmt.Println("Python3 is not installed, details: ", err)
zong-zhe marked this conversation as resolved.
Show resolved Hide resolved
os.Exit(1)
}

// Check if "installed" file exists
outputPath := filepath.Join(installed_path, "kclvm_installed")
if _, err := os.Stat(outputPath); err == nil {
return
}

// Install kclvm module using pip
cmd = exec.Command("cmd", "/C", "python3", "-m", "pip", "install", "kclvm")

if exePath, _ := os.Executable(); exePath != "" {
exeDir := filepath.Join(exePath, "..", "..")
if fi, _ := os.Stat(filepath.Join(exeDir, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(exeDir, kclvmName)
}
err = cmd.Run()
if err != nil {
fmt.Println("Pip install kclvm falied ", err)
os.Exit(1)
}
if wd, _ := os.Getwd(); wd != "" {
if fi, _ := os.Stat(filepath.Join(wd, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(wd, kclvmName)
}
wd = filepath.Join(wd, "_output/kclvm-windows")
if fi, _ := os.Stat(filepath.Join(wd, kclvmName)); fi != nil && !fi.IsDir() {
return filepath.Join(wd, kclvmName)
}

// Create "installed" file
f, err := os.Create(outputPath)
if err != nil {
fmt.Printf("Error creating file: %s\n", err)
os.Exit(1)
}
defer f.Close()
}

func Set_Env(kclvm_install_dir string, cmd *exec.Cmd) {
bin_path := filepath.Join(kclvm_install_dir, "bin")
site_packages_path := filepath.Join(kclvm_install_dir, "lib", "site-packages")

return kclvmName
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "KCLVM_CLI_BIN_PATH="+bin_path)
cmd.Env = append(cmd.Env, "PYTHONPATH="+site_packages_path)
}
Loading