diff options
author | rillig <rillig@pkgsrc.org> | 2016-09-06 20:54:21 +0000 |
---|---|---|
committer | rillig <rillig@pkgsrc.org> | 2016-09-06 20:54:21 +0000 |
commit | c366ec4210c6a7239b3582a3c01d1acba91e23ea (patch) | |
tree | 5109a1fd6e331e0745373556c2a4ae41913f3828 /pkgtools | |
parent | 8e0c156eba2f8b93232a3f1562a3ce859ffb48c5 (diff) | |
download | pkgsrc-c366ec4210c6a7239b3582a3c01d1acba91e23ea.tar.gz |
Allow packages to define their own tools using TOOLS_CREATE.
Suggested by @jperkin for lang/rust.
Diffstat (limited to 'pkgtools')
-rw-r--r-- | pkgtools/pkglint/files/globaldata.go | 38 | ||||
-rw-r--r-- | pkgtools/pkglint/files/mklines.go | 4 | ||||
-rw-r--r-- | pkgtools/pkglint/files/mklines_test.go | 27 | ||||
-rw-r--r-- | pkgtools/pkglint/files/shell.go | 7 | ||||
-rw-r--r-- | pkgtools/pkglint/files/vardefs.go | 59 | ||||
-rw-r--r-- | pkgtools/pkglint/files/vartypecheck.go | 2 |
6 files changed, 88 insertions, 49 deletions
diff --git a/pkgtools/pkglint/files/globaldata.go b/pkgtools/pkglint/files/globaldata.go index 4bf6699bfb6..6a7ae1e8cc8 100644 --- a/pkgtools/pkglint/files/globaldata.go +++ b/pkgtools/pkglint/files/globaldata.go @@ -138,23 +138,7 @@ func (gd *GlobalData) loadTools() { fname := G.globalData.Pkgsrcdir + "/mk/tools/" + basename lines := LoadExistingLines(fname, true) for _, line := range lines { - if m, varname, _, _, _, value, _ := MatchVarassign(line.Text); m { - if varname == "TOOLS_CREATE" && (value == "[" || matches(value, `^?[-\w.]+$`)) { - reg.Register(value) - - } else if m, toolname := match1(varname, `^_TOOLS_VARNAME\.([-\w.]+|\[)$`); m { - reg.RegisterVarname(toolname, value) - - } else if m, toolname := match1(varname, `^(?:TOOLS_PATH|_TOOLS_DEPMETHOD)\.([-\w.]+|\[)$`); m { - reg.Register(toolname) - - } else if m, toolname := match1(varname, `_TOOLS\.(.*)`); m { - reg.Register(toolname) - for _, tool := range splitOnSpace(value) { - reg.Register(tool) - } - } - } + reg.ParseToolLine(line) } } @@ -580,3 +564,23 @@ func (tr *ToolRegistry) Trace() { traceStep("tool %+v", tr.byName[toolname]) } } + +func (tr *ToolRegistry) ParseToolLine(line *Line) { + if m, varname, _, _, _, value, _ := MatchVarassign(line.Text); m { + if varname == "TOOLS_CREATE" && (value == "[" || matches(value, `^?[-\w.]+$`)) { + tr.Register(value) + + } else if m, toolname := match1(varname, `^_TOOLS_VARNAME\.([-\w.]+|\[)$`); m { + tr.RegisterVarname(toolname, value) + + } else if m, toolname := match1(varname, `^(?:TOOLS_PATH|_TOOLS_DEPMETHOD)\.([-\w.]+|\[)$`); m { + tr.Register(toolname) + + } else if m, toolname := match1(varname, `_TOOLS\.(.*)`); m { + tr.Register(toolname) + for _, tool := range splitOnSpace(value) { + tr.Register(tool) + } + } + } +} diff --git a/pkgtools/pkglint/files/mklines.go b/pkgtools/pkglint/files/mklines.go index 2ef80f29ad5..946b4bcbd87 100644 --- a/pkgtools/pkglint/files/mklines.go +++ b/pkgtools/pkglint/files/mklines.go @@ -16,6 +16,7 @@ type MkLines struct { buildDefs map[string]bool // Variables that are registered in BUILD_DEFS, to ensure that all user-defined variables are added to it. plistVars map[string]bool // Variables that are registered in PLIST_VARS, to ensure that all user-defined variables are added to it. tools map[string]bool // Set of tools that are declared to be used. + toolRegistry ToolRegistry // Tools defined in file scope. SeenBsdPrefsMk bool indentation Indentation // Indentation depth of preprocessing directives } @@ -42,6 +43,7 @@ func NewMkLines(lines []*Line) *MkLines { make(map[string]bool), make(map[string]bool), tools, + NewToolRegistry(), false, Indentation{}} } @@ -202,6 +204,8 @@ func (mklines *MkLines) determineDefinedVariables() { defineVar(mkline, osvar) } } + + mklines.toolRegistry.ParseToolLine(mkline.Line) } } diff --git a/pkgtools/pkglint/files/mklines_test.go b/pkgtools/pkglint/files/mklines_test.go index e86fc71e2fc..b4411fd76c3 100644 --- a/pkgtools/pkglint/files/mklines_test.go +++ b/pkgtools/pkglint/files/mklines_test.go @@ -386,3 +386,30 @@ func (s *Suite) Test_MkLines_DetermineUsedVariables__nested(c *check.C) { c.Check(mklines.varuse["outer."], equals, mkline) c.Check(mklines.varuse["outer.*"], equals, mkline) } + +func (s *Suite) Test_MkLines_PrivateTool_Undefined(c *check.C) { + G.globalData.InitVartypes() + s.UseCommandLine(c, "-Wall") + mklines := s.NewMkLines("fname", + mkrcsid, + "", + "\tmd5sum filename") + + mklines.Check() + + c.Check(s.Output(), equals, "WARN: fname:3: Unknown shell command \"md5sum\".\n") +} + +func (s *Suite) Test_MkLines_PrivateTool_Defined(c *check.C) { + G.globalData.InitVartypes() + s.UseCommandLine(c, "-Wall") + mklines := s.NewMkLines("fname", + mkrcsid, + "TOOLS_CREATE+=\tmd5sum", + "", + "\tmd5sum filename") + + mklines.Check() + + c.Check(s.Output(), equals, "") +} diff --git a/pkgtools/pkglint/files/shell.go b/pkgtools/pkglint/files/shell.go index 0ed87fc1598..2401f2ecab0 100644 --- a/pkgtools/pkglint/files/shell.go +++ b/pkgtools/pkglint/files/shell.go @@ -474,12 +474,15 @@ func (scc *SimpleCommandChecker) handleTool() bool { } shellword := scc.strcmd.Name - tool := G.globalData.Tools.byName[shellword] + tool, localTool := G.globalData.Tools.byName[shellword], false + if tool == nil && G.Mk != nil { + tool, localTool = G.Mk.toolRegistry.byName[shellword], true + } if tool == nil { return false } - if !G.Mk.tools[shellword] && !G.Mk.tools["g"+shellword] { + if !localTool && !G.Mk.tools[shellword] && !G.Mk.tools["g"+shellword] { scc.shline.line.Warn1("The %q tool is used but not added to USE_TOOLS.", shellword) } diff --git a/pkgtools/pkglint/files/vardefs.go b/pkgtools/pkglint/files/vardefs.go index a24689c5f4c..da1c8f36c20 100644 --- a/pkgtools/pkglint/files/vardefs.go +++ b/pkgtools/pkglint/files/vardefs.go @@ -17,6 +17,35 @@ import ( // Last synced with mk/defaults/mk.conf revision 1.118 func (gd *GlobalData) InitVartypes() { + + // A package-defined variable may be set in all Makefiles except buildlink3.mk and builtin.mk. + pkg := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "Makefile: set, use; buildlink3.mk, builtin.mk:; Makefile.*, *.mk: default, set, use") + } + + // A package-defined list may be appended to in all Makefiles except buildlink3.mk and builtin.mk. + // Simple assignment (instead of appending) is only allowed in Makefile and Makefile.common. + pkglist := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "Makefile, Makefile.common, options.mk: append, default, set, use; buildlink3.mk, builtin.mk:; *.mk: append, default, use") + } + + // A user-defined or system-defined variable must not be set by any + // package file. It also must not be used in buildlink3.mk and + // builtin.mk files or at load-time, since the system/user preferences + // may not have been loaded when these files are included. + sys := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "buildlink3.mk:; *: use") + } + usr := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "buildlink3.mk:; *: use-loadtime, use") + } + bl3list := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "buildlink3.mk, builtin.mk: append") + } + cmdline := func(varname string, kindOfList KindOfList, checker *BasicType) { + acl(varname, kindOfList, checker, "buildlink3.mk, builtin.mk:; *: use-loadtime, use") + } + usr("ALLOW_VULNERABLE_PACKAGES", lkNone, BtYes) usr("MANINSTALL", lkShell, enum("maninstall catinstall")) usr("MANZ", lkNone, BtYes) @@ -688,7 +717,7 @@ func (gd *GlobalData) InitVartypes() { sys("TOOLS_ALIASES", lkShell, BtFilename) sys("TOOLS_BROKEN", lkShell, BtTool) sys("TOOLS_CMD.*", lkNone, BtPathname) - sys("TOOLS_CREATE", lkShell, BtTool) + acl("TOOLS_CREATE", lkShell, BtTool, "Makefile, Makefile.common, options.mk: append") acl("TOOLS_DEPENDS.*", lkSpace, BtDependencyWithPath, "buildlink3.mk:; Makefile, Makefile.*: set, default; *: use") sys("TOOLS_GNU_MISSING", lkShell, BtTool) sys("TOOLS_NOOP", lkShell, BtTool) @@ -841,31 +870,3 @@ func parseAclEntries(varname string, aclentries string) []AclEntry { } return result } - -// A package-defined variable may be set in all Makefiles except buildlink3.mk and builtin.mk. -func pkg(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "Makefile: set, use; buildlink3.mk, builtin.mk:; Makefile.*, *.mk: default, set, use") -} - -// A package-defined list may be appended to in all Makefiles except buildlink3.mk and builtin.mk. -// Simple assignment (instead of appending) is only allowed in Makefile and Makefile.common. -func pkglist(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "Makefile, Makefile.common, options.mk: append, default, set, use; buildlink3.mk, builtin.mk:; *.mk: append, default, use") -} - -// A user-defined or system-defined variable must not be set by any -// package file. It also must not be used in buildlink3.mk and -// builtin.mk files or at load-time, since the system/user preferences -// may not have been loaded when these files are included. -func sys(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "buildlink3.mk:; *: use") -} -func usr(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "buildlink3.mk:; *: use-loadtime, use") -} -func bl3list(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "buildlink3.mk, builtin.mk: append") -} -func cmdline(varname string, kindOfList KindOfList, checker *BasicType) { - acl(varname, kindOfList, checker, "buildlink3.mk, builtin.mk:; *: use-loadtime, use") -} diff --git a/pkgtools/pkglint/files/vartypecheck.go b/pkgtools/pkglint/files/vartypecheck.go index 16fefc09152..64e81c2625f 100644 --- a/pkgtools/pkglint/files/vartypecheck.go +++ b/pkgtools/pkglint/files/vartypecheck.go @@ -894,7 +894,7 @@ func (cv *VartypeCheck) Tool() { // no warning for package-defined tool definitions } else if m, toolname, tooldep := match2(cv.Value, `^([-\w]+|\[)(?::(\w+))?$`); m { - if G.globalData.Tools.byName[toolname] == nil { + if G.globalData.Tools.byName[toolname] == nil && (G.Mk == nil || G.Mk.toolRegistry.byName[toolname] == nil) { cv.Line.Error1("Unknown tool %q.", toolname) } switch tooldep { |