|
|
|
package builder
|
|
|
|
|
|
|
|
import (
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/tinygo-org/tinygo/compileopts"
|
|
|
|
"github.com/tinygo-org/tinygo/goenv"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Create a job that builds a Darwin libSystem.dylib stub library. This library
|
|
|
|
// contains all the symbols needed so that we can link against it, but it
|
|
|
|
// doesn't contain any real symbol implementations.
|
|
|
|
func makeDarwinLibSystemJob(config *compileopts.Config, tmpdir string) *compileJob {
|
|
|
|
return &compileJob{
|
|
|
|
description: "compile Darwin libSystem.dylib",
|
|
|
|
run: func(job *compileJob) (err error) {
|
|
|
|
arch := strings.Split(config.Triple(), "-")[0]
|
|
|
|
job.result = filepath.Join(tmpdir, "libSystem.dylib")
|
|
|
|
objpath := filepath.Join(tmpdir, "libSystem.o")
|
|
|
|
inpath := filepath.Join(goenv.Get("TINYGOROOT"), "lib/macos-minimal-sdk/src", arch, "libSystem.s")
|
|
|
|
|
|
|
|
// Compile assembly file to object file.
|
|
|
|
flags := []string{
|
|
|
|
"-nostdlib",
|
|
|
|
"--target=" + config.Triple(),
|
|
|
|
"-c",
|
|
|
|
"-o", objpath,
|
|
|
|
inpath,
|
|
|
|
}
|
|
|
|
if config.Options.PrintCommands != nil {
|
|
|
|
config.Options.PrintCommands("clang", flags...)
|
|
|
|
}
|
|
|
|
err = runCCompiler(flags...)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Link object file to dynamic library.
|
|
|
|
platformVersion := strings.TrimPrefix(strings.Split(config.Triple(), "-")[2], "macosx")
|
|
|
|
flags = []string{
|
|
|
|
"-flavor", "darwin",
|
|
|
|
"-demangle",
|
|
|
|
"-dynamic",
|
|
|
|
"-dylib",
|
|
|
|
"-arch", arch,
|
|
|
|
"-platform_version", "macos", platformVersion, platformVersion,
|
|
|
|
"-install_name", "/usr/lib/libSystem.B.dylib",
|
|
|
|
"-o", job.result,
|
|
|
|
objpath,
|
|
|
|
}
|
|
|
|
if config.Options.PrintCommands != nil {
|
|
|
|
config.Options.PrintCommands("ld.lld", flags...)
|
|
|
|
}
|
|
|
|
return link("ld.lld", flags...)
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|