header2whatever (h2w)
=====================
Generate arbitrary files from C/C++ header files using CppHeaderParser to read
the input files and Jinja2 templates to generate the outputs.
This grew out of a desire to generate pybind11 wrapping code from C++ header
files. pybind11gen was created, but then I wanted to generate more things...
There are still rough edges, and the documentation is mostly nonexistent, but
pull requests with fixes/improvements are very welcome!
As of 0.3.0, h2w requires Python 3.3+
Install
-------
::
pip install header2whatever
Usage
=====
First, you need to create a jinja2 template that represents whatever you want
to generate from the header file. For example, maybe you want to describe the
functions in yaml::
---
{% for header in headers %}
{% for fn in header.functions %}
{{ fn.name }}:
returns: {{ fn.returns }}
params:
{% for param in fn.parameters %}
- { name: {{ param.name }}, type: "{{ param.type }}" }
{% endfor %}
{% endfor %}
{% endfor %}
And let's say you have the following header file ``foo.h``::
void some_fn(int i);
int returns_int(int p1, char* p2);
You can execute the following::
h2w foo.h -o foo.yml
And you'll get the following output::
---
returns_int:
returns: int
params:
- { name: p1, type: "int" }
- { name: p2, type: "char *" }
some_fn:
returns: void
params:
- { name: i, type: "int" }
As you can see, while this is a silly example, this approach is very flexible
and fairly powerful.
Currently, the data structure passed to the template isn't documented -- but
it's a filtered version of whatever CppHeaderParser outputs when it parses a
header.
See the examples folder for more examples.
Batch mode
----------
If you need to process multiple files, or just want to record the parameters for
autogenerating a file without writing a shell script, batch mode is useful. You
pass two parameters: a yaml file with the configuration, and an output directory
to write the files to.
Using data from external sources
--------------------------------
Sometimes you want to mix in data that CppHeaderParser can't give you. If you
pass the ``--yaml`` option, it will load the yaml into a dictionary and make it
available to the template as the 'data' variable.
You can also pass key=value parameters via the ``--param`` option, and
the specified keys will be available to the template.
Custom processing
-----------------
When you need to do more complex logic that a jinja2 template just isn't
appropriate for, you can specify a python file to load custom hooks from.
See [the default hooks](header2whatever/default_hooks.py) for documentation.
License
=======
Apache 2
Author
======
Dustin Spicuzza (dustin@virtualroadside.com)
Raw data
{
"_id": null,
"home_page": "https://github.com/virtualroadside/header2whatever",
"name": "header2whatever",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "c++ cpp codegen generator header jinja2 template",
"author": "Dustin Spicuzza",
"author_email": "dustin@virtualroadside.com",
"download_url": "https://files.pythonhosted.org/packages/e4/91/2f3982a76ece3b14543612408929da953cc60c5b91d365f0b08b1f630bc0/header2whatever-0.4.8.tar.gz",
"platform": null,
"description": "header2whatever (h2w)\n=====================\n\nGenerate arbitrary files from C/C++ header files using CppHeaderParser to read\nthe input files and Jinja2 templates to generate the outputs.\n\nThis grew out of a desire to generate pybind11 wrapping code from C++ header\nfiles. pybind11gen was created, but then I wanted to generate more things...\n\nThere are still rough edges, and the documentation is mostly nonexistent, but\npull requests with fixes/improvements are very welcome!\n\nAs of 0.3.0, h2w requires Python 3.3+\n\nInstall\n-------\n\n::\n\n pip install header2whatever\n\nUsage\n=====\n\nFirst, you need to create a jinja2 template that represents whatever you want\nto generate from the header file. For example, maybe you want to describe the\nfunctions in yaml::\n\n ---\n {% for header in headers %}\n {% for fn in header.functions %}\n {{ fn.name }}:\n returns: {{ fn.returns }}\n params:\n {% for param in fn.parameters %}\n - { name: {{ param.name }}, type: \"{{ param.type }}\" }\n {% endfor %}\n\n {% endfor %}\n {% endfor %}\n\nAnd let's say you have the following header file ``foo.h``::\n\n void some_fn(int i);\n int returns_int(int p1, char* p2);\n\nYou can execute the following::\n\n h2w foo.h -o foo.yml\n\nAnd you'll get the following output::\n\n ---\n returns_int:\n returns: int\n params:\n - { name: p1, type: \"int\" }\n - { name: p2, type: \"char *\" }\n\n some_fn:\n returns: void\n params:\n - { name: i, type: \"int\" }\n\nAs you can see, while this is a silly example, this approach is very flexible\nand fairly powerful.\n\nCurrently, the data structure passed to the template isn't documented -- but\nit's a filtered version of whatever CppHeaderParser outputs when it parses a\nheader.\n\nSee the examples folder for more examples.\n\nBatch mode\n----------\n\nIf you need to process multiple files, or just want to record the parameters for\nautogenerating a file without writing a shell script, batch mode is useful. You\npass two parameters: a yaml file with the configuration, and an output directory\nto write the files to.\n\n\nUsing data from external sources\n--------------------------------\n\nSometimes you want to mix in data that CppHeaderParser can't give you. If you\npass the ``--yaml`` option, it will load the yaml into a dictionary and make it\navailable to the template as the 'data' variable.\n\nYou can also pass key=value parameters via the ``--param`` option, and\nthe specified keys will be available to the template.\n\nCustom processing\n-----------------\n\nWhen you need to do more complex logic that a jinja2 template just isn't\nappropriate for, you can specify a python file to load custom hooks from.\n\nSee [the default hooks](header2whatever/default_hooks.py) for documentation.\n\nLicense\n=======\n\nApache 2\n\nAuthor\n======\n\nDustin Spicuzza (dustin@virtualroadside.com)\n\n\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "Generate files from C/C++ headers using jinja2 templates",
"version": "0.4.8",
"split_keywords": [
"c++",
"cpp",
"codegen",
"generator",
"header",
"jinja2",
"template"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "e9f9870e3d55588a4aba48116eaacedb",
"sha256": "ff3ccdc3159027f4b15e271977946adaf60d939ea0950b0245b7d725a5741402"
},
"downloads": -1,
"filename": "header2whatever-0.4.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e9f9870e3d55588a4aba48116eaacedb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 81076,
"upload_time": "2022-12-05T03:25:44",
"upload_time_iso_8601": "2022-12-05T03:25:44.719226Z",
"url": "https://files.pythonhosted.org/packages/03/3f/6e342843b42162ff82c8412f17686cdc90e0d39322731c53316f1ed7f017/header2whatever-0.4.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "89add5da1bc8d49ca910bcdebc0987c7",
"sha256": "7ecdbcc3eb79a546cf89505749d106615b6897014f0d602d59aced2ce16dcbc6"
},
"downloads": -1,
"filename": "header2whatever-0.4.8.tar.gz",
"has_sig": false,
"md5_digest": "89add5da1bc8d49ca910bcdebc0987c7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 78383,
"upload_time": "2022-12-05T03:25:46",
"upload_time_iso_8601": "2022-12-05T03:25:46.233907Z",
"url": "https://files.pythonhosted.org/packages/e4/91/2f3982a76ece3b14543612408929da953cc60c5b91d365f0b08b1f630bc0/header2whatever-0.4.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-05 03:25:46",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "virtualroadside",
"github_project": "header2whatever",
"lcname": "header2whatever"
}