Source: lierolibre
Version: 0.5-1
Severity: serious
Justification: fails to build from source (but built successfully in the past)
Tags: patch

[X-Debbugs-Cc to libcon...@packages.debian.org]

A binNMU of lierolibre was attempted for the libconfig C++ ABI transition.
Unfortunately, this failed, with a lot of errors like this:

src/common.cpp: In member function 'void 
Texts::loadFromCFG(std::__cxx11::string)':
src/common.cpp:165:38: error: no match for 'operator[]' (operand types are 
'const libconfig::Setting' and 'std::__cxx11::basic_string<char>')
   gameModes[i] = (char const*)sgmodes["gameModes" + to_string(i)];
                                      ^
In file included from src/common.hpp:41:0,
                 from src/common.cpp:28:
/usr/include/libconfig.h++:223:13: note: candidate: libconfig::Setting& 
libconfig::Setting::operator[](const char*) const
   Setting & operator[](const char *name) const;
             ^
/usr/include/libconfig.h++:223:13: note:   no known conversion for argument 1 
from 'std::__cxx11::basic_string<char>' to 'const char*'
/usr/include/libconfig.h++:224:13: note: candidate: libconfig::Setting& 
libconfig::Setting::operator[](int) const
   Setting & operator[](int index) const;
             ^
/usr/include/libconfig.h++:224:13: note:   no known conversion for argument 1 
from 'std::__cxx11::basic_string<char>' to 'int'

This seems to be a deliberate change in libconfig 1.5. There used to be
an inline operator[](const std::string &), but it was removed:

> Note: `operator[]` had to remain as `const char*` to avoid ambiguities
>       in some situations.
<https://github.com/hyperrealm/libconfig/commit/1ff9b7f9a2df1abbb5781b78d4065fa22bc5fad6>

I'm not sure why the NMU of libconfig included a new upstream version,
but it's happened now.

I attach a patch which compiles. I have not tested it.

Regards,
    S
From: Simon McVittie <s...@debian.org>
Date: Fri, 14 Aug 2015 00:27:56 +0100
Subject: Adapt to libconfig 1.5

Setting::operator[](const std::string &) is no longer available.
---
 src/common.cpp       | 18 ++++++++++++------
 src/configCompat.cpp |  6 +++---
 src/configHelper.cpp | 12 +++++-------
 src/constants.cpp    |  6 +++---
 src/gfx/palette.cpp  |  9 ++++++---
 5 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/src/common.cpp b/src/common.cpp
index 2d6ada5..9508a37 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -162,7 +162,8 @@ void Texts::loadFromCFG(std::string cfgFilePath)
 	const libconfig::Setting &sgmodes = texts["gameModes"];
 	for(int i = 0; i < 4; ++i)
 	{
-		gameModes[i] = (char const*)sgmodes["gameModes" + to_string(i)];
+		std::string key("gameModes" + to_string(i));
+		gameModes[i] = (char const*)sgmodes[key.c_str()];
 	}
 
 	const libconfig::Setting &sgmspec = texts["gameModeSpec"];
@@ -181,13 +182,15 @@ void Texts::loadFromCFG(std::string cfgFilePath)
 	const libconfig::Setting &swstates = texts["weapStates"];
 	for(int i = 0; i < 3; ++i)
 	{
-		 weapStates[i] = (char const*)swstates["weapStates" + to_string(i)];
+		 std::string key("weapStates" + to_string(i));
+		 weapStates[i] = (char const*)swstates[key.c_str()];
 	}
 
 	const libconfig::Setting &sknames = texts["keyNames"];
 	for(int i = 1; i < 177; ++i) // First key starts at 1
 	{
-		keyNames[i] = (char const*)sknames["keyNames" + to_string(i)];
+		std::string key("keyNames" + to_string(i));
+		keyNames[i] = (char const*)sknames[key.c_str()];
 	}
 
 	selWeap = (char const*)texts["selWeap"];
@@ -315,8 +318,10 @@ void Common::loadPaletteFromCFG(std::string cfgFilePath)
 	const libconfig::Setting &scanim = palette["colorAnim"];
 	for(int i = 0; i < 4; ++i)
 	{
-		colorAnim[i].from = (int)scanim["colorAnim" + to_string(i) + "from"];
-		colorAnim[i].to = (int)scanim["colorAnim" + to_string(i) + "to"];
+		std::string key("colorAnim" + to_string(i) + "from");
+		colorAnim[i].from = (int)scanim[key.c_str()];
+		key = "colorAnim" + to_string(i) + "to";
+		colorAnim[i].to = (int)scanim[key.c_str()];
 	}
 }
 
@@ -383,7 +388,8 @@ void Common::loadMaterialsFromCFG(std::string cfgFilePath)
 
 	for(int i = 0; i < 256; ++i)
 	{
-		const libconfig::Setting &smflags = smaterials["flags" + to_string(i)];
+		std::string key("flags" + to_string(i));
+		const libconfig::Setting &smflags = smaterials[key.c_str()];
 		materials[i].flags = smflags;
 	}
 }
