• Stars
    star
    113
  • Rank 308,355 (Top 7 %)
  • Language
    C
  • License
    MIT License
  • Created almost 7 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Nimgen is a helper for c2nim to simplify and automate the wrapping of C libraries

Nimgen has been superseded by nimterop. Existing wrappers are slowly being migrated over to nimterop. No new features will be implemented going forward.

Chat on Gitter Build status Build Status

Nimgen is a helper for c2nim to simplify and automate the wrapping of C libraries.

Nimgen can be used to automate the process of manipulating C files so that c2nim can be run on them without issues. This includes adding/removing code snippets, removal of complex preprocessor definitions that c2nim doesn't yet comprehend and recursively running on #include files.

Installation

Nimgen can be installed via Nimble:

> nimble install nimgen

This will download, build and install nimgen in the standard Nimble package location, typically ~/.nimble. Once installed, it can be run just like c2nim.

Usage

Nimgen is driven by a simple .cfg file that is read using the Nim parsecfg module. The sections of the file are described further below.

> nimgen package.cfg

A Nimble package for a library that is wrapped with nimgen will have the following:-

  • The .cfg file that tells nimgen what exactly to do
  • Nimgen defined as a dependency defined in the .nimble file
  • Steps within the .nimble file to download the source code that is being wrapped

This way, the library source code doesn't need to get checked into the Nimble package and can evolve independently.

Nimble already requires Git so those commands can be assumed to be present to download source from a repository. Mercurial is also suggested but depends on the user. Downloading arbitrary files depends on the OS. For Linux, wget/curl can be assumed. On Windows, powershell can be used.

Capabilities & Limitations

Nimgen supports compiling in C/C++ sources and static libraries as well as loading in dynamic libraries.

To see examples of nimgen in action check out the following wrappers:-

Nimgen only supports the gcc preprocessor at this time. Support for detecting and using other preprocessors will be based on interest.

Config file

In all sections below, environment variables are supported via Nim's string interpolation % symbol imported from the strutils module. Simply use double quotes to enclose any value and put $ or ${} around the environment variable name. In addition, the output var from the n.global section is available as ${output}. For example:

[n.global]
c_compiler="$CC"
cpp_compiler="${CPP}-arm"
output="src/path"

[n.include]
"${output}/library/include"
"${MY_INCLUDE_PATH}/include"

Append -win, -lin and -mac/osx for OS specific sections and tasks. E.g. n.global-win, n.post-lin, download-win, execute-lin-mac.unique1. -unix can be used as a shortcut for -lin-mac.

[n.global]

output = name of the Nimble project once installed, also location to place generated .nim files

quotes = pick up any headers included using "" (and not <> which is typically used for standard headers) [default: true]

filter = string to identify and recurse into library .h files in #include statements and exclude standard headers

cpp_compiler = string to specify a CPP compiler executable. [default: g++]

c_compiler = string to specify a C compiler executable. [default: gcc]

[n.include]

List of all directories, one per line, to include in the search path. This is used by:-

  • The preprocessor for #include files
  • Nimgen to find #include files that are recursively processed

Nimgen also adds {.passC.} declarations into the generated .nim files for these include paths if compiling source files directly.

[n.exclude]

List of all directories or files to exclude from all parsing. If an entry here matches any portion of a file, it is excluded from recursive processing.

[n.prepare]

The following keys can be used to prepare dependencies such as downloading ZIP files, cloning Git repositories, etc. Multiple entries are possible by appending any .string to the key. E.g. download.file1.

download = url to download to the output directory. ZIP files are automatically extracted. Files are not redownloaded if already present but re-extracted

extract = ZIP file to extract in case they are local and don't need to be downloaded. Path is relative to output directory.

gitcheckout = branch, commit or tag of repository to checkout in following Git command, resets after each use. Use "-b name" for branches

gitbranch = master/main branch of the repository, defaults to master

gitoutput = directory for all following Git commands relative to n.global:output [default: n.global:output directory]

git = url of Git repository to clone. Full repo is pulled so gitremote + gitsparse is preferable. Resets if already present

gitremote = url of Git repository to partially checkout. Use with gitsparse to pull only files and dirs of interest

gitsparse = list of files and/or dirs to include in partial checkout, one per line. Resets if already present

