Starter template, CLI menu in README
This commit is contained in:
parent
2cdde94635
commit
98333ad18b
3 changed files with 145 additions and 7 deletions
26
README.md
26
README.md
|
|
@ -50,9 +50,33 @@ cImport("clib.h")
|
||||||
cCompile("clib/src/*.c")
|
cCompile("clib/src/*.c")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Check out [template.nim](https://github.com/nimterop/nimterop/blob/master/nimterop/template.nim) as a starting point for wrapping a new library. The template can be copied and trimmed down and modified as required.
|
||||||
|
|
||||||
Refer to the ```tests``` directory for examples on how the library can be used.
|
Refer to the ```tests``` directory for examples on how the library can be used.
|
||||||
|
|
||||||
The `toast` binary can also be used directly on the CLI. The `--help` flag provides more details.
|
The `toast` binary can also be used directly on the CLI:
|
||||||
|
|
||||||
|
```
|
||||||
|
toast -h
|
||||||
|
Usage:
|
||||||
|
main [optional-params] C/C++ source/header
|
||||||
|
Options(opt-arg sep :|=|spc):
|
||||||
|
-h, --help print this cligen-erated help
|
||||||
|
--help-syntax advanced: prepend, multi-val,..
|
||||||
|
-p, --preprocess bool false run preprocessor on header
|
||||||
|
-a, --past bool false print AST output
|
||||||
|
-n, --pnim bool false print Nim output
|
||||||
|
-r, --recurse bool false process #include files
|
||||||
|
-c, --nocomments bool false exclude top-level comments from output
|
||||||
|
-D=, --defines= strings {} definitions to pass to preprocessor
|
||||||
|
-I=, --includeDirs= strings {} include directory to pass to preprocessor
|
||||||
|
-l=, --dynlib= string "" Import symbols from library in specified Nim string
|
||||||
|
-O=, --symOverride= strings {} skip generating specified symbols
|
||||||
|
--pluginSourcePath= string "" Nim file to build and load as a plugin
|
||||||
|
-d, --debug bool false enable debug output
|
||||||
|
-m=, --mode= string "cpp" language parser: c or cpp
|
||||||
|
-g, --pgrammar bool false print grammar
|
||||||
|
```
|
||||||
|
|
||||||
__Implementation Details__
|
__Implementation Details__
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
##[
|
##[
|
||||||
Main import file to write wrappers.
|
This is the main nimterop import file to help with wrapping C/C++ source code.
|
||||||
Each `compileTime` proc must be used in a compile time context, eg using:
|
|
||||||
|
Check out `template.nim <https://github.com/nimterop/nimterop/blob/master/nimterop/template.nim>`_
|
||||||
|
as a starting point for wrapping a new library. The template can be copied and
|
||||||
|
trimmed down and modified as required.
|
||||||
|
|
||||||
|
All `compileTime` procs must be used in a compile time context, e.g. using:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
static:
|
||||||
|
cAddStdDir()
|
||||||
|
|
||||||
```
|
|
||||||
static:
|
|
||||||
cAddStdDir()
|
|
||||||
```
|
|
||||||
]##
|
]##
|
||||||
|
|
||||||
import hashes, macros, os, strformat, strutils
|
import hashes, macros, os, strformat, strutils
|
||||||
|
|
|
||||||
108
nimterop/template.nim
Normal file
108
nimterop/template.nim
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
import os, strutils
|
||||||
|
|
||||||
|
import nimterop/[cimport, git, paths]
|
||||||
|
|
||||||
|
# Documentation:
|
||||||
|
# https://github.com/nimterop/nimterop
|
||||||
|
# https://nimterop.github.io/nimterop/cimport.html
|
||||||
|
|
||||||
|
const
|
||||||
|
# Location where any sources should get downloaded. Adjust depending on
|
||||||
|
# actual location of wrapper file relative to project.
|
||||||
|
baseDir = currentSourcePath.parentDir()/"build"
|
||||||
|
|
||||||
|
# All files and dirs should be inside to baseDir
|
||||||
|
srcDir = baseDir/"project"
|
||||||
|
|
||||||
|
static:
|
||||||
|
# Print generated Nim to output
|
||||||
|
cDebug()
|
||||||
|
|
||||||
|
# Disable caching so that wrapper is generated every time. Useful during
|
||||||
|
# development. Remove once wrapper is working as expected.
|
||||||
|
cDisableCaching()
|
||||||
|
|
||||||
|
# Download C/C++ source code from a git repository
|
||||||
|
gitPull("https://github.com/user/project", outdir = srcDir, plist = """
|
||||||
|
include/*.h
|
||||||
|
src/*.c
|
||||||
|
""", checkout = "tag/branch/hash")
|
||||||
|
|
||||||
|
# Download source from the web - zip files are auto extracted
|
||||||
|
downloadUrl("https://hostname.com/file.h", outdir = srcDir)
|
||||||
|
|
||||||
|
# Run GNU configure on the source
|
||||||
|
when defined(posix):
|
||||||
|
configure(srcDir)
|
||||||
|
|
||||||
|
# Run standard file/directory operations with mkDir(), cpFile(), mvFile()
|
||||||
|
|
||||||
|
# Edit file contents if required with readFile(), writeFile() and standard
|
||||||
|
# string operations
|
||||||
|
|
||||||
|
# Run any other external commands with execAction()
|
||||||
|
|
||||||
|
# Skip any symbols from being wrapped
|
||||||
|
cSkipSymbol(@["type1", "proc2"])
|
||||||
|
|
||||||
|
# Manually wrap any symbols since nimterop cannot or incorrectly wraps them
|
||||||
|
cOverride:
|
||||||
|
# Standard Nim code to wrap types, consts, procs, etc.
|
||||||
|
type
|
||||||
|
symbol = object
|
||||||
|
|
||||||
|
# Specify include directories for gcc and Nim
|
||||||
|
cInclude(srcDir/"include")
|
||||||
|
|
||||||
|
# Define global symbols
|
||||||
|
cDefine("SYMBOL", "value")
|
||||||
|
|
||||||
|
# Any global compiler options
|
||||||
|
{.passC: "flags".}
|
||||||
|
|
||||||
|
# Any global linker options
|
||||||
|
{.passL: "flags".}
|
||||||
|
|
||||||
|
# Compile in any common source code
|
||||||
|
cCompile(srcDir/"windows/file.c")
|
||||||
|
|
||||||
|
# Perform OS specific tasks
|
||||||
|
when defined(windows):
|
||||||
|
# Windows specific symbols, options and files
|
||||||
|
|
||||||
|
# Dynamic library to link against
|
||||||
|
const dynlibFile =
|
||||||
|
when defined(cpu64):
|
||||||
|
"xyz64.dll"
|
||||||
|
else:
|
||||||
|
"xyz32.dll"
|
||||||
|
elif defined(posix):
|
||||||
|
# Common posix symbols, options and files
|
||||||
|
|
||||||
|
when defined(linux):
|
||||||
|
# Linux specific
|
||||||
|
const dynlibFile = "libxyz.so(.2|.1|)"
|
||||||
|
elif defined(osx):
|
||||||
|
# MacOSX specific
|
||||||
|
const dynlibFile = "libxyz(.2|.1|).dylib"
|
||||||
|
else:
|
||||||
|
static: doAssert false
|
||||||
|
else:
|
||||||
|
static: doAssert false
|
||||||
|
|
||||||
|
# Use cPlugin() to make any symbol changes
|
||||||
|
cPlugin:
|
||||||
|
import strutils
|
||||||
|
|
||||||
|
# Symbol renaming examples
|
||||||
|
proc onSymbol*(sym: var Symbol) {.exportc, dynlib.} =
|
||||||
|
# Get rid of leading and trailing underscores
|
||||||
|
sym.name = sym.name.strip(chars = {'_'})
|
||||||
|
|
||||||
|
# Remove prefixes or suffixes from procs
|
||||||
|
if sym.kind == nskProc and sym.name.contains("SDL_"):
|
||||||
|
sym.name = sym.name.replace("SDL_", "")
|
||||||
|
|
||||||
|
# Finally import wrapped header file. Recurse if #include files should also
|
||||||
|
# be wrapped. Set dynlib if binding to dynamic library.
|
||||||
|
cImport(srcDir/"include/file.h", recurse = true, dynlib="dynlibFile")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue