Commit 9fa749d6 authored by Robert Edmonds's avatar Robert Edmonds

loosen the coupling between protoc-c and the protobuf-c headers

exact version coupling between the compiler and the public headers is
too strict because some existing projects (such as collectd,
riemann-c-client, and nmsg) directly embed .pb-c.h files generated by
protoc-c into their exported headers. this would cause unnecessary build
failures in downstream clients of these libraries if a newer version of
the protobuf-c headers is installed.

however, it's still desireable to be able to explicitly declare when
compatibility is broken between the headers and the compiler, so
introduce new variables that allow independently setting the minimum
header version required by the compiler and the minimum compiler version
required by the header.

this follows the protobuf C++ implementation a little bit more closely,
though we don't have an analogous facility for verifying that the header
and *library* are compatible. (this seems like overkill for a C project;
in practice the headers and the library will be from the same version,
especially in downstream distributors like debian where the -dev package
has an exact versioned dependency on the shared library package.)
parent f406c9c5
...@@ -103,6 +103,12 @@ protobuf_c_version_number(void); ...@@ -103,6 +103,12 @@ protobuf_c_version_number(void);
*/ */
#define PROTOBUF_C_VERSION_NUMBER 1000000 #define PROTOBUF_C_VERSION_NUMBER 1000000
/**
* The minimum protoc-c version which works with the current version of the
* protobuf-c headers.
*/
#define PROTOBUF_C_MIN_COMPILER_VERSION 1000000
typedef int protobuf_c_boolean; typedef int protobuf_c_boolean;
typedef enum { typedef enum {
......
...@@ -119,6 +119,8 @@ FileGenerator::~FileGenerator() {} ...@@ -119,6 +119,8 @@ FileGenerator::~FileGenerator() {}
void FileGenerator::GenerateHeader(io::Printer* printer) { void FileGenerator::GenerateHeader(io::Printer* printer) {
string filename_identifier = FilenameIdentifier(file_->name()); string filename_identifier = FilenameIdentifier(file_->name());
static const int min_header_version = 1000000;
// Generate top of header. // Generate top of header.
printer->Print( printer->Print(
"/* Generated by the protocol buffer compiler. DO NOT EDIT! */\n" "/* Generated by the protocol buffer compiler. DO NOT EDIT! */\n"
...@@ -140,14 +142,13 @@ void FileGenerator::GenerateHeader(io::Printer* printer) { ...@@ -140,14 +142,13 @@ void FileGenerator::GenerateHeader(io::Printer* printer) {
"#if PROTOBUF_C_VERSION_NUMBER < $min_header_version$\n" "#if PROTOBUF_C_VERSION_NUMBER < $min_header_version$\n"
"# error This file was generated by a newer version of protoc-c which is " "# error This file was generated by a newer version of protoc-c which is "
"incompatible with your libprotobuf-c headers. Please update your headers.\n" "incompatible with your libprotobuf-c headers. Please update your headers.\n"
"#elif $protoc_version$ < PROTOBUF_C_VERSION_NUMBER\n" "#elif $protoc_version$ < PROTOBUF_C_MIN_COMPILER_VERSION\n"
"# error This file was generated by an older version of protoc-c which is " "# error This file was generated by an older version of protoc-c which is "
"incompatible with your libprotobuf-c headers. Please regenerate this file " "incompatible with your libprotobuf-c headers. Please regenerate this file "
"with a newer version of protoc-c.\n" "with a newer version of protoc-c.\n"
"#endif\n" "#endif\n"
"\n", "\n",
"min_header_version", "min_header_version", SimpleItoa(min_header_version),
SimpleItoa(PROTOBUF_C_VERSION_NUMBER),
"protoc_version", SimpleItoa(PROTOBUF_C_VERSION_NUMBER)); "protoc_version", SimpleItoa(PROTOBUF_C_VERSION_NUMBER));
for (int i = 0; i < file_->dependency_count(); i++) { for (int i = 0; i < file_->dependency_count(); i++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment