Merge pull request #763 from ennorehling/libdb

smarter cmake with db-select options
This commit is contained in:
Enno Rehling 2018-02-02 19:49:37 +01:00 committed by GitHub
commit ce0ac9b6a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 152 additions and 129 deletions

View File

@ -38,8 +38,12 @@ else (MSVC)
find_package (Curses)
endif (MSVC)
find_package (SQLite3)
find_package (BerkeleyDB)
if (ERESSEA_DB STREQUAL "db")
find_package (BerkeleyDB REQUIRED QUIET)
else()
find_package (SQLite3 REQUIRED QUIET)
endif()
find_package (LibXml2 REQUIRED)
find_package (ToLua REQUIRED)
if (TOLUA_FOUND)

View File

@ -31,15 +31,18 @@ if [ ! -d $ROOT/$BUILD ]; then
fi
echo "build eressea"
CMAKE_ARGS=".."
cd $ROOT/$BUILD
BRANCH=$(git status -s -b | head -1 | cut -d\ -f 2 | sed 's/\..*//')
if [ "$BRANCH" = "master" ] ; then
VERSION=$(git describe --match 'v*.*.*' --tags | sed 's/^v//')
echo "$BRANCH $VERSION"
cmake -DERESSEA_VERSION="$VERSION" ..
CMAKE_ARGS="-DERESSEA_VERSION=$VERSION ${CMAKE_ARGS}"
else
REV=$(git rev-parse --short HEAD)
cmake -DERESSEA_BUILDNO="$REV" ..
CMAKE_ARGS="-DERESSEA_BUILDNO=$REV $CMAKE_ARGS"
fi
cmake ${CMAKE_ARGS}
make $MAKEOPTS && make test
cd $OLDPWD

View File

@ -1,5 +1,20 @@
#!/bin/sh
ERESSEA_DB=sqlite
if [ -e /usr/include/db.h ] ; then
ERESSEA_DB=db
fi
# Parse command line arguments
while [ ! -z "$1" ] ; do
if [ "$1" = "--with-db" ] ; then
ERESSEA_DB=db
elif [ "$1" = "--with-sqlite" ] ; then
ERESSEA_DB=sqlite
fi
shift 1
done
ROOT=$(git rev-parse --show-toplevel)
[ -z $BUILD ] && BUILD=Debug
[ -z "$CC" ] && [ ! -z `which clang` ] && CC="clang"
@ -15,8 +30,6 @@ mkdir -p $BIN_DIR
rm -f $BUILD
ln -sf $BIN_DIR $BUILD
rm -f CMakeCache.txt
# use anything installed in /opt or /usr
LIBRARY_PATH=/opt/lib:/opt/lib/$MACHINE:/usr/lib/$MACHINE
INCLUDE_PATH=/opt/include:/usr/include
@ -30,11 +43,6 @@ if [ -d $HOME/usr ]; then
fi
DEST=$(dirname $ROOT)/server
ARGS=" -DCMAKE_BUILD_TYPE=$BUILD \
-DCMAKE_LIBRARY_PATH=$LIBRARY_PATH \
-DCMAKE_PREFIX_PATH=$PREFIX_PATH \
-DCMAKE_INSTALL_PREFIX=$DEST"
# -DCMAKE_INCLUDE_PATH=$INCLUDE_PATH
git submodule update --init
@ -46,7 +54,17 @@ elif [ -d /usr/local/include/lua5.1 ]; then
LUA_DIR=/usr/local
LUA_VERSION="5.1"
fi
export LUA_DIR
cat >| $BUILD/config.cmake <<HEREDOC
SET (ERESSEA_DB "$ERESSEA_DB" CACHE STRING "Database driver")
SET (LUA_DIR "$LUA_DIR" CACHE PATH "Lua root path")
SET (CMAKE_BUILD_TYPE "$BUILD" FORCE)
SET (CMAKE_INSTALL_PREFIX "$DEST" CACHE PATH "")
SET (CMAKE_LIBRARY_PATH "$LIBRARY_PATH" CACHE PATH "")
SET (CMAKE_PREFIX_PATH "$PREFIX_PATH" CACHE PATH "")
HEREDOC
#echo 'SET (LUA_DIR "$LUA_DIR" PATH)' >> $BUILD/config.cmake
path="$(which tolua)"
if [ "$HAVE_TOLUA" = "0" ] || [ -z $path ] ; then
@ -59,7 +77,7 @@ if [ "$HAVE_TOLUA" = "0" ] || [ -z $path ] ; then
echo "building tolua..."
cd tolua
make
ARGS="$ARGS -DPC_TOLUA_DIR=$ROOT/tolua"
echo 'SET(PC_TOLUA_DIR "$ROOT/tolua" CACHE PATH "tolua root")' >> $BUILD/config.cmake
else
echo "tolua is $path"
fi
@ -68,6 +86,6 @@ unset path
set -e
cd $BIN_DIR
cmake .. $ARGS $*
cmake -C config.cmake .. $*
cd $OLDPWD

View File

@ -129,7 +129,6 @@ function process(rules, orders)
end
turn_begin()
init_summary()
-- run the turn:
if eressea.read_orders(orders) ~= 0 then

View File

@ -518,26 +518,15 @@ static int tolua_write_passwords(lua_State * L)
return 0;
}
static struct summary *sum_begin = 0;
static int tolua_init_summary(lua_State * L)
{
UNUSED_ARG(L);
sum_begin = make_summary();
return 0;
}
static int tolua_write_summary(lua_State * L)
{
struct summary *sum;
UNUSED_ARG(L);
if (sum_begin) {
struct summary *sum_end = make_summary();
report_summary(sum_end, sum_begin, false);
report_summary(sum_end, sum_begin, true);
free_summary(sum_end);
free_summary(sum_begin);
sum_begin = 0;
return 0;
}
sum = make_summary();
report_summary(sum, false);
report_summary(sum, true);
free_summary(sum);
return 0;
}
/*
@ -1073,7 +1062,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile)
tolua_function(L, TOLUA_CAST "init_reports", tolua_init_reports);
tolua_function(L, TOLUA_CAST "write_reports", tolua_write_reports);
tolua_function(L, TOLUA_CAST "write_report", tolua_write_report);
tolua_function(L, TOLUA_CAST "init_summary", tolua_init_summary);
tolua_function(L, TOLUA_CAST "write_summary", tolua_write_summary);
tolua_function(L, TOLUA_CAST "write_passwords", tolua_write_passwords);
tolua_function(L, TOLUA_CAST "message_unit", tolua_message_unit);

View File

@ -32,6 +32,7 @@
#include <util/lists.h>
#include <util/log.h>
#include <util/path.h>
#include <util/unicode.h>
#include <assert.h>
#include <string.h>
@ -52,8 +53,8 @@ typedef struct summary {
int peasants;
int nunits;
int playerpop;
double playermoney;
double peasantmoney;
long long int playermoney;
long long int peasantmoney;
int armed_men;
int poprace[MAXRACES];
int factionrace[MAXRACES];
@ -111,22 +112,6 @@ int update_nmrs(void)
return newplayers;
}
static char *pcomp(double i, double j)
{
static char buf[32];
sprintf(buf, "%.0f (%s%.0f)", i, (i >= j) ? "+" : "", i - j);
return buf;
}
static char *rcomp(int i, int j)
{
static char buf[32];
sprintf(buf, "%d (%s%d,%s%d%%)",
i, (i >= j) ? "+" : "", i - j, (i >= j) ? "+" : "",
j ? ((i - j) * 100) / j : 0);
return buf;
}
static void out_faction(FILE * file, const struct faction *f)
{
if (alliances != NULL) {
@ -185,10 +170,73 @@ static void writeturn(void)
fclose(f);
}
void report_summary(summary * s, summary * o, bool full)
static int count_umlaut(const char *s)
{
int result = 0;
const char *cp;
for (cp = s; *cp; ++cp) {
ucs4_t ucs = *cp;
if (ucs & 0x80) {
size_t size;
++result;
unicode_utf8_to_ucs4(&ucs, cp, &size);
cp += size;
}
}
return result;
}
static void summarize_races(const summary *s, FILE *F, bool full) {
int i;
for (i = 0; i < MAXRACES; i++) {
if (s->poprace[i] > 0) {
const char *pad = " ";
int lpad = (int)strlen(pad);
const race *rc = get_race(i);
const char *rcname = LOC(default_locale, rc_name_s(rc, NAME_PLURAL));
lpad -= count_umlaut(rcname);
assert(lpad >= 0);
if (full) {
fputs(pad + lpad, F);
fprintf(F, "%20s: ", rcname);
fprintf(F, "%8d\n", s->poprace[i]);
}
else if (i != RC_TEMPLATE && i != RC_CLONE) {
if (playerrace(rc)) {
fputs(pad + lpad, F);
fprintf(F, "%16s: ", rcname);
fprintf(F, "%8d\n", s->poprace[i]);
}
}
}
}
}
static void summarize_players(const summary *s, FILE *F) {
int i;
const char * suffix = LOC(default_locale, "stat_tribe_p");
for (i = 0; i < MAXRACES; i++) {
if (i != RC_TEMPLATE && i != RC_CLONE && s->factionrace[i]) {
const race *rc = get_race(i);
if (rc && playerrace(rc)) {
const char * pad = " ";
int lpad = (int)strlen(pad);
const char *rccat = LOC(default_locale, rc_name_s(rc, NAME_CATEGORY));
lpad -= count_umlaut(rccat);
assert(lpad >= 0);
fputs(pad + lpad, F);
fprintf(F, "%16s%s:", rccat, suffix);
fprintf(F, "%8d\n", s->factionrace[i]);
}
}
}
}
void report_summary(const summary * s, bool full)
{
FILE *F = NULL;
int i, newplayers = 0;
int newplayers = 0;
faction *f;
char zText[4096];
int timeout = NMRTimeout();
@ -212,120 +260,82 @@ void report_summary(summary * s, summary * o, bool full)
#endif
log_info("writing summary to file: parteien.\n");
fprintf(F, "%s\n%s\n\n", game_name(), gamedate2(default_locale));
fprintf(F, "Auswertung Nr: %d\n\n", turn);
fprintf(F, "Parteien: %s\n", pcomp(s->factions, o->factions));
fprintf(F, "Einheiten: %s\n", pcomp(s->nunits, o->nunits));
fprintf(F, "Spielerpopulation: %s\n", pcomp(s->playerpop, o->playerpop));
fprintf(F, " davon bewaffnet: %s\n", pcomp(s->armed_men, o->armed_men));
fprintf(F, " Helden: %s\n", pcomp(s->heroes, o->heroes));
fprintf(F, "Auswertung Nr: %8d\n\n", turn);
fprintf(F, "Parteien: %8d\n", s->factions);
fprintf(F, "Einheiten: %8d\n", s->nunits);
fprintf(F, "Spielerpopulation: %8d\n", s->playerpop);
fprintf(F, " davon bewaffnet: %8d\n", s->armed_men);
fprintf(F, " Helden: %8d\n", s->heroes);
if (full) {
fprintf(F, "Regionen: %d\n", (int)listlen(regions));
fprintf(F, "Bewohnte Regionen: %d\n", s->inhabitedregions);
fprintf(F, "Landregionen: %d\n", s->landregionen);
fprintf(F, "Spielerregionen: %d\n", s->regionen_mit_spielern);
fprintf(F, "Landspielerregionen: %d\n", s->landregionen_mit_spielern);
fprintf(F, "Inaktive Vulkane: %d\n", s->inactive_volcanos);
fprintf(F, "Aktive Vulkane: %d\n\n", s->active_volcanos);
fprintf(F, "Regionen: %8d\n", (int)listlen(regions));
fprintf(F, "Bewohnte Regionen: %8d\n", s->inhabitedregions);
fprintf(F, "Landregionen: %8d\n", s->landregionen);
fprintf(F, "Spielerregionen: %8d\n", s->regionen_mit_spielern);
fprintf(F, "Landspielerregionen: %8d\n", s->landregionen_mit_spielern);
fprintf(F, "Inaktive Vulkane: %8d\n", s->inactive_volcanos);
fprintf(F, "Aktive Vulkane: %8d\n\n", s->active_volcanos);
}
for (i = 0; i < MAXRACES; i++) {
if (i != RC_TEMPLATE && i != RC_CLONE && s->factionrace[i]) {
const race *rc = get_race(i);
if (rc && playerrace(rc)) {
fprintf(F, "%13s%s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_CATEGORY)),
LOC(default_locale, "stat_tribe_p"), pcomp(s->factionrace[i],
o->factionrace[i]));
}
}
}
summarize_players(s, F);
if (full) {
fprintf(F, "\n");
{
struct language *plang = s->languages;
while (plang != NULL) {
struct language *olang = o->languages;
int nold = 0;
while (olang && olang->locale != plang->locale)
olang = olang->next;
if (olang)
nold = olang->number;
fprintf(F, "Sprache %12s: %s\n", locale_name(plang->locale),
rcomp(plang->number, nold));
fprintf(F, "Sprache %2s: %8d\n", locale_name(plang->locale),
plang->number);
plang = plang->next;
}
}
}
fprintf(F, "\n");
if (full) {
for (i = 0; i < MAXRACES; i++) {
if (s->poprace[i]) {
const race *rc = get_race(i);
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_PLURAL)),
rcomp(s->poprace[i], o->poprace[i]));
}
}
}
else {
for (i = 0; i < MAXRACES; i++) {
if (i != RC_TEMPLATE && i != RC_CLONE && s->poprace[i]) {
const race *rc = get_race(i);
if (playerrace(rc)) {
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_PLURAL)),
rcomp(s->poprace[i], o->poprace[i]));
}
}
}
}
summarize_races(s, F, full);
if (full) {
fprintf(F, "\nWaffen: %s\n", pcomp(s->waffen, o->waffen));
fprintf(F, "Ruestungen: %s\n",
pcomp(s->ruestungen, o->ruestungen));
fprintf(F, "ungezaehmte Pferde: %s\n", pcomp(s->pferde, o->pferde));
fprintf(F, "gezaehmte Pferde: %s\n",
pcomp(s->spielerpferde, o->spielerpferde));
fprintf(F, "Schiffe: %s\n", pcomp(s->schiffe, o->schiffe));
fprintf(F, "Gebaeude: %s\n", pcomp(s->gebaeude, o->gebaeude));
fprintf(F, "\nWaffen: %8d\n", s->waffen);
fprintf(F, "Ruestungen: %8d\n", s->ruestungen);
fprintf(F, "ungezaehmte Pferde: %8d\n", s->pferde);
fprintf(F, "gezaehmte Pferde: %8d\n", s->spielerpferde);
fprintf(F, "Schiffe: %8d\n", s->schiffe);
fprintf(F, "Gebaeude: %8d\n", s->gebaeude);
fprintf(F, "\nBauernpopulation: %s\n", pcomp(s->peasants, o->peasants));
fprintf(F, "\nBauernpopulation: %8d\n", s->peasants);
fprintf(F, "Population gesamt: %d\n\n", s->playerpop + s->peasants);
fprintf(F, "Population gesamt: %8d\n\n", s->playerpop + s->peasants);
fprintf(F, "Reichtum Spieler: %s Silber\n",
pcomp(s->playermoney, o->playermoney));
fprintf(F, "Reichtum Bauern: %s Silber\n",
pcomp(s->peasantmoney, o->peasantmoney));
fprintf(F, "Reichtum gesamt: %s Silber\n\n",
pcomp(s->playermoney + s->peasantmoney,
o->playermoney + o->peasantmoney));
fprintf(F, "Reichtum Spieler: %12lld Silber\n", s->playermoney);
fprintf(F, "Reichtum Bauern: %12lld Silber\n", s->peasantmoney);
fprintf(F, "Reichtum gesamt: %12lld Silber\n\n",
s->playermoney + s->peasantmoney);
}
fprintf(F, "\n\n");
fprintf(F, "\n");
newplayers = update_nmrs();
if (nmrs) {
int i;
for (i = 0; i <= timeout; ++i) {
if (i == timeout) {
fprintf(F, "+ NMR:\t\t %d\n", nmrs[i]);
fprintf(F, "+ NMR: %3d\n", nmrs[i]);
}
else {
fprintf(F, "%d NMR:\t\t %d\n", i, nmrs[i]);
fprintf(F, "%d NMR: %3d\n", i, nmrs[i]);
}
}
}
if (age) {
if (age[2] != 0) {
fprintf(F, "Erstabgaben:\t %d%%\n", 100 - (dropouts[0] * 100 / age[2]));
fprintf(F, "Erstabgaben: %3d%%\n", 100 - (dropouts[0] * 100 / age[2]));
}
if (age[3] != 0) {
fprintf(F, "Zweitabgaben:\t %d%%\n", 100 - (dropouts[1] * 100 / age[3]));
fprintf(F, "Zweitabgaben: %3d%%\n", 100 - (dropouts[1] * 100 / age[3]));
}
}
fprintf(F, "Neue Spieler:\t %d\n", newplayers);
fprintf(F, "Neue Spieler: %d\n", newplayers);
if (full) {
if (factions) {
@ -336,6 +346,7 @@ void report_summary(summary * s, summary * o, bool full)
}
if (timeout>0 && full) {
int i;
fprintf(F, "\n\nFactions with NMRs:\n");
for (i = timeout; i > 0; --i) {
for (f = factions; f; f = f->next) {

View File

@ -19,7 +19,7 @@ extern "C" {
struct summary;
void report_summary(struct summary *n, struct summary *o, bool full);
void report_summary(const struct summary *sum, bool full);
struct summary *make_summary(void);
void free_summary(struct summary *sum);
int update_nmrs(void);

View File

@ -15,7 +15,7 @@ static void test_summary(CuTest * tc)
test_create_faction(NULL);
test_create_faction(NULL);
sum = make_summary();
report_summary(sum, sum, true);
report_summary(sum, true);
CuAssertIntEquals(tc, 0, remove("parteien.full"));
CuAssertIntEquals(tc, 0, remove("datum"));
CuAssertIntEquals(tc, 0, remove("turn"));