96 lines
2.8 KiB
Go
96 lines
2.8 KiB
Go
package compiler
|
|
|
|
import "fmt"
|
|
import "git.tebibyte.media/fspl/fspl/generator"
|
|
|
|
// Filetype represents an output filetype.
|
|
type Filetype int; const (
|
|
FiletypeUnknown Filetype = iota
|
|
FiletypeObject
|
|
FiletypeLibrary
|
|
FiletypeAssembly
|
|
FiletypeIR
|
|
FiletypeExecutable
|
|
)
|
|
|
|
// FiletypeFromString returns a filetype based on the given name.
|
|
func FiletypeFromString (ext string) (Filetype, bool) {
|
|
switch ext {
|
|
case "": return FiletypeUnknown, true
|
|
case "obj": return FiletypeObject, true
|
|
case "lib": return FiletypeLibrary, true
|
|
case "asm": return FiletypeAssembly, true
|
|
case "ir": return FiletypeIR, true
|
|
case "exe": return FiletypeExecutable, true
|
|
default: return FiletypeUnknown, false
|
|
}
|
|
}
|
|
|
|
// FiletypeFromExt returns a filetype based on the given filename extension.
|
|
func FiletypeFromExt (target generator.Target, ext string) (Filetype, bool) {
|
|
switch ext {
|
|
case targetObjExt(target): return FiletypeObject, true
|
|
case targetSoExt(target): return FiletypeLibrary, true
|
|
case ".s": return FiletypeAssembly, true
|
|
case ".ll": return FiletypeIR, true
|
|
case targetExeExt(target): return FiletypeExecutable, true
|
|
default: return FiletypeUnknown, false
|
|
}
|
|
}
|
|
|
|
// String returns a string representation of the filetype.
|
|
func (filetype Filetype) String () string {
|
|
switch filetype {
|
|
case FiletypeUnknown: return ""
|
|
case FiletypeObject: return "obj"
|
|
case FiletypeLibrary: return "lib"
|
|
case FiletypeAssembly: return "asm"
|
|
case FiletypeIR: return "ir"
|
|
case FiletypeExecutable: return "exe"
|
|
default: return fmt.Sprintf("Filetype(%d)", filetype)
|
|
}
|
|
}
|
|
|
|
// Ext returns the standard filename extension of the filetype.
|
|
func (filetype Filetype) Ext (target generator.Target) string {
|
|
switch filetype {
|
|
case FiletypeUnknown: return ""
|
|
case FiletypeObject: return targetObjExt(target)
|
|
case FiletypeLibrary: return targetSoExt(target)
|
|
case FiletypeAssembly: return ".s"
|
|
case FiletypeIR: return ".ll"
|
|
case FiletypeExecutable: return targetExeExt(target)
|
|
default: return ""
|
|
}
|
|
}
|
|
|
|
// Extend adds the extension of the filetype onto the specified path.
|
|
func (filetype Filetype) Extend (target generator.Target, path string) string {
|
|
return path + filetype.Ext(target)
|
|
}
|
|
|
|
func targetSoExt (target generator.Target) string {
|
|
// TODO: more research is required here
|
|
switch target.OS {
|
|
case "win32": return ".dll"
|
|
default: return ".so"
|
|
}
|
|
}
|
|
|
|
func targetObjExt (target generator.Target) string {
|
|
// TODO: more research is required here
|
|
switch target.OS {
|
|
case "win32": return ".obj"
|
|
default: return ".o"
|
|
}
|
|
}
|
|
|
|
|
|
func targetExeExt (target generator.Target) string {
|
|
// TODO: more research is required here
|
|
switch target.OS {
|
|
case "win32": return ".exe"
|
|
default: return ""
|
|
}
|
|
}
|