Usage:
1. Save the following source code into a file pb.jam;
2. Modify boostlib/tools/build/v2/user-config.jam:
and make the following changes;
using pb : /usr/local ; # /usr/local is the prefix pointing to the Google protobuf installation;3. In your project jam file
exe myexe :
message.proto
a.cpp b.cpp
;
or
lib msg1 : message.proto ; exe myexe : msg1 a.cpp b.cpp :msg1 ;
Finally the source for pb.jam
# Copyright 2012 Liping Zhang (zhanglpg at gmail dot com)
# Copyright 2010 Rodrigo Pinho Pereira de Souza ( pinhopro at gmail dot com )
#
# Distributed under the Boost Software License, Version 1.0. (See
# accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
import type ;
import generators ;
import feature ;
import common ;
import "class" : new ;
import modules ;
import feature ;
import project ;
import toolset : flags ;
project.initialize $(__name__) ;
project pb ;
type.register PROTO : proto ;
.project = [ project.current ] ;
# Helper utils for easy debug output
if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
.debug-configuration = TRUE ;
}
local rule debug-message ( message * )
{
if $(.debug-configuration) = TRUE
{
ECHO notice: [protobuf-cfg] $(message) ;
}
}
rule init ( prefix : condition * )
{
project.push-current $(.project) ;
.prefix = $(prefix) ;
.incprefix = $(prefix)/include ;
.libprefix = $(prefix)/lib ;
.binprefix = $(prefix)/bin ;
debug-message "rule init (" $(prefix) "," $(condition) ")" ;
debug-message "include path: " $(.incprefix) ;
debug-message "library path: " $(.libprefix) ;
debug-message "bin path" $(.binprefix) ;
if ! $(.initialized)
{
.initialized = true ;
debug-message "initializing protobuf..." ;
debug-message "registering proto type " ;
#type.register PROTO : proto ;
debug-message "registering protoc compiler " ;
generators.register [ new proto-generator pb.protoc : PROTO : CPP(%.pb) H(%.pb) ] ;
.PREFIX = $(prefix) ;
debug-message "protobuf initialized." ;
}
debug-message "setup path for protoc tool" ;
toolset.flags pb.protoc .BINPREFIX : $(.binprefix) ;
local usage-requirements =
$(.incprefix)
$(.libprefix)
$(.libprefix)
;
debug-message "usage-requirements: " $(usage-requirements) ;
local target-requirements = $(condition) ;
lib protobuflib :
: # requirements
protobuf
$(target-requirements)
: # default-build
: # usage-requirements
$(usage-requirements)
;
lib protobuf-litelib :
: # requirements
protobuf-lite
$(target-requirements)
: # default-build
: # usage-requirements
$(usage-requirements)
;
project.pop-current ;
debug-message "module pb initialized" ;
}
rule initialized ( )
{
return $(.initialized) ;
}
class proto-generator : generator
{
import "class" : new ;
rule __init__ ( * : * )
{
generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;
}
rule run ( project name ? : property-set : sources * )
{
if ! $(sources[2])
{
# Accept only single source.
local t = [ $(sources[1]).type ] ;
if $(t) = PROTO
{
# The type is correct.
# If no output name is specified, guess it from sources.
if ! $(name)
{
name = [ generator.determine-output-name $(sources) ] ;
name = $(name)".pb" ;
}
local a = [ new action $(sources[1]) : pb.protoc : $(property-set) ] ;
# since the default CPP suffix is .cpp and protoc generates .cc files, we need to specify the exact file name for CPP
local target1 = [ new file-target $(name).cc exact : CPP : $(project) : $(a) ] ;
local target2 = [ new file-target $(name) : H : $(project) : $(a) ] ;
DEPENDS all : [ $(target1).actualize ] ;
DEPENDS all : [ $(target2).actualize ] ;
return [ virtual-target.register $(target1) ]
[ virtual-target.register $(target2) ]
;
}
}
}
}
#generators.register [ new proto-generator pb.protoc : PROTO : CPP H ] ;
actions protoc
{
cp $(>[1]) .
$(.BINPREFIX[-1])/protoc $(>[1]:B)$(>[1]:S) --cpp_out=$(<[1]:D)
}