ZProject is a project skeleton generator that helps you create c-APIs and generate multiple build-targets(cmake,autotools,..) with multiple scripting-language-bindings(python,lua,...) . The single source of truth is that project.xml-File that controls what flows will run. The whole workflow is based on the GSL-Templating/Scripting-Tool.
Disclaimer: I just started using ZProject and wasn't a c-programmer or the CLASS-paradigm enforced by this project.
In order to start using ZProject follow the instructions after which you should have ZProject and GSL installed.
Create a minimal project.xml:
<project script = "zproject.gsl" name ="gs"> <version major = "1" minor = "1" patch = "0" /> <class name = "shouter"/> <main name = "starter" private = "1" /> </project>
The <project/>-tag encapsulates all that for your project. It has multiple attributes, but the most important (for any gsl-template) is:
- The script-attribute which defines what script should process the data we are defining in this xml. In this case it is zproject.gsl which gets installed when you install ZProject.
- The name-attribute defines the name of the library. In this case if we generate the project and build it, we would get a lib called 'libgs.a' and 'libgs.so' which in our case would be a symlink to 'libgs.so.1.1.0' what will lead us to the next tag.
The <version/>-tag defines the current version with attributes major,minor,patch.
The <class/>-tag defines a c-CLASS:
- The name-attribute set the name
- A more detailed definition of the class itself (methods,...) will be done in a separate api-file
A class-tag with name 'shouter' would result in the generation of:
- include/shouter.h - which will be generated once and been updated in a specific block on following generate-calls (more about this later)
- src/shouter.c - generated once and never been touched afterwards
The <main/>-tag defines entrypoint(s) to use the library defined by the classes:
- The name-attribute defines the name of the main-executable.
- The private-attribute='1' marks this executable is 'internal tool' (not 100% sure what the consequence is. I guess it will have influence where and how this executable will be installed!?)
A main-tag with name 'tester' would result in the generation of:
- src/tester.c - generated once never been touched again
- building the project would result in an executable with the name 'tester'
Generating the project will be done with this command:
This will generate lots of files:
- include- and src-files
Since ZProject is quite interweaved with the zmq-ecosystem the skeleton adds a call to a czmq-class that can savely removed.
// Insert main code here if (verbose) zsys_info ("starter - ");
Also keep in mind that (at least at the moment) a non-default-constructor (defined in an api-file) will not generate a valid constructor. (more on this later)
Now, that we created our project and fixed that 'zsys_info'-situation we are ready to build.
You can build the project the autotools-way:
./autogen.sh ./configure make
Or use cmake:
mkdir build cd build cmake .. make
Both results will build your project.
- we created a first project.xml
- we generated code by using: 'gsl project.xml'
- we built our project
In the next part we will inspect what code is generated and how to add extend our classes.