From f2317d0ce764c5c0282694875e44c6a7c6240994 Mon Sep 17 00:00:00 2001 From: Dietrich Epp Date: Tue, 22 Mar 2022 18:43:47 -0400 Subject: [PATCH] Create build rules for generated data Add flags to the generator code to specify the location of input and output files. --- WORKSPACE | 13 +++++++++++++ bazel/BUILD.bazel | 36 ++++++++++++++++++++++++++++++++++++ bazel/copts.bzl | 40 ++++++++++++++++++++++++++++++++++++++++ charmap/BUILD.bazel | 33 +++++++++++++++++++++++++++++++++ gen/BUILD.bazel | 1 + gen/data.go | 9 +++++---- gen/main.go | 38 +++++++++++++++++++++++++++----------- gen/rez.go | 4 +++- gen/scriptmap.go | 7 +++++-- scripts/BUILD.bazel | 9 +++++++++ src/.gitignore | 3 --- src/BUILD.bazel | 26 ++++++++++++++++++++++++++ 12 files changed, 198 insertions(+), 21 deletions(-) create mode 100644 bazel/BUILD.bazel create mode 100644 bazel/copts.bzl create mode 100644 charmap/BUILD.bazel create mode 100644 scripts/BUILD.bazel delete mode 100644 src/.gitignore create mode 100644 src/BUILD.bazel diff --git a/WORKSPACE b/WORKSPACE index 105a663..13ca017 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -2,6 +2,19 @@ workspace(name = "syncfiles") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "bazel_skylib", + sha256 = "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + ], +) + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() + http_archive( name = "io_bazel_rules_go", sha256 = "f2dcd210c7095febe54b804bb1cd3a58fe8435a909db2ec04e31542631cf715c", diff --git a/bazel/BUILD.bazel b/bazel/BUILD.bazel new file mode 100644 index 0000000..39efdfa --- /dev/null +++ b/bazel/BUILD.bazel @@ -0,0 +1,36 @@ +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") + +package( + default_visibility = ["//visibility:public"], +) + +string_flag( + name = "warnings", + build_setting_default = "on", + values = [ + "off", + "on", + "error", + ], +) + +config_setting( + name = "warnings_off", + flag_values = { + ":warnings": "off", + }, +) + +config_setting( + name = "warnings_on", + flag_values = { + ":warnings": "on", + }, +) + +config_setting( + name = "warnings_error", + flag_values = { + ":warnings": "error", + }, +) diff --git a/bazel/copts.bzl b/bazel/copts.bzl new file mode 100644 index 0000000..a37638f --- /dev/null +++ b/bazel/copts.bzl @@ -0,0 +1,40 @@ +# Bazel + GCC, +# Default: +# -U_FORTIFY_SOURCE +# -Wall +# -Wunused-but-set-parameter +# -Wno-free-nonheap-object +# -fno-omit-frame-pointer +# With -c dbg, adds: +# -g +# With -c opt, adds: +# -g0 -O2 + +# Base C options +COPTS_BASE = [ + "-std=c90", +] + +_COPTS_WARNING = [ + "-Wall", + "-Wextra", + "-Wpointer-arith", + "-Wwrite-strings", + "-Wmissing-prototypes", + "-Wdouble-promotion", + "-Werror=implicit-function-declaration", + "-Winit-self", + "-Wstrict-prototypes", + "-Wno-format-zero-length", +] + +# Internal C compilation options. Use this by default for all C targets in the +# repo. +COPTS = ( + COPTS_BASE + + select({ + "//bazel:warnings_off": [], + "//bazel:warnings_on": _COPTS_WARNING, + "//bazel:warnings_error": _COPTS_WARNING + ["-Werror"], + }) +) diff --git a/charmap/BUILD.bazel b/charmap/BUILD.bazel new file mode 100644 index 0000000..42722ef --- /dev/null +++ b/charmap/BUILD.bazel @@ -0,0 +1,33 @@ +filegroup( + name = "data", + srcs = [ + "ARABIC.TXT", + "CELTIC.TXT", + "CENTEURO.TXT", + "CHINSIMP.TXT", + "CHINTRAD.TXT", + "CORPCHAR.TXT", + "CROATIAN.TXT", + "CYRILLIC.TXT", + "DEVANAGA.TXT", + "DINGBATS.TXT", + "FARSI.TXT", + "GAELIC.TXT", + "GREEK.TXT", + "GUJARATI.TXT", + "GURMUKHI.TXT", + "HEBREW.TXT", + "ICELAND.TXT", + "INUIT.TXT", + "JAPANESE.TXT", + "KEYBOARD.TXT", + "KOREAN.TXT", + "ROMAN.TXT", + "ROMANIAN.TXT", + "SYMBOL.TXT", + "THAI.TXT", + "TURKISH.TXT", + "UKRAINE.TXT", + ], + visibility = ["//visibility:public"], +) diff --git a/gen/BUILD.bazel b/gen/BUILD.bazel index 122b92c..c74aa10 100644 --- a/gen/BUILD.bazel +++ b/gen/BUILD.bazel @@ -8,6 +8,7 @@ go_binary( "rez.go", "scriptmap.go", ], + visibility = ["//visibility:public"], deps = [ "//gen/charmap", "//gen/table", diff --git a/gen/data.go b/gen/data.go index e05297a..fcbf05c 100644 --- a/gen/data.go +++ b/gen/data.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "os" + "path/filepath" "regexp" "strconv" "strings" @@ -197,15 +198,15 @@ type scriptdata struct { charmaps []charmapinfo } -func readData() (d scriptdata, err error) { - d.scripts, err = readConsts("scripts/script.csv") +func readData(srcdir string) (d scriptdata, err error) { + d.scripts, err = readConsts(filepath.Join(srcdir, "scripts/script.csv")) if err != nil { return d, err } - d.regions, err = readConsts("scripts/region.csv") + d.regions, err = readConsts(filepath.Join(srcdir, "scripts/region.csv")) if err != nil { return d, err } - d.charmaps, err = readCharmaps("scripts/charmap.csv", d.scripts.names, d.regions.names) + d.charmaps, err = readCharmaps(filepath.Join(srcdir, "scripts/charmap.csv"), d.scripts.names, d.regions.names) return } diff --git a/gen/main.go b/gen/main.go index 545d6c9..2f7010b 100644 --- a/gen/main.go +++ b/gen/main.go @@ -15,7 +15,16 @@ import ( const header = "/* This file is automatically generated. */\n" +var ( + flagDest string + flagSrc string + flagQuiet bool +) + func getSrcdir() (string, error) { + if flagSrc != "" { + return flagSrc, nil + } exe, err := os.Executable() if err != nil { return "", err @@ -28,12 +37,13 @@ func mainE() error { if err != nil { return fmt.Errorf("could not find source dir: %v", err) } - if err := os.Chdir(srcdir); err != nil { - return err + destdir := flagDest + if destdir == "" { + destdir = filepath.Join(srcdir, "src") } // Read metadata. - d, err := readData() + d, err := readData(srcdir) if err != nil { return err } @@ -45,23 +55,26 @@ func mainE() error { if c.file == "" { continue } - cm, err := charmap.ReadFile(filepath.Join("charmap", c.file)) + cm, err := charmap.ReadFile(filepath.Join(srcdir, "charmap", c.file)) if err != nil { return err } t, err := table.Create(cm) if err != nil { if e, ok := err.(*table.UnsupportedError); ok { - fmt.Fprintf(os.Stderr, "Warning: unsupported charmap %q: %s\n", c.file, e.Message) + if !flagQuiet { + fmt.Fprintf(os.Stderr, "Warning: unsupported charmap %q: %s\n", c.file, e.Message) + } continue } - fmt.Fprintf(os.Stderr, "Error: %s: %v", c.file, err) - os.Exit(1) + return fmt.Errorf("%s: %v", c.file, err) } data := t.Data() name := "charmap_" + strings.ToLower(strings.TrimSuffix(c.file, ".TXT")) + ".dat" - fpath := filepath.Join("src", name) - fmt.Fprintln(os.Stderr, "Writing:", fpath) + fpath := filepath.Join(destdir, name) + if !flagQuiet { + fmt.Fprintln(os.Stderr, "Writing:", fpath) + } if err := ioutil.WriteFile(fpath, data, 0666); err != nil { return err } @@ -74,16 +87,19 @@ func mainE() error { // Write generated output. m := genMap(&d) - if err := writeMap(&d, m, "src/getcharmap.c"); err != nil { + if err := writeMap(&d, m, filepath.Join(destdir, "charmap.c")); err != nil { return err } - if err := writeRez(&d, cms, "src/charmaps.r"); err != nil { + if err := writeRez(&d, cms, filepath.Join(destdir, "charmap.r")); err != nil { return err } return nil } func main() { + flag.StringVar(&flagDest, "dest", "", "output directory") + flag.StringVar(&flagSrc, "src", "", "source directory") + flag.BoolVar(&flagQuiet, "quiet", false, "only output error messages") flag.Parse() if args := flag.Args(); len(args) != 0 { fmt.Fprintf(os.Stderr, "Error: unexpected argument: %q\n", args[0]) diff --git a/gen/rez.go b/gen/rez.go index b1e706c..28537d6 100644 --- a/gen/rez.go +++ b/gen/rez.go @@ -42,7 +42,9 @@ func constStrings(c *constmap) []string { } func writeRez(d *scriptdata, charmaps []string, filename string) error { - fmt.Fprintln(os.Stderr, "Writing:", filename) + if !flagQuiet { + fmt.Fprintln(os.Stderr, "Writing:", filename) + } fp, err := os.Create(filename) if err != nil { return err diff --git a/gen/scriptmap.go b/gen/scriptmap.go index b44c545..488b8b3 100644 --- a/gen/scriptmap.go +++ b/gen/scriptmap.go @@ -73,7 +73,9 @@ func genMap(d *scriptdata) []*scriptmap { // writeMap writes out a C function that returns the correct character map for a // given script and region. func writeMap(d *scriptdata, m []*scriptmap, filename string) error { - fmt.Fprintln(os.Stderr, "Writing:", filename) + if !flagQuiet { + fmt.Fprintln(os.Stderr, "Writing:", filename) + } fp, err := os.Create(filename) if err != nil { @@ -84,7 +86,8 @@ func writeMap(d *scriptdata, m []*scriptmap, filename string) error { w.WriteString(header) w.WriteString( - "int GetCharmap(int script, int region) {\n" + + "#include \"convert.h\"\n" + + "int GetCharmap(int script, int region) {\n" + "switch (script) {\n") for _, s := range m { fmt.Fprintf(w, "case %d: /* %s */\n", s.script, d.scripts.values[s.script]) diff --git a/scripts/BUILD.bazel b/scripts/BUILD.bazel new file mode 100644 index 0000000..4ce42b5 --- /dev/null +++ b/scripts/BUILD.bazel @@ -0,0 +1,9 @@ +filegroup( + name = "data", + srcs = [ + "charmap.csv", + "region.csv", + "script.csv", + ], + visibility = ["//visibility:public"], +) diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 1282dca..0000000 --- a/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/getcharmap.c -/charmaps.r -/*.dat diff --git a/src/BUILD.bazel b/src/BUILD.bazel new file mode 100644 index 0000000..4261ca4 --- /dev/null +++ b/src/BUILD.bazel @@ -0,0 +1,26 @@ +genrule( + name = "data", + srcs = [ + "//charmap:data", + "//scripts:data", + ], + outs = [ + "charmap.c", + "charmap.r", + "charmap_roman.dat", + "charmap_turkish.dat", + "charmap_croatian.dat", + "charmap_iceland.dat", + "charmap_romanian.dat", + "charmap_celtic.dat", + "charmap_gaelic.dat", + "charmap_greek.dat", + "charmap_cyrillic.dat", + "charmap_inuit.dat", + "charmap_centeuro.dat", + ], + cmd = "$(execpath //gen:macscript) -dest=$(RULEDIR) -src=. -quiet", + tools = [ + "//gen:macscript", + ], +)