diff --git a/src/configCompat.cpp b/src/configCompat.cpp
index 1aeb262..a72c40f 100644
--- a/src/configCompat.cpp
+++ b/src/configCompat.cpp
@@ -160,19 +160,19 @@ void Common::loadConstantsFromCFGVer0(string cfgFilePath)
 	const Setting &vconstants = constants["Values"];
 	for(int i = 0; i < MaxC; ++i)
 	{
-		C[i] = (int)vconstants[valueConstantsNamesCFGVer0[i]];
+		C[i] = (int)vconstants[valueConstantsNamesCFGVer0[i].c_str()];
 	}
 
 	const Setting &sconstants = constants["Strings"];
 	for(int i = 0; i < MaxS; ++i)
 	{
-		S[i]= (char const*)sconstants[stringConstantsNamesCFGVer0[i]];
+		S[i]= (char const*)sconstants[stringConstantsNamesCFGVer0[i].c_str()];
 	}
 
 	const Setting &hconstants = constants["Hacks"];
 	for(int i = 0; i < MaxH; ++i)
 	{
-		H[i] = (bool)hconstants[hackConstantsNamesVer0[i]];
+		H[i] = (bool)hconstants[hackConstantsNamesVer0[i].c_str()];
 	}
 }
 
diff --git a/src/configHelper.cpp b/src/configHelper.cpp
index fcd1f3f..6d9244e 100644
--- a/src/configHelper.cpp
+++ b/src/configHelper.cpp
@@ -54,14 +54,12 @@ template Uint8 ConfigHelper::getValue<Uint8, const Setting, int>(const Setting &
 
 template Uint8 ConfigHelper::getValue<Uint8, const Setting, char const*>(const Setting &node, char const* index);
 
-template Uint8 ConfigHelper::getValue<Uint8, const Setting, string>(const Setting &node, string index);
 
 // Non-const
 template Uint8 ConfigHelper::getValue<Uint8, Setting, int>(Setting &node, int index);
 
 template Uint8 ConfigHelper::getValue<Uint8, Setting, char const*>(Setting &node, char const* index);
 
-template Uint8 ConfigHelper::getValue<Uint8, Setting, string>(Setting &node, string index);
 
 
 // Since we still need specialisation per value type (Setting::Type),
@@ -72,7 +70,7 @@ void ConfigHelper::put(Setting &node, string variable, string value)
 	{
 		node.add(variable, Setting::TypeString) = value;
 	} else {
-		Setting &var = node[variable];
+		Setting &var = node[variable.c_str()];
 		var = value;
 	}
 }
@@ -83,7 +81,7 @@ void ConfigHelper::put(Setting &node, string variable, int value)
 	{
 		node.add(variable, Setting::TypeInt) = value;
 	} else {
-		Setting &var = node[variable];
+		Setting &var = node[variable.c_str()];
 		var = value;
 	}
 }
@@ -94,7 +92,7 @@ void ConfigHelper::put(Setting &node, string variable, Uint8 value)
 	{
 		node.add(variable, Setting::TypeInt) = value;
 	} else {
-		Setting &var = node[variable];
+		Setting &var = node[variable.c_str()];
 		var = value;
 	}
 }
@@ -105,7 +103,7 @@ void ConfigHelper::put(Setting &node, string variable, bool value)
 	{
 		node.add(variable, Setting::TypeBoolean) = value;
 	} else {
-		Setting &var = node[variable];
+		Setting &var = node[variable.c_str()];
 		var = value;
 	}
 }
@@ -135,6 +133,6 @@ Setting& ConfigHelper::getSubgroup(Setting &node, string groupName)
 	{
 		node.add(groupName, Setting::TypeGroup);
 	}
-	return node[groupName];
+	return node[groupName.c_str()];
 }
 
diff --git a/src/constants.cpp b/src/constants.cpp
index 7fced6a..cf7bbfc 100644
--- a/src/constants.cpp
+++ b/src/constants.cpp
@@ -523,19 +523,19 @@ void Common::loadConstantsFromCFG(std::string cfgFilePath)
 	const libconfig::Setting &vconstants = constants["Values"];
 	for(int i = 0; i < MaxC; ++i)
 	{
-		C[i] = (int)vconstants[valueConstantsNames[i]];
+		C[i] = (int)vconstants[valueConstantsNames[i].c_str()];
 	}
 
 	const libconfig::Setting &sconstants = constants["Strings"];
 	for(int i = 0; i < MaxS; ++i)
 	{
-		S[i]= (char const*)sconstants[stringConstantsNames[i]];
+		S[i]= (char const*)sconstants[stringConstantsNames[i].c_str()];
 	}
 
 	const libconfig::Setting &hconstants = constants["Hacks"];
 	for(int i = 0; i < MaxH; ++i)
 	{
-		H[i] = (bool)hconstants[hackConstantsNames[i]];
+		H[i] = (bool)hconstants[hackConstantsNames[i].c_str()];
 	}
 }
 
diff --git a/src/gfx/palette.cpp b/src/gfx/palette.cpp
index 3fd08c4..cde0267 100644
--- a/src/gfx/palette.cpp
+++ b/src/gfx/palette.cpp
@@ -124,9 +124,12 @@ void Palette::readFromCFG(std::string cfgFilePath)
 
 	for(int i = 0; i < 256; ++i)
 	{
-		entries[i].r = cfgHelp.getValue<Uint8>(spentries, "entries" + to_string(i) + "r");
-		entries[i].g = cfgHelp.getValue<Uint8>(spentries, "entries" + to_string(i) + "g");
-		entries[i].b = cfgHelp.getValue<Uint8>(spentries, "entries" + to_string(i) + "b");
+		std::string idx("entries" + to_string(i) + "r");
+		entries[i].r = cfgHelp.getValue<Uint8>(spentries, idx.c_str());
+		idx = "entries" + to_string(i) + "g";
+		entries[i].g = cfgHelp.getValue<Uint8>(spentries, idx.c_str());
+		idx = "entries" + to_string(i) + "b";
+		entries[i].b = cfgHelp.getValue<Uint8>(spentries, idx.c_str());
 	}
 }
 

Reply via email to