summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2013-08-05 18:31:50 -0700
committerBen Longbons <b.r.longbons@gmail.com>2013-08-05 18:40:24 -0700
commitfb1e500e572774131d0891018332fc625b6a4c52 (patch)
tree0121538ef76a719bb320088013a629b7ffb87c1a
parent09f72397156edb97631209c4cac765364f420bd3 (diff)
downloadtmwa-fb1e500e572774131d0891018332fc625b6a4c52.tar.gz
tmwa-fb1e500e572774131d0891018332fc625b6a4c52.tar.bz2
tmwa-fb1e500e572774131d0891018332fc625b6a4c52.tar.xz
tmwa-fb1e500e572774131d0891018332fc625b6a4c52.zip
Use attoconf and proper versionsv13.8.5
-rw-r--r--.gitignore2
-rw-r--r--.gitmodules3
-rw-r--r--.travis.yml4
-rw-r--r--Makefile.in (renamed from Makefile)21
l---------attoconf1
-rwxr-xr-xconfigure72
m---------deps/attoconf0
-rw-r--r--make.defs11
-rw-r--r--src/char/char.cpp8
-rw-r--r--src/common/version.hpp77
-rw-r--r--src/ladmin/ladmin.cpp39
-rw-r--r--src/login/login.cpp18
-rw-r--r--src/map/clif.cpp8
13 files changed, 178 insertions, 86 deletions
diff --git a/.gitignore b/.gitignore
index e27b0e0..19569c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@
/deps.make
# tags file
/tags
+# generated by configure
+/Makefile
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..a07e803
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "deps/attoconf"]
+ path = deps/attoconf
+ url = git://github.com/o11c/attoconf.git
diff --git a/.travis.yml b/.travis.yml
index f15f9d0..8717748 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,6 +15,7 @@ notifications:
channels: "chat.freenode.net#tmwa"
on_success: always
on_failure: always
+ use_notice: true
## Commands before installing prerequisites
# before_install: git submodule update --init --recursive
@@ -37,7 +38,8 @@ install:
## Main test script
script:
- - make -k -j2 CXX=${REAL_CXX}\ -fabi-version=6 CPPFLAGS=-DQUIET
+ - ./configure CXX=${REAL_CXX}\ -fabi-version=6 CPPFLAGS=-DQUIET
+ - make -k -j2
## Do something after the main test script
after_script:
diff --git a/Makefile b/Makefile.in
index 44b3fc2..d216b50 100644
--- a/Makefile
+++ b/Makefile.in
@@ -1,4 +1,11 @@
-#! /usr/bin/make -f
+ifneq (${SRC_DIR},.)
+$(error out-of-tree builds not supported yet, sorry)
+endif
+# but there are bits working toward it
+
+vpath %.cpp ${SRC_DIR}
+vpath %.hpp ${SRC_DIR}
+
SHELL=/bin/bash
BUILD_DIR = obj
default: login-server char-server map-server ladmin eathena-monitor
@@ -18,7 +25,7 @@ include make.defs
# The default recipe is suboptimal
%.cpp: %.lpp
- $(LEX) -o $@ $<
+ $(FLEX) -o $@ $<
%.cpp %.h: %.ypp
$(BISON) -d -o $*.cpp $<
@@ -81,19 +88,17 @@ ${BUILD_DIR}/map/magic-interpreter-lexer.o ${BUILD_DIR}/map/magic-interpreter-pa
# deps.make is *NOT* automatically rebuilt normally
# but the generated source files do need to be done first
-deps.make: src/map/magic-interpreter-parser.cpp src/map/magic-interpreter-lexer.cpp
- for F in `find src/ -name '*.cpp'`; do \
+deps.make: ${SRC_DIR}/src/map/magic-interpreter-parser.cpp ${SRC_DIR}/src/map/magic-interpreter-lexer.cpp
+ for F in `cd ${SRC_DIR}; find src/ -name '*.cpp'`; do \
${CXX} ${CPPFLAGS} -MM "$$F" -MT "$$(sed 's/src/$${BUILD_DIR}/;s/\.cpp/.o/' <<< "$$F")"; \
done > deps.make
echo '# vim: filetype=make' >> deps.make
include deps.make
-prefix=/usr/local
-BACKUPS=numbered
install:
- install -d ${prefix}/bin/
- install --backup=${BACKUPS} -t ${prefix}/bin/ $(wildcard ${PROGS})
+ install -d ${BINDIR}
+ install --backup=${ENABLE_BACKUPS_DURING_INSTALL} -t ${BINDIR} $(wildcard ${PROGS})
# might need changes later to handle static declarations (solution:
# run ctags twice, specifying forward patterns for the declarations
diff --git a/attoconf b/attoconf
new file mode 120000
index 0000000..320176d
--- /dev/null
+++ b/attoconf
@@ -0,0 +1 @@
+deps/attoconf/attoconf/ \ No newline at end of file
diff --git a/configure b/configure
new file mode 100755
index 0000000..f28b002
--- /dev/null
+++ b/configure
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+
+# Copyright 2013 Ben Longbons <b.r.longbons@gmail.com>
+#
+# This file is part of The Mana World (Athena server)
+#
+# attoconf is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# attoconf is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with attoconf. If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import print_function, division, absolute_import
+
+import os
+import subprocess
+import sys
+
+from attoconf.version import require_version
+require_version(0, 3)
+
+from attoconf.classy import add_slots
+from attoconf.lib.c import Cxx
+from attoconf.lib.lex import Flex
+from attoconf.lib.yacc import Bison
+from attoconf.lib.install import Install
+from attoconf.lib.make import Make
+from attoconf.types import enum
+
+
+def get_version(srcdir):
+ return subprocess.check_output(
+ ['git', 'describe', '--tags'],
+ cwd=srcdir).strip()
+
+
+@add_slots
+class Configuration(Cxx, Flex, Bison, Install, Make):
+ def general(self):
+ super(Configuration, self).general()
+ home = os.path.expanduser('~')
+ self.add_alias('--user', ['--prefix=%s' % home],
+ help='alias for --prefix=$HOME', hidden=False)
+
+ def features(self):
+ super(Configuration, self).features()
+ # TODO: check VERSION_CONTROL environment variable?
+ # not really important: this option is only to make Frost happy
+ self.add_option('--enable-backups-during-install', init='none',
+ type=enum('none', 'numbered', 'existing', 'simple'), check=None,
+ help='Back up existing files during \'make install\'', hidden=True,
+ help_var='CONTROL')
+
+
+def main():
+ srcdir = os.path.dirname(sys.argv[0])
+ proj = Configuration(srcdir)
+ proj.set_package('tmwa', get_version(srcdir), 'The Mana World (Athena server)')
+ proj.jiggle()
+ build = proj.build('.')
+ build.configure(sys.argv[1:], os.environ)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/deps/attoconf b/deps/attoconf
new file mode 160000
+Subproject 46e9b987ff689c1acfe29c7b980298408d1b95a
diff --git a/make.defs b/make.defs
index 0f35244..22579f1 100644
--- a/make.defs
+++ b/make.defs
@@ -1,14 +1,7 @@
# vim: filetype=make
#
-# defaults
-CXX = g++
-
-LEX = flex
-BISON = bison
-CXXFLAGS = ${DEBUG} ${OPT} ${WARNINGS}
-# these being separate use useful for development
-DEBUG = -g
-OPT = -pipe -O2
+# This file is deprecated. Everything here should be moved to 'configure'.
+CXXFLAGS += ${WARNINGS}
WARNINGS = -include src/warnings.hpp
# Location of gtest source tree. It must contain the file src/gtest-all.cc
diff --git a/src/char/char.cpp b/src/char/char.cpp
index 6108dca..fb1ca7d 100644
--- a/src/char/char.cpp
+++ b/src/char/char.cpp
@@ -2449,13 +2449,7 @@ void parse_char(int fd)
case 0x7530: // Athena情報所得
WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd, 4) = ATHENA_REVISION;
- WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
- WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
+ WFIFO_STRUCT(fd, 2, CURRENT_CHAR_SERVER_VERSION);
WFIFOSET(fd, 10);
RFIFOSKIP(fd, 2);
return;
diff --git a/src/common/version.hpp b/src/common/version.hpp
index d72f41e..4bdaa29 100644
--- a/src/common/version.hpp
+++ b/src/common/version.hpp
@@ -1,24 +1,61 @@
-/// Some constants to identify the version of (e)Athena
-/// The values are different if the client connects (-1,'T','M','W',flags32)
-// These numbers have never been changed while TMW
#ifndef VERSION_HPP
#define VERSION_HPP
-//When a server receives a 0x7530 packet from an admin connection,
-//it sends an 0x7531 packet with the following bytes
-# define ATHENA_MAJOR_VERSION 1 // Major Version
-# define ATHENA_MINOR_VERSION 0 // Minor Version
-# define ATHENA_REVISION 0 // Revision
-
-# define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
-# define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
-
-// and a bitmask of these (the char server sends char and inter)
-# define ATHENA_SERVER_LOGIN 1 // login server
-# define ATHENA_SERVER_CHAR 2 // char server
-# define ATHENA_SERVER_INTER 4 // inter server
-# define ATHENA_SERVER_MAP 8 // map server
-
-// and this as two bytes
-# define ATHENA_MOD_VERSION 1052 // mod version (patch No.)
+
+// TODO generate this from ./configure
+
+# define TMWA_VERSION_MAJOR 13
+# define TMWA_VERSION_MINOR 8
+# define TMWA_VERSION_PATCH 5
+# define TMWA_DEVELOP_FLAG 1
+
+// TODO make these bitwise enums
+# define TMWA_FLAG_REGISTRATION 0x01
+
+# define TMWA_SERVER_LOGIN 0x01
+# define TMWA_SERVER_CHAR 0x02
+# define TMWA_SERVER_INTER 0x04
+# define TMWA_SERVER_MAP 0x08
+
+# define TMWA_VENDOR "Vanilla"
+# define TMWA_VENDOR_VERSION 0
+
+struct Version
+{
+ uint8_t major;
+ uint8_t minor; // flavor1
+ uint8_t patch; // flavor2
+ uint8_t devel; // flavor3
+
+ uint8_t flags;
+ uint8_t which;
+ uint16_t vend;
+ // can't add vendor name yet
+};
+static_assert(sizeof(Version) == 8, "this is send over the network, can't change");
+
+constexpr Version CURRENT_LOGIN_SERVER_VERSION =
+{
+ TMWA_VERSION_MAJOR, TMWA_VERSION_MINOR, TMWA_VERSION_PATCH,
+ TMWA_DEVELOP_FLAG,
+
+ 0, TMWA_SERVER_LOGIN,
+ TMWA_VENDOR_VERSION,
+};
+constexpr Version CURRENT_CHAR_SERVER_VERSION =
+{
+ TMWA_VERSION_MAJOR, TMWA_VERSION_MINOR, TMWA_VERSION_PATCH,
+ TMWA_DEVELOP_FLAG,
+
+ 0, TMWA_SERVER_CHAR | TMWA_SERVER_INTER,
+ TMWA_VENDOR_VERSION,
+};
+constexpr Version CURRENT_MAP_SERVER_VERSION =
+{
+ TMWA_VERSION_MAJOR, TMWA_VERSION_MINOR, TMWA_VERSION_PATCH,
+ TMWA_DEVELOP_FLAG,
+
+ 0, TMWA_SERVER_MAP,
+ TMWA_VENDOR_VERSION,
+};
#endif // VERSION_HPP
diff --git a/src/ladmin/ladmin.cpp b/src/ladmin/ladmin.cpp
index 2581456..9f4691c 100644
--- a/src/ladmin/ladmin.cpp
+++ b/src/ladmin/ladmin.cpp
@@ -1942,28 +1942,18 @@ void parse_fromlogin(int fd)
case 0x7531: // Displaying of the version of the login-server
if (RFIFOREST(fd) < 10)
return;
+ {
Iprintf(" Login-Server [%s:%d]\n", loginserverip,
loginserverport);
- if (RFIFOB(login_fd, 5) == 0)
- {
- Iprintf(" eAthena version stable-%d.%d",
- RFIFOB(login_fd, 2),
- RFIFOB(login_fd, 3));
- }
- else
- {
- Iprintf(" eAthena version dev-%d.%d",
- RFIFOB(login_fd, 2),
- RFIFOB(login_fd, 3));
- }
- if (RFIFOB(login_fd, 4) == 0)
- Iprintf(" revision %d", RFIFOB(login_fd, 4));
- if (RFIFOB(login_fd, 6) == 0)
- {
- Iprintf("%d.\n", RFIFOW(login_fd, 8));
- }
- else
- Iprintf("-mod%d.\n", RFIFOW(login_fd, 8));
+ Version version;
+ RFIFO_STRUCT(login_fd, 2, version);
+ Iprintf(" tmwA version %hhu.%hhu.%hhu (dev? %hhu) (flags %hhx) (which %hhx) (vend %hu)\n",
+ version.major, version.minor, version.patch,
+ version.devel,
+
+ version.flags, version.which,
+ version.vend);
+ }
bytes_to_read = 0;
RFIFOSKIP(fd, 10);
break;
@@ -2872,8 +2862,13 @@ int do_init(int argc, ZString *argv)
set_defaultparse(parse_fromlogin);
Iprintf("EAthena login-server administration tool.\n");
- Iprintf("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION,
- ATHENA_MINOR_VERSION, ATHENA_REVISION);
+ Version version = CURRENT_LOGIN_SERVER_VERSION;
+ Iprintf("for tmwA version %hhu.%hhu.%hhu (dev? %hhu) (flags %hhx) (which %hhx) (vend %hu)\n",
+ version.major, version.minor, version.patch,
+ version.devel,
+
+ version.flags, version.which,
+ version.vend);
LADMIN_LOG("Ladmin is ready.\n");
Iprintf("Ladmin is \033[1;32mready\033[0m.\n\n");
diff --git a/src/login/login.cpp b/src/login/login.cpp
index 852cd3d..031abd7 100644
--- a/src/login/login.cpp
+++ b/src/login/login.cpp
@@ -1654,13 +1654,7 @@ void parse_admin(int fd)
LOGIN_LOG("'ladmin': Sending of the server version (ip: %s)\n",
ip);
WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd, 4) = ATHENA_REVISION;
- WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd, 7) = ATHENA_SERVER_LOGIN;
- WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
+ WFIFO_STRUCT(fd, 2, CURRENT_LOGIN_SERVER_VERSION);
WFIFOSET(fd, 10);
RFIFOSKIP(fd, 2);
break;
@@ -3110,12 +3104,12 @@ void parse_login(int fd)
LOGIN_LOG("Sending of the server version (ip: %s)\n",
ip);
WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = -1;
- WFIFOB(fd, 3) = 'T';
- WFIFOB(fd, 4) = 'M';
- WFIFOB(fd, 5) = 'W';
- WFIFOL(fd, 6) = new_account_flag ? 1 : 0;
+ {
+ Version version = CURRENT_LOGIN_SERVER_VERSION;
+ version.flags = new_account_flag ? 1 : 0;
+ WFIFO_STRUCT(fd, 2, version);
WFIFOSET(fd, 10);
+ }
RFIFOSKIP(fd, 2);
break;
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 494e09f..fa208be 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -5451,13 +5451,7 @@ void clif_parse(int fd)
{
case 0x7530: // Athena情報所得
WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd, 4) = ATHENA_REVISION;
- WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd, 7) = ATHENA_SERVER_MAP;
- WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
+ WFIFO_STRUCT(fd, 2, CURRENT_MAP_SERVER_VERSION);
WFIFOSET(fd, 10);
RFIFOSKIP(fd, 2);
break;