execute = command to run during preparation

copy = copy a file to another location. Preferred over moving to preserve original. Comma separate for multiple entries. E.g. copy = "output/config.h.in=output/config.h"

[n.post]

This section is the same as the prepare section, but for performing actions after the project has been processed.

gitoutput = output directory for Git reset [default: n.global:output directory]

reset = perform a Git reset on all files after processing [default: false]

execute = command to run after processing

[n.wildcard]

File wildcards such as .nim, ssl.h, etc. can be used to perform tasks across a group of files. This is useful to define common operations such as global text replacements without having to specify an explicit section for every single file. These operations will be performed on every matching file that is defined as a sourcefile or recursed files. Only applies on source files following the wildcard declarations.

wildcard = pattern to match against. All keys following the wildcard declaration will apply to matched files

[n.sourcefile]

This section allows selection of multiple sourcefiles without requiring a detailed section for each file. Each specific file can be listed one line at a time and file wildcards can be used to include multiple source files. E.g. $output/include/*/h. [n.wildcard] definitions can be used to perform common operations on these source files if required.

[sourcefile]

The following keys apply to library source code and help with generating the .nim files. -win, -lin and -osx can be used for OS specific tasks. E.g. dynlib-win, pragma-win.

recurse = find #include files and process them [default: false]

inline = include #include files into file being processed, alternative method to processing each header file separately with recurse. Multiple source files will get combined into the same .nim output files [default: false]

preprocess = run preprocessor (gcc -E) on file to remove #defines, etc. [default: false] - this is especially useful when c2nim doesn't support complex preprocessor usage

ctags = run ctags on file to filter out function definitions [default: false] - this requires the ctags executable and is an alternative to filter out preprocessor complexity

defines = pulls out simple #defines of ints, floats and hex values for separate conversion [default: false] - works only when preprocess or ctags is used and helps include useful definitions in generated .nim file

flags = flags to pass to the c2nim process in "quotes" [default: --stdcall]. --cdecl, --assumedef, --assumendef may be useful

ppflags = flags to pass to the preprocessor [default: ""]. -D for gcc and others may be useful

noprocess = do not process this source file with c2nim [default: false] - this is useful if a file only needs to be manipulated

nowildcard = ignore any wildcard definitions for this sourcefile

reset = reset the file back to original state after all processing [default: false]

Multiple entries for the all following keys are possible by appending any .string to the key. E.g. dynlib.win, compile.dir

compile = file or dir of files of source code to {.compile.} into generated .nim. If directory, picks *.c if C mode and *.cxx, *.cpp, *.cc, *.c++ and .C for cpp mode. Dir can also include wildcards. e.g. compile = """dir/A.cxx"""

pragma = pragmas to define in generated .nim file. E.g. pragma = "passL: "-lssl"" => {.passL: "-lssl".}

dynlib = dynamic library to load at runtime for generated .nim procs

The following keys apply to library source code (before processing) and generated .nim files (after processing) and allow manipulating the files as required to enable successful wrapping. They are not propagated to #include files when recurse = true.

create = create a file at exact location with contents specified. File needs to be in the [n.exclude] list in order to be created.

pipe = execute a command on a file and store the output of the command as the new file contents. E.g. pipe = "cat $file | grep 'static inline'"

search = search string providing context for following prepend/append/replace directives

regex = regex search string providing context for the following replace directive. Specify using """ to avoid regex parsing issues

prepend = string value to prepend into file at beginning or before search

append = string value to append into file at the end or after search

replace = string value to replace search string in file. Regex captures can be referred to using $1, $2, etc.

move = search string providing context for location to move the results of a preceding search or regex match

comment = number of lines to comment from search location

The following key only applies before processing and allows renaming the generated .nim files as required to enable successful wrapping. This may be for organizational purposes or to prevent usage of non-nim supported strings in module names (E.g. first letter is a number). Destination is relative to output directory if defined.

rename = string value to rename generated filename. E.g. rename = "$replace(7=s7)"

/ = create a directory/module hierarchy

$nimout = refer to the original filename

$replace(srch1=repl1, srch2=reply2) = rename specific portions in $nimout

Command Line

A subset of capabilities are available through the command line to enable quick tests using nimgen. Command line flags only apply to source files specified on the command line and do not influence any cfg files which are expected to be self-sufficient.

Usage:
  nimgen [options] file.cfg|file.h ...

Params:
  -C<compile>  add compile entry       *
  -E<exclude>  add n.exclude entry     *
  -F<flags>    set c2nim flags         *
  -I<include>  add n.include dir       *
  -O<outdir>   set output directory
  -P<ppflags>  set preprocessor flags  *

Options:
  -c           set ctags = true
  -d           set defines = true
  -i           set inline = true
  -n           set noprocess = true
  -p           set preprocess = true
  -r           set recurse = true

Editing:
  -a<append>   append string           *
  -e<prepend>  prepend string          *
  -l<replace>  replace string          *
  -o#lines     comment X lines         *
  -s<search>   search string           *
  -x<regex>    regex search string     *

* supports multiple instances

Feedback

Nimgen is a work in progress and any feedback or suggestions are welcome. It is hosted on GitHub with an MIT license so issues, forks and PRs are most appreciated. Also join us at https://gitter.im/nimgen/Lobby to chat about nimgen and the future of Nim wrappers.

Credits

Thank you to the following contributors for their hard work!

https://github.com/jyapayne

More Repositories

1

px

An HTTP proxy server to automatically authenticate through an NTLM proxy
Python
921
star
2

ff

Windows wrapper for fzf
Nim
87
star
3

plugins

Plugin system for Nim
Nim
31
star
4

feud

Fed Ep with UDitors
Nim
28
star
5

snip

snip is text editor to speed up testing code snippets
Nim
28
star
6

nimdeps

Nim library to bundle dependency files into executable
Nim
26
star
7

nimgraphql

Nimgraphql is a Nim wrapper for the libgraphqlparser library
Nim
25
star
8

nimtreesitter

treesitter is a Nim wrapper for the tree-sitter library
Nim
24
star
9

fru-tool

fru-tool is a command-line utility for generating IPMI FRU binary data files
Python
22
star
10

lazylib

Lazy loading of shared libraries for Nim
Nim
19
star
11

nimssl

Nimssl is a Nim wrapper for the OpenSSL library
Nim
19
star
12

vire

Vim / Neovim installer and vimrc + plugin manager
Python
19
star
13

nimarchive

libarchive wrapper for Nim
Nim
17
star
14

nimclipboard

libclipboard wrapper for Nim
Nim
17
star
15

px2

Next-gen auth proxy POC
Nim
16
star
16

nimnuklear

Nimnuklear is a Nim wrapper for the nuklear library
Nim
13
star
17

nimgit2

libgit2 wrapper for Nim
Nim
12
star
18

tissue

Test failing snippets from Nim's issues
Nim
12
star
19

shared

Nim library for shared types
Nim
11
star
20

nimfuzzy

Nimfuzz is a Nim wrapper for the fts_fuzzy_match library by Forrest Smith
Nim
10
star
21

nim7z

7z extraction for Nim
Nim
8
star
22

nimrax

Nimrax is a Nim wrapper for the rax library
Nim
7
star
23

nimbass

NimBASS is a Nim wrapper for the BASS audio library.
Nim
7
star
24

nimkerberos

WinKerberos wrapper for Nim
Nim
5
star
25

nimpcre

PCRE wrapper for Nim
Nim
5
star
26

nimbigwig

libBigWig wrapper for Nim
Nim
4
star
27

nimzbar

Nimzbar is a Nim wrapper for the zbar library
Nim
4
star
28

nimfastText

NimfastText is a Nim wrapper for the fastText library
Nim
4
star
29

nimui

libui wrapper for Nim
Nim
3
star
30

nimmonocypher

Nimmonocypher is a Nim wrapper for the monocypher library
Nim
3
star
31

nimscintilla

Scintilla wrapper for Nim
Nim
2
star
32

mcurl

Manage outbound HTTP connections using Curl & CurlMulti
Python
2
star
33

libsvm

This project is a Nim wrapper for the libsvm library
Nim
1
star
34

nimtess2

libtess2 wrapper for Nim
Nim
1
star
35

nimssh2

Nimssh2 is a Nim wrapper for the libssh2 library
Nim
1
star
36

autodup

Automatic duplicate file finder
Nim
1
star