Add CLI file feature
This commit is contained in:
parent
8e052269c9
commit
37fa2ad7fb
6 changed files with 35 additions and 18 deletions
|
|
@ -58,6 +58,8 @@ https://github.com/nimterop/nimterop/compare/v0.4.4...v0.5.0
|
||||||
|
|
||||||
- `toast` also includes `--typeMap | -T` to map C types to another type. E.g. `--typeMap:GLint64=int64` generates a wrapper where all instances of `GLint64` are remapped to the Nim type `int64` and `GLint64` is not defined. (since v0.5.2)
|
- `toast` also includes `--typeMap | -T` to map C types to another type. E.g. `--typeMap:GLint64=int64` generates a wrapper where all instances of `GLint64` are remapped to the Nim type `int64` and `GLint64` is not defined. (since v0.5.2)
|
||||||
|
|
||||||
|
- CLI flags can now be specified one or more per line in a file and path provided to `toast`. They will be expanded in place. [#196][i196] (since v0.5.3)
|
||||||
|
|
||||||
- Nimterop is now able to detect Nim configuration of projects and can better handle cases where defaults such as `nimcacheDir` or `nimblePath` are overridden. This especially enables better interop with workflows that do not depend on Nimble. [#151][i151] [#153][i153]
|
- Nimterop is now able to detect Nim configuration of projects and can better handle cases where defaults such as `nimcacheDir` or `nimblePath` are overridden. This especially enables better interop with workflows that do not depend on Nimble. [#151][i151] [#153][i153]
|
||||||
|
|
||||||
- Nimterop defaults to `cmake`, followed by `autoconf` for building libraries with `getHeader()`. It is now possible to change the order of discovery with the `buildType` value. [#200][i200]
|
- Nimterop defaults to `cmake`, followed by `autoconf` for building libraries with `getHeader()`. It is now possible to change the order of discovery with the `buildType` value. [#200][i200]
|
||||||
|
|
@ -78,5 +80,6 @@ https://github.com/nimterop/nimterop/compare/v0.4.4...v0.5.0
|
||||||
[i174]: https://github.com/nimterop/nimterop/issues/174
|
[i174]: https://github.com/nimterop/nimterop/issues/174
|
||||||
[i176]: https://github.com/nimterop/nimterop/issues/176
|
[i176]: https://github.com/nimterop/nimterop/issues/176
|
||||||
[i181]: https://github.com/nimterop/nimterop/issues/181
|
[i181]: https://github.com/nimterop/nimterop/issues/181
|
||||||
|
[i196]: https://github.com/nimterop/nimterop/issues/196
|
||||||
[i197]: https://github.com/nimterop/nimterop/issues/197
|
[i197]: https://github.com/nimterop/nimterop/issues/197
|
||||||
[i200]: https://github.com/nimterop/nimterop/issues/200
|
[i200]: https://github.com/nimterop/nimterop/issues/200
|
||||||
|
|
@ -195,14 +195,14 @@ Nimterop also provides a [docs](https://nimterop.github.io/nimterop/docs.html) A
|
||||||
|
|
||||||
### Command line API
|
### Command line API
|
||||||
|
|
||||||
The `toast` binary can also be used directly on the CLI, similar to `c2nim`. The `cPlugin()` interface
|
The `toast` binary can also be used directly on the CLI, similar to `c2nim`. These flags can be specified on the command line or via a file, one or more flags per line, and the path provided to `toast` instead, or a combination. The file contents will be expanded in place.
|
||||||
|
|
||||||
Note: unlike the wrapper API, the `-p | --preprocess` flag is not enabled by default but is *highly* recommended.
|
Note: unlike the wrapper API, the `-p | --preprocess` flag is not enabled by default but is *highly* recommended.
|
||||||
|
|
||||||
```
|
```
|
||||||
> toast -h
|
> toast -h
|
||||||
Usage:
|
Usage:
|
||||||
main [optional-params] C/C++ source/header
|
main [optional-params] C/C++ source/header(s) and command line file(s)
|
||||||
Options:
|
Options:
|
||||||
-h, --help print this cligen-erated help
|
-h, --help print this cligen-erated help
|
||||||
--help-syntax advanced: prepend,plurals,..
|
--help-syntax advanced: prepend,plurals,..
|
||||||
|
|
|
||||||
|
|
@ -59,8 +59,8 @@ task test, "Test":
|
||||||
execTest "tests/tnimterop_c.nim", "-d:FLAGS=\"-f:ast2 -H\""
|
execTest "tests/tnimterop_c.nim", "-d:FLAGS=\"-f:ast2 -H\""
|
||||||
|
|
||||||
execCmd "nim cpp --hints:off -f -r tests/tnimterop_cpp.nim"
|
execCmd "nim cpp --hints:off -f -r tests/tnimterop_cpp.nim"
|
||||||
execCmd "./nimterop/toast -pnk -E=_ tests/include/toast.h"
|
execCmd "./nimterop/toast tests/toast.cfg tests/include/toast.h"
|
||||||
execCmd "./nimterop/toast -pnk -E=_ -f:ast2 tests/include/toast.h"
|
execCmd "./nimterop/toast tests/toast.cfg -f:ast2 tests/include/toast.h"
|
||||||
|
|
||||||
execTest "tests/tpcre.nim"
|
execTest "tests/tpcre.nim"
|
||||||
execTest "tests/tpcre.nim", "-d:FLAGS=\"-f:ast2\""
|
execTest "tests/tpcre.nim", "-d:FLAGS=\"-f:ast2\""
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ proc newConstDef(gState: State, node: TSNode, fname = "", fval = ""): PNode =
|
||||||
else:
|
else:
|
||||||
gecho &"# const '{origname}' is duplicate, skipped"
|
gecho &"# const '{origname}' is duplicate, skipped"
|
||||||
else:
|
else:
|
||||||
gecho &"# const '{origname}' has invalid value '{val}'"
|
gecho &"# const '{origname}' has unsupported value '{val}'"
|
||||||
gState.skippedSyms.incl origname
|
gState.skippedSyms.incl origname
|
||||||
|
|
||||||
proc addConst(gState: State, node: TSNode) =
|
proc addConst(gState: State, node: TSNode) =
|
||||||
|
|
@ -1736,19 +1736,9 @@ proc setupPragmas(gState: State, root: TSNode, fullpath: string) =
|
||||||
# Add `{.experimental: "codeReordering".} for #206
|
# Add `{.experimental: "codeReordering".} for #206
|
||||||
gState.pragmaSection.add gState.newPragma(root, "experimental", newStrNode(nkStrLit, "codeReordering"))
|
gState.pragmaSection.add gState.newPragma(root, "experimental", newStrNode(nkStrLit, "codeReordering"))
|
||||||
|
|
||||||
proc printNimHeader*(gState: State) =
|
|
||||||
# Top level output with context info
|
|
||||||
gecho """# Generated at $1
|
|
||||||
# Command line:
|
|
||||||
# $2 $3
|
|
||||||
|
|
||||||
{.hint[ConvFromXtoItselfNotNeeded]: off.}
|
|
||||||
|
|
||||||
import nimterop/types
|
|
||||||
""" % [$now(), getAppFilename(), commandLineParams().join(" ")]
|
|
||||||
|
|
||||||
proc initNim*(gState: State) =
|
proc initNim*(gState: State) =
|
||||||
# Initialize for parseNim() one time
|
# Initialize for parseNim() one time
|
||||||
|
gecho "import nimterop/types\n"
|
||||||
|
|
||||||
# Track identifiers already rendered and corresponding PNodes
|
# Track identifiers already rendered and corresponding PNodes
|
||||||
gState.identifiers = newTable[string, string]()
|
gState.identifiers = newTable[string, string]()
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,6 @@ proc main(
|
||||||
elif source.nBl:
|
elif source.nBl:
|
||||||
# Print source after preprocess or Nim output
|
# Print source after preprocess or Nim output
|
||||||
if gState.pnim:
|
if gState.pnim:
|
||||||
gState.printNimHeader()
|
|
||||||
gState.initNim()
|
gState.initNim()
|
||||||
for src in source:
|
for src in source:
|
||||||
gState.process(src.expandSymlinkAbs(), astTable)
|
gState.process(src.expandSymlinkAbs(), astTable)
|
||||||
|
|
@ -199,6 +198,29 @@ proc main(
|
||||||
if check and output.len == 0:
|
if check and output.len == 0:
|
||||||
stdout.write outputFile.readFile()
|
stdout.write outputFile.readFile()
|
||||||
|
|
||||||
|
proc mergeParams(cmdNames: seq[string], cmdLine = commandLineParams()): seq[string] =
|
||||||
|
# Load command-line params from `source` if it is a .cfg file
|
||||||
|
if cmdNames.len != 0:
|
||||||
|
# https://github.com/c-blake/cligen/issues/149
|
||||||
|
for param in cmdLine:
|
||||||
|
if param.fileExists() and param.splitFile().ext == ".cfg":
|
||||||
|
echo &"# Loading flags from '{param}'"
|
||||||
|
for line in param.readFile().splitLines():
|
||||||
|
let
|
||||||
|
line = line.strip()
|
||||||
|
if line.len > 1 and line[0] != '#':
|
||||||
|
result.add line.parseCmdLine()
|
||||||
|
else:
|
||||||
|
result.add param
|
||||||
|
|
||||||
|
if result.len != 0 and "-h" notin result and "--help" notin result:
|
||||||
|
echo &"""# Generated @ {$now()}
|
||||||
|
# Command line:
|
||||||
|
# {getAppFilename()} {result.join(" ")}
|
||||||
|
"""
|
||||||
|
else:
|
||||||
|
result = cmdLine
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
# Setup cligen command line help and short flags
|
# Setup cligen command line help and short flags
|
||||||
import cligen
|
import cligen
|
||||||
|
|
@ -223,7 +245,7 @@ when isMainModule:
|
||||||
"preprocess": "run preprocessor on header",
|
"preprocess": "run preprocessor on header",
|
||||||
"recurse": "process #include files",
|
"recurse": "process #include files",
|
||||||
"replace": "replace X with Y in identifiers, X1=Y1,X2=Y2, @X for regex",
|
"replace": "replace X with Y in identifiers, X1=Y1,X2=Y2, @X for regex",
|
||||||
"source" : "C/C++ source/header",
|
"source" : "C/C++ source/header(s) and command line file(s)",
|
||||||
"stub": "stub out undefined type references as objects",
|
"stub": "stub out undefined type references as objects",
|
||||||
"suffix": "strip suffix from identifiers",
|
"suffix": "strip suffix from identifiers",
|
||||||
"symOverride": "skip generating specified symbols",
|
"symOverride": "skip generating specified symbols",
|
||||||
|
|
|
||||||
2
tests/toast.cfg
Normal file
2
tests/toast.cfg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
--preprocess
|
||||||
|
-nk -E=_
|
||||||
Loading…
Add table
Add a link
Reference in a new issue