prototype
This commit is contained in:
7
internal/target/base_target.go
Normal file
7
internal/target/base_target.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package target
|
||||
|
||||
import "git.gulenok.ru/greenhaze/old_carga/internal/global"
|
||||
|
||||
type BaseTarget interface {
|
||||
CreateBuildProject(config global.ProjectFile) bool
|
||||
}
|
||||
100
internal/target/darwin/darwin_target.go
Normal file
100
internal/target/darwin/darwin_target.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package darwin
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
|
||||
"git.gulenok.ru/greenhaze/old_carga/internal/global"
|
||||
"git.gulenok.ru/greenhaze/old_carga/internal/utils"
|
||||
)
|
||||
|
||||
type DarwinBuildTarget struct {
|
||||
}
|
||||
|
||||
func (d DarwinBuildTarget) CreateBuildProject(config global.ProjectFile) bool {
|
||||
//создаем папку в которой будем проводить все наши изуверства
|
||||
// поскольку я не знаю насколько ниндзя/make дружат с кириллицей, пока что пусть называется build
|
||||
value, err := os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatalln("карга не смогла получить рабочую директорию")
|
||||
}
|
||||
os.Mkdir(path.Join(value, "build"), 0755)
|
||||
//копируем тривиль исходники в build
|
||||
utils.CopyDir("./исх", "./build/src")
|
||||
|
||||
os.Chdir("./build")
|
||||
//качаем бинарник компилятора если оного нет и не забываем удалить забытые скрипты
|
||||
if _, err := os.Stat("./трик"); os.IsNotExist(err) {
|
||||
log.Println("АХТУНГ. Поскольку это дев билд а у меня адекватно не завелся компилятор, сейчас оно качает бинарь с релиза каждый раз")
|
||||
|
||||
cmd := exec.Command("wget", "https://gitflic.ru/project/alekseinedoria/trivil-0/release/c09308df-49c1-4297-8e1c-a41030933720/df79d7c6-fd81-420c-bb42-6f3115dbbc2c/download")
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
cmd = exec.Command("tar", "-zxf", "download")
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
//а вот это в свою очередь уже костыль потому что из релиза забыли убрать билд кеши
|
||||
cmd = exec.Command("rm", "-rf", "./_си")
|
||||
cmd.Stdout = os.Stdout
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
}
|
||||
//собираем Тривиль код в Си
|
||||
cmd := exec.Command("./трик.exe", "-отл-сборка=истина", "-сборка=ложь", "src")
|
||||
cmd.Stdout = os.Stdout
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatalf("сборка триком не удалась %s", err)
|
||||
}
|
||||
|
||||
// внедряем Си
|
||||
log.Println(config.Modules)
|
||||
|
||||
for _, v := range config.Modules {
|
||||
err := utils.CopyFile(fmt.Sprintf("../си/%s", v.CFile), fmt.Sprintf("./_си/%s", v.CFile))
|
||||
if err != nil {
|
||||
log.Fatalf("карга не смогла скопировать Си файл %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
//собираем Makefile
|
||||
files, err := getCFilesInCurrentDir()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
out, err := renderMakefile(Vars{
|
||||
|
||||
FILES: files,
|
||||
RUNTIME: "../runtime",
|
||||
TARGET: "target",
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = os.WriteFile("./_си/Makefile", []byte(out), 0644)
|
||||
if err != nil {
|
||||
log.Fatalln("Карга не смогла записать Makefile")
|
||||
}
|
||||
|
||||
os.Chdir("./_си")
|
||||
// Собираем
|
||||
cmd = exec.Command("make")
|
||||
cmd.Stdout = os.Stdout
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatalf("сборка make не удалась %s", err)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* pushd . &&
|
||||
* cd /home/dmitrys/devel/trivil-project/trivil-0/scripts/rel/_си && clang yunikod.c utf8.c stroki.c vyvod.c fnv.c komstroka.c platforma.c fayily.c str_str.c osh_soobshcheniya.c osnova.c klyuchevye_slova.c lekser.c asd.c asd_pokaz.c slovar__moduli.c slovar__sostoyanie.c slovar__opisaniyi.c imena.c slovar__tcel_tcel.c kontrol_.c semantika.c perevod_imen.c str_log.c imena_opisaniyi.c imena_tipov.c si.c ar.c gen.c parser.c slovar__importy.c kompilyator.c trik.c /home/dmitrys/devel/trivil-project/trivil-0/scripts/rel/runtime/rt_api.c /home/dmitrys/devel/trivil-project/trivil-0/scripts/rel/runtime/rt_sysapi.c /home/dmitrys/devel/trivil-project/trivil-0/scripts/rel/runtime/rt_syscrash_linux.c -lm -rdynamic -I/home/dmitrys/devel/trivil-project/trivil-0/scripts/rel/runtime -o ../трик.exe && popd
|
||||
*/
|
||||
69
internal/target/darwin/template.go
Normal file
69
internal/target/darwin/template.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package darwin
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const makefileTemplate = `# Автогенерируемый Makefile
|
||||
FILES := {{.FILES}}
|
||||
RUNTIME := {{.RUNTIME}}
|
||||
TARGET := {{.TARGET}}
|
||||
|
||||
CC := clang
|
||||
CFLAGS := -I$(RUNTIME) -o3
|
||||
LDFLAGS := -lm -rdynamic
|
||||
|
||||
SRCS := $(FILES) \
|
||||
$(RUNTIME)/rt_api.c \
|
||||
$(RUNTIME)/rt_sysapi.c \
|
||||
$(RUNTIME)/rt_syscrash_linux.c
|
||||
|
||||
OUT := ../$(TARGET).exe
|
||||
|
||||
.PHONY: darwin-build clean
|
||||
|
||||
darwin-build:
|
||||
$(CC) $(SRCS) $(CFLAGS) $(LDFLAGS) -o $(OUT)
|
||||
|
||||
clean:
|
||||
rm -f $(OUT)
|
||||
|
||||
`
|
||||
|
||||
type Vars struct {
|
||||
FILES string
|
||||
RUNTIME string
|
||||
TARGET string
|
||||
}
|
||||
|
||||
func getCFilesInCurrentDir() (string, error) {
|
||||
files, err := ioutil.ReadDir("./_си")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var cFiles []string
|
||||
for _, f := range files {
|
||||
if !f.IsDir() && filepath.Ext(f.Name()) == ".c" {
|
||||
cFiles = append(cFiles, f.Name())
|
||||
}
|
||||
}
|
||||
|
||||
return strings.Join(cFiles, " "), nil
|
||||
}
|
||||
|
||||
func renderMakefile(vars Vars) (string, error) {
|
||||
tmpl, err := template.New("makefile").Parse(makefileTemplate)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
var buf bytes.Buffer
|
||||
if err := tmpl.Execute(&buf, vars); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return buf.String(), nil
|
||||
}
|
||||
Reference in New Issue
Block a user