5f57e72eae | ||
---|---|---|
.. | ||
README.md | ||
simple_class.cpp | ||
simple_class.h | ||
simple_native_generated.cpp | ||
simple_native_generated.hpp |
README.md
How to create my own bindings
While the generate_bindings.rb
ruby script is mainly used to create the cocos2d-x bindings, the idea
is that it can be used to wrap more C++ classes needed by your game.
This document will try to explain how to use this script and what tools you need in order to make it work.
Please note that this script is a preliminary effort and it won't work in all cases. Here's what is not working:
std::string
- plain c strings works ok though (char *
). We're working to add support for this but a workaround would be to either switch to c strings (not really an option for many of us) or create a simple wrapper function that will receive c strings.- namespaces - It's not that they're not working, but if you're wrapping a class
C
that lives inA::B::C
the scripting interface generated will inherit fromC
and you would have to manually set the namespace of the parent class toA::B
. - variable number of arguments - This is not working yet
Required tools
- clang 2.8 - You can get it from the (download section)[http://llvm.org/releases/download.html] of clang. Please note that it has to be version 2.8 and not a newer version. Newer versions have the xml output for the AST broken.
- ruby 1.9 and nokogiri gem
- You can download ruby from http://www.ruby-lang.org
- After you have ruby installed, you can install nokogiri:
sudo gem install nokogiri
- Alternatively you can use (rvm)[https://rvm.io/]
Making it work
The first thing you need to create, is the (AST)[http://en.wikipedia.org/wiki/Abstract_syntax_tree] for your class.
Since you're using clang, you can safely point the script to your main header, for instance, for cocos2d-x we
point the script to the cocos2d.h
header file. Take into account though, that files should be reachable or you
should modify the header search paths (-I
in the script).
./generate_ast_xml.sh test_bindings/simple_class.h
That will create the XML for the AST in the current working directory, in this case simple_class.xml
. Now you need
to pass this to the ruby script that will parse the tree and then generate the proper bindings:
CXX_CLASSES=SimpleNativeClass ruby generate_bindings.rb simple_class.xml simple_native_generated
What this is doing, is specifying what classes are going to be binded (CXX_CLASSES
is a colon separated string, and
is being passed as a environmental variable to the script), the two arguments for the script specify the XML file and
what is the name of the generated output. If no second argument is passed, it will generate out.cpp
and out.hpp
.
Once you run this, it should generate the files simple_native_generated.cpp
and simple_native_generated.hpp
. You
can then include those files in your project.
Please note that if the class you're binding is namespaced, then the scripting class (S_SimpleNativeClass
in this
example) is not inheriting from the right class, so you should add the proper namespace. That should be the only
thing you would need to do in order to compile that file.
What is doing internally
Explain here how it's wrapping the classes