RedlandDave Beckett |
|||||
|
Hosted by
since 2005. RaptorDemonstrationsData |
Raptor RDF Syntax Library - Upgrading to the Raptor V2 APIRaptor V2 is a major new version of the Raptor V1 API with many cleanups and changes that include adding, removing and re-ordering parameters, adding and removing return types as well as renaming the functions. The headers and libraries install to different places or names so
that Raptor V1 and Raptor V2 can both be present (including headers)
on the same system without clashing. However, if you do try linking
the same binary with both libraries, the symbols will clash and the
program will fail in mysterious ways if it runs at all. There are
only two installed files that overlap - the Configuration and compiling changesRaptor V2 uses cc -o prog prog.c `pkg-config raptor2 --cflags` `pkg-config raptor2 --libs` Shown here as a compile in link all in one line but you typically split that into two stages. cc -c `pkg-config raptor2 --cflags` raptor-module.c ... cc -o prog raptor-module.c ... other modules ... `pkg-config raptor2 --libs` Code changesThere are significant API changes, which are described in the Release Notes in long summary form with some background to why, in the ChangeLog in very long form. The reference manual contains a section describing what was added, deleted, renamed and otherwise changed for both the functions exported from the library, as well as the typedefs and enum values. There is no fully automatic way to handle updating the code
however there is a perl script provided in the docs directory that
renames what it can, and otherwise inserts a WARNING comment near
code that needs manual updating. This cannot be automated in some
places such as when the fields of the raptor_statement object were
replaced with raptor_term pointers. The script is used like
$ perl docs/upgrade-script.pl prog.c and then edit the file prog.c and search for Handling Raptor V1 or Raptor V2 in the same codeIf you need to handle both APIs in the same codebase as alternatives, it is recommended that you use the following approach.
Create an application Once the choice is made, it is recommended you convert the code to the Raptor V2 API and then add backwards-compatible macros for the changed functions: #ifdef APP_WANTS_RAPTOR_V2 /* nop */ #else #define raptor_v2_function(arg1, arg2, arg3) raptor_v1_function(arg2, arg3) #endif Where the code cannot be done by simple expansion such as use of
rasqal in GIT (will be 0.9.20) uses this approach. Another approach if the Raptor V1 code is in a separate module / source file is to copy it and make a V2 version and then choose the file to use at configure or build time. librdf 1.0.11 uses this approach. Either way, basing the interface on the V2 APIs makes it clear what to remove when V1 is no longer supported. Packaging recommendations for distributorsSince Raptor V2 probably needs to be installed in parallel with V1 for some time, at least for the different libraries and headers, both need to be packaged such that no files clash. There are, however, two files that are shared after a 'make install':
For packaging systems that split the installation into multiple packages (libraries, headers, docs, debug files), these two files should be in a package of their own that replace and conflict with the earlier files. (This is what I have done with the Debian packages raptor-utils and raptor2-utils). For packaging systems that do not use multiple packages, you will have to either leave these files out of the V2 package or migrate them from the V1 package to the V2 package using dependencies to ensure there are no conflicts. The advantage of making the V2 version of rapper is that it means the command-line utility under the well known name uses the latest Raptor code. |