• Stars
    star
    168
  • Rank 225,507 (Top 5 %)
  • Language
    Python
  • Created over 11 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

JSBindings generator for C++

What's new

  • Add a prebuilt libclang 5.0 in libclang/for mac, linux and windows.
  • If you want use the prebuilt licbclang 5.0 work with Android NDK, then only the NDK r16 (or higher version) can work corrently with it.

Requirements

  • python2.7
  • py-yaml
  • cheetah (for target language templates)

Usage

Usage: generator.py [options] {configfile}

Options:
  -h, --help   show this help message and exit
  -s SECTION   sets a specific section to be converted
  -t TARGET    specifies the target vm. Will search for TARGET.yaml

Basically, you specify a target vm (spidermonkey is the only current target vm) and the section from the .ini file you want to generate code for.

Run the simple test with prebuilt libclang 5.0

Included in this repository is a simple test. Use this to confirm the generator is working and that your environment is set up correctly.

NOTE

  • The test uses the prebuilt 5.0 libclang, so you should use Android NDK r16 or higher version.
  • The test uses <string> and <stdint.h> so you need a C++ implementation that provides these
  • Currently, the test script is setup to use the Android NDK's llvm libc++

Mac OS X

  • The OSX 10.9 has a built-in python2.7 and if your os don't have python2.7 then use Homebrew to install the python and use pip install the python dependencies.
	brew install python
  • Install python dependices by pip.
    sudo easy_install pip
    sudo pip install PyYAML
	sudo pip install Cheetah
  • Download NDK r16 from google
  • If you are using python installed from other way, copy user.cfg.sample and rename it as user.cfg then set the absolute path to python PYTHON_BIN in user.cfg
  • Run follow command, it will generate a userconf.ini, and check the values in it if it occorus any error.
	export NDK_ROOT=/path/to/android-ndk-r16
    ./test.sh

Ubuntu Linux 12.04 64bit

  • Install python
	sudo apt-get install python2.7
  • Install python dependices by pip.
	sudo apt-get install python-pip
	sudo pip install PyYAML
	sudo pip install Cheetah
  • Download NDK r16 from google
  • If you are using python installed from other way, copy user.cfg.sample and rename it as user.cfg then set the absolute path to python PYTHON_BIN in user.cfg
  • Run follow command, it will generate a userconf.ini, and check the values in it if it occorus any error.
	export NDK_ROOT=/path/to/android-ndk-r16
    ./test.sh

Windows 7 64bit

Expected output

Upon running the test you might see some warnings but should not see any errors.

The test will create a directory named simple_test_bindings that contains 3 files

  • A .hpp header file for the bindings class
  • A .cpp file implementing the bindings class
  • A .js file that documents how to call (from JavaScript) the methods the C++ class exposes

The .ini file

The .ini file is a simple text file specifying the settings for the code generator. Here's the default one, used for cocos2d-x

[cocos2d-x]
prefix = cocos2dx
events  = CCNode#onEnter CCNode#onExit
extra_arguments = -I../../cocos2dx/include -I../../cocos2dx/platform -I../../cocos2dx/platform/ios -I../../cocos2dx -I../../cocos2dx/kazmath/include -arch i386 -DTARGET_OS_IPHONE -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -x c++
headers = ../../cocos2dx/include/cocos2d.h
classes = CCSprite
functions = my_free_function

Required sections

  • prefix: the prefix for the project. Must be a valid identifier for the language of the target vm. Most of the time, the name will be intermixed between the class name and the function name, since all generated (probably) will be free functions, we do that in order to avoid name collition. The script will generate ${prefix}.cpp and ${prefix}.hpp as a result.
  • events: a list of identifiers in the form of ClassName#functionName that are events to be called from the native world to the target vm.
  • extra_arguments: extra arguments to pass to the clang interface. Basically you can think of this as the arguments to pass to the "compiler", so add as many as you need here. If you're targetting C++, make sure you add "-x c++" as the last argument to force C++ mode on a ".h" file. Otherwise, name your header files as ".hpp".
  • headers: list of headers to parse. Usually you add a single header that in turn #includes the rest of the files.
  • classes: the classes that will be parsed. Right not is just a string, but it will accept regular expressions
  • functions: space-separated list of free functions to be binded. Same as with classes, it will support regular expressions.
  • skip: a space-separated list of Classes::functions or just functions to not generate any code.

The templates

The generator is using Cheetah templates to create a more flexible generator. The way it was thought, is that for every target environment, you should provide with a way to generate the same C/C++ functionality. Every template has access to the proper meta information for the code or generator (function, classes, etc.)

Right now it's separated in the following set of templates:

  • prelude.c/.h: The header of the generated files.
  • ifunction.c/.h: The template for an instance function
  • ifunction_overloaded.c: The template for the implementation of an overloaded function. An overloaded function is exactly the same as a function, but it has an array of functions sharing the same name. The current implementation for spidermonkey only works if the overloading is with different number of arguments.
  • sfunction.c/.h: The template for a static function
  • sfunction_overloaded.c: The template for an overloaded static function
  • register.c: Here you should add the constructor/finalizer, the registration function (if needed) and the footer of the header file. This is the last chunk being generated

Templates are stored in the templates/${target} directory and follow the naming specified above.

One final part of the puzzle is the ${target}.yaml file, that contains specific type conversion snippets to be used by the templates. For instance, for spidermonkey, this is the place where we specify the conversion routines for the native types (to and from int, float, string, etc.)

Limitations

Currently the generator is leveraging clang in order to get information about the C/C++ code, so we can only get as much information as clang give us. Known list of things that won't work:

  • variable number of arguments. Solution: write a manual wrapper

More Repositories

1

cocos2d-x

Cocos2d-x is a suite of open-source, cross-platform, game-development tools utilized by millions of developers across the globe. Its core has evolved to serve as the foundation for Cocos Creator 1.x & 2.x.
C++
18,090
star
2

cocos2d-objc

Cocos2d for iOS and OS X, built using Objective-C
Objective-C
4,070
star
3

cocos2d-html5

Cocos2d for Web Browsers. Built using JavaScript.
JavaScript
3,055
star
4

cocos2d-js

cocos2d-x for JS
C++
1,858
star
5

CocosBuilder

CocosBuilder, the visual editor for cocos2d
Objective-C
1,012
star
6

cocos2d-iphone-extensions

3rd party extensions for cocos2d-iphone
Objective-C
638
star
7

cocos2d-x-samples

Contains different cocos2d-x samples
Python
575
star
8

creator_to_cocos2dx

Creator plugin to support C++& Lua in cocos2d-x
C++
234
star
9

cocos2d-x-3rd-party-libs-bin

C
197
star
10

cocos2d-js-tests

cocos2d JavaScript test cases and games.
JavaScript
187
star
11

cocos2d-x-extensions

samples games & code snips for cocos2d-x
C++
152
star
12

cocos2d-console

cocos2d command line tool
Python
151
star
13

cocos2d-x-3rd-party-libs-src

Dependencies of cocos2d-x.
Perl
140
star
14

cocos2d-x-for-xna

port cocos2d-x into c# based on XNA
C#
123
star
15

cocos2d-x-docs

documentation of cocos2d-x
HTML
102
star
16

cocos2d-objc-ext

Extensions and utility classes for Cocos2D-iphone
Objective-C
58
star
17

cocos2d-iphone-classic

Repository of original V1 and V2 of Cocos2D-iphone
Objective-C
47
star
18

cocos2d-frame

Player and "stub" for cocos2d
C
37
star
19

cocos2d-js-samples

Includes different samples to be used with cocos2d
JavaScript
36
star
20

cocos2d-x-swift-bindings

Swift bindings for cocos2d-x
Objective-C++
32
star
21

cocos2d-x-external

use CMake to build external 3rd party modules for cocos2d-x
C
18
star
22

cocos2d-js__old__

cocos2d in JavaScript central repository
JavaScript
14
star
23

js-bindings

C++
13
star
24

cocos2d-x-classic

For full history commit logs of cocos2d-x
C
8
star
25

v8

V8 building
Python
7
star
26

migration-demo-objc

The Objective-C flavoured version of migration-demo-x
Objective-C
6
star
27

migration-demo-x

Demonstrates -obj to -x project migration
C++
5
star
28

console-binary

The binary files for cocos2d-console
4
star
29

cocos2d-x-docs-deps

Dependencies of building cocos2d-x docs
Shell
2
star
30

cocos2d.github.io

1
star