blob: b80d15d93470483651af70e876ac07777a0d3675 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"flag"
"log"
"os"
"go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_llcpp/codegen"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
cpp "go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen_cpp"
)
type flagsDef struct {
cpp.CommonFlags
testBase *string
}
var _ cpp.CodegenOptions = (*flagsDef)(nil)
func (f flagsDef) IncludeBase() string {
return *f.CommonFlags.IncludeBase
}
func (f flagsDef) IncludeStem() string {
return *f.CommonFlags.IncludeStem
}
func (f flagsDef) Header() string {
return *f.CommonFlags.Header
}
var flags = flagsDef{
CommonFlags: cpp.CommonFlags{
Json: flag.String("json", "",
"relative path to the FIDL intermediate representation."),
Header: flag.String("header", "",
"the output path for the generated header."),
Source: flag.String("source", "",
"the output path for the generated C++ implementation."),
IncludeBase: flag.String("include-base", "",
"[optional] the directory relative to which includes will be computed. "+
"If omitted, assumes #include <fidl/library/name/llcpp/fidl.h>"),
IncludeStem: flag.String("include-stem", "llcpp/fidl",
"[optional] the suffix after library path when referencing includes. "+
"Includes will be of the form <my/library/{include-stem}.h>. "),
ClangFormatPath: flag.String("clang-format-path", "",
"path to the clang-format tool."),
},
testBase: flag.String("test-base", "",
"the output path for the generated test base header."),
}
// valid returns true if the parsed flags are valid.
func (f flagsDef) valid() bool {
return *f.Json != "" && f.Header() != "" && *f.Source != "" && *f.testBase != ""
}
func main() {
flag.Parse()
if !flag.Parsed() || !flags.valid() {
flag.PrintDefaults()
os.Exit(1)
}
fidl, err := fidlgen.ReadJSONIr(*flags.Json)
if err != nil {
log.Fatal(err)
}
primaryHeader, err := cpp.CalcPrimaryHeader(flags, fidl.Name.Parts())
if err != nil {
log.Fatal(err)
}
tree := cpp.CompileLL(fidl, cpp.HeaderOptions{
PrimaryHeader: primaryHeader,
IncludeStem: flags.IncludeStem(),
})
generator := codegen.NewGenerator()
if err := generator.GenerateHeader(tree, flags.Header(), *flags.ClangFormatPath); err != nil {
log.Fatalf("Error running header generator: %s", err)
}
if err := generator.GenerateSource(tree, *flags.Source, *flags.ClangFormatPath); err != nil {
log.Fatalf("Error running source generator: %s", err)
}
if err := generator.GenerateTestBase(tree, *flags.testBase, *flags.ClangFormatPath); err != nil {
log.Fatalf("Error running test base generator: %s", err)
}
}