提交 312838ad 编写于 作者: chai2010's avatar chai2010

支持多平台区分源文件

上级 c4a210a3
# 版权 @2019 凹语言 作者。保留所有权利。
import "fmt"
import "runtime"
fn main {
println("你好,凹语言!")
println("你好,凹语言!", runtime.WAOS)
println(add(40, 2))
fmt.Println(1+1)
......
......@@ -69,10 +69,10 @@ func NewApp(opt *Option) *App {
}
}
if p.opt.TargetOS == "" {
p.opt.TargetOS = runtime.GOOS
p.opt.TargetOS = config.WaOS_Walang
}
if p.opt.TargetArch == "" {
p.opt.TargetArch = runtime.GOARCH
p.opt.TargetArch = config.WaArch_Wasm
}
return p
......@@ -238,7 +238,7 @@ func (p *App) AST(filename string) error {
}
func (p *App) SSA(filename string) error {
cfg := config.DefaultConfig()
cfg := p.opt.Config()
prog, err := loader.LoadProgram(cfg, filename)
if err != nil {
return err
......@@ -261,7 +261,7 @@ func (p *App) SSA(filename string) error {
}
func (p *App) CIR(filename string) error {
cfg := config.DefaultConfig()
cfg := p.opt.Config()
prog, err := loader.LoadProgram(cfg, filename)
if err != nil {
return err
......@@ -276,7 +276,7 @@ func (p *App) CIR(filename string) error {
}
func (p *App) LLVM(infile string, outfile string, target string, debug bool) error {
cfg := config.DefaultConfig()
cfg := p.opt.Config()
instat, err := os.Stat(infile)
if err != nil {
......@@ -393,7 +393,7 @@ func (p *App) LLVM(infile string, outfile string, target string, debug bool) err
}
func (p *App) WASM(filename string) ([]byte, error) {
cfg := config.DefaultConfig()
cfg := p.opt.Config()
prog, err := loader.LoadProgram(cfg, filename)
if err != nil {
return nil, err
......
......@@ -5,7 +5,6 @@ package config
import (
"io/fs"
"os"
"runtime"
)
// 字长和指针大小
......@@ -50,14 +49,14 @@ func DefaultConfig() *Config {
if s := os.Getenv("WAARCH"); s != "" {
p.WaArch = s
} else {
p.WaArch = runtime.GOARCH
p.WaArch = WaArch_Wasm
}
}
if p.WaOS == "" {
if s := os.Getenv("WAOS"); s != "" {
p.WaOS = s
} else {
p.WaOS = runtime.GOOS
p.WaOS = WaOS_Walang
}
}
if p.WaRoot == "" {
......
// 版权 @2022 凹语言 作者。保留所有权利。
package config
// 目标平台类型, 可管理后缀名
const (
WaOS_Walang = "walang" // 默认
WaOS_Arduino = "arduino" // Arduino 平台
WaOS_Chrome = "chrome" // Chrome 浏览器
WaOS_Wasi = "wasi" // WASI 接口
)
// 体系结构类型
const (
WaArch_Wasm = "wasm" // wasm 平台
)
......@@ -292,10 +292,8 @@ func (p *_Loader) readDirFiles(fileSystem fs.FS, path string) (filenames []strin
if entry.IsDir() {
continue
}
if strings.HasPrefix(entry.Name(), "_") {
continue
}
if !p.hasExt(entry.Name(), ".go", ".ugo", ".wa") {
if p.isSkipedSouceFile(entry.Name()) {
continue
}
......@@ -362,3 +360,38 @@ func (p *_Loader) getSizes() types.Sizes {
}
}
}
func (p *_Loader) isSkipedSouceFile(filename string) bool {
if strings.HasPrefix(filename, "_") {
return true
}
if !p.hasExt(filename, ".wa", ".wa.go", ".ugo") {
return true
}
if p.cfg.WaOS != "" {
var isTargetFile bool
for _, ext := range []string{".wa", ".wa.go", ".ugo"} {
for _, os := range []string{"walang", "wasi", "arduino", "chrome"} {
if strings.HasSuffix(filename, "_"+os+ext) {
isTargetFile = true
break
}
}
}
if isTargetFile {
var shouildSkip = true
for _, ext := range []string{".wa", ".wa.go", ".ugo"} {
if strings.HasSuffix(filename, "_"+p.cfg.WaOS+ext) {
shouildSkip = false
break
}
}
if shouildSkip {
return true
}
}
}
return false
}
# 版权 @2022 凹语言 作者。保留所有权利。
var WAOS = "arduino"
# 版权 @2022 凹语言 作者。保留所有权利。
var WAOS = "chrome"
# 版权 @2022 凹语言 作者。保留所有权利。
var WAOS = "walang"
# 版权 @2022 凹语言 作者。保留所有权利。
var WAOS = "wasi"
......@@ -34,6 +34,11 @@ func main() {
}()
cliApp.Flags = []cli.Flag{
&cli.StringFlag{
Name: "target",
Usage: "set target os (walang|wasi|arduino|chrome)",
Value: config.WaOS_Walang,
},
&cli.BoolFlag{
Name: "debug",
Aliases: []string{"d"},
......@@ -47,6 +52,13 @@ func main() {
}
cliApp.Before = func(c *cli.Context) error {
switch c.String("target") {
case "wa", "walang", "wasi", "arduino", "chrome":
// OK
default:
fmt.Printf("unknown target: %s\n", c.String("target"))
os.Exit(1)
}
if c.Bool("debug") {
config.SetDebugMode()
}
......@@ -153,9 +165,10 @@ func main() {
Name: "run",
Usage: "compile and run Wa program",
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "html",
Usage: "output html",
&cli.StringFlag{
Name: "target",
Usage: "set target os (walang|wasi|arduino|chrome)",
Value: config.WaOS_Walang,
},
},
Action: func(c *cli.Context) error {
......@@ -210,13 +223,10 @@ func main() {
Usage: "set output file",
Value: "a.out",
},
&cli.BoolFlag{
Name: "html",
Usage: "output html",
},
&cli.StringFlag{
Name: "target",
Usage: "set target (*wa|wasi|arduino)",
Usage: "set target os (walang|wasi|arduino|chrome)",
Value: config.WaOS_Walang,
},
&cli.IntFlag{
Name: "ld-stack-size",
......@@ -384,8 +394,9 @@ func main() {
},
},
{
Name: "test",
Usage: "test packages",
Hidden: true,
Name: "test",
Usage: "test packages",
Action: func(c *cli.Context) error {
fmt.Println("TODO")
return nil
......@@ -405,8 +416,9 @@ func main() {
},
},
{
Name: "doc",
Usage: "show documentation for package or symbol",
Hidden: true,
Name: "doc",
Usage: "show documentation for package or symbol",
Action: func(c *cli.Context) error {
fmt.Println("TODO")
return nil
......@@ -452,7 +464,7 @@ func main() {
cliApp.Run(os.Args)
}
func build_Options(c *cli.Context) *app.Option {
func build_Options(c *cli.Context, isLLVMBackend ...bool) *app.Option {
opt := &app.Option{
Debug: c.Bool("debug"),
Clang: c.String("clang"),
......@@ -460,19 +472,23 @@ func build_Options(c *cli.Context) *app.Option {
LD_StackSize: c.Int("ld-stack-size"),
LD_MaxMemory: c.Int("ld-max-memory"),
}
opt.TargetArch = "wasm"
if len(isLLVMBackend) > 0 && isLLVMBackend[0] {
opt.TargetArch = "native"
}
switch c.String("target") {
case "", "wa":
opt.TargetArch = "wasm"
opt.TargetOS = "wa"
case "wasi":
opt.TargetArch = "wasm"
opt.TargetOS = "wasi"
case "arduino":
opt.TargetArch = "wasm"
opt.TargetOS = "arduino"
case "wa", config.WaOS_Walang:
opt.TargetOS = config.WaOS_Walang
case config.WaOS_Wasi:
opt.TargetOS = config.WaOS_Wasi
case config.WaOS_Arduino:
opt.TargetOS = config.WaOS_Arduino
case config.WaOS_Chrome:
opt.TargetOS = config.WaOS_Chrome
default:
opt.TargetArch = "wasm"
opt.TargetOS = "unknown"
fmt.Printf("unknown target: %s\n", c.String("target"))
os.Exit(1)
}
return opt
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册