Home

Awesome

metastuff-clang-generator

Clang based generator for MetaStuff

Prerequisites

clang & llvm is required to be installed as generating is based on libTooling from LLVM/Clang

Building

For building you need to have llvm & clang installed then standard cmake stuff:

$ git clone https://github.com/w0land/metastuff-clang-generator.git
$ cd metastuff-clang-generator
$ mkdir build && cd build
$ cmake ..
$ cmake --build . --config Release

Usage

To properly use this on actual headers you need a bit of fine tunning: you need to figure out where default includes are for clang and pass them to metastuff-clang-generator command line. See example:

$ cd build/
$ ./src/metastuff-generator ~/main.cpp -- -I/usr/lib/clang/5.0.1/include -std=c++14

where main.cpp:

#include <string>

namespace asd {
struct SimpleType {
   std::string type;
};
struct SimpleType2 {
   std::string type;
   SimpleType bbb;
};
}

int main(int argc, char *argv[])
{
   std::string asd;
   return 0;
}

The generated code will be printed to stdout. For given example the generated code is:


#ifndef TEST
#define TEST

#include <Meta.h>

namespace meta {
inline auto registerMembers<asd::SimpleType>() {
    return members(
        member("type", &asd::SimpleType::type)
    )};

inline auto registerMembers<asd::SimpleType2>() {
    return members(
        member("type", &asd::SimpleType2::type),
        member("bbb", &asd::SimpleType2::bbb)
    )};


}
#endif TEST

Detailed usage

$ metastuff-clang-generator --help

USAGE: metastuff-clang-generator [options] <source0> [... <sourceN>]

OPTIONS:

Generic Options:

  -help                      - Display available options (-help-hidden for more)
  -help-list                 - Display list of available options (-help-list-hidden for more)
  -version                   - Display the version of this program

metastuff-generator options:

  -extra-arg=<string>        - Additional argument to append to the compiler command line
  -extra-arg-before=<string> - Additional argument to prepend to the compiler command line
  -p=<string>                - Build path
  -template-file=<filename>  - path to template file

-p <build-path> is used to read a compile command database.

	For example, it can be a CMake build directory in which a file named
	compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
	CMake option to get this output). When no build path is specified,
	a search for compile_commands.json will be attempted through all
	parent paths of the first input file . See:
	http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an
	example of setting up Clang Tooling on a source tree.

<source0> ... specify the paths of source files. These paths are
	looked up in the compile command database. If the path of a file is
	absolute, it needs to point into CMake's source tree. If the path is
	relative, the current working directory needs to be in the CMake
	source tree and the file must be in a subdirectory of the current
	working directory. "./" prefixes in the relative files will be
	automatically removed, but the rest of a relative path must be a
	suffix of a path in the compile command database.