#!/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 sys
try:
from attoconf.version import require_version
except ImportError:
sys.exit('attoconf missing - please run: git submodule update --init')
else:
try:
require_version(0, 9)
except SystemExit as e:
e.code += '\nPlease run: git submodule update'
raise
from attoconf.classy import add_slots
from attoconf.lib.c import Cxx
from attoconf.lib.install import Install
from attoconf.lib.config_hash import ConfigHash
from attoconf.lib.templates import Templates
from attoconf.types import enum, filepath, ShellList
yesno = enum('yes', 'no')
@add_slots
class Configuration(Cxx, Install, ConfigHash, Templates):
def general(self):
super(Configuration, self).general()
home = os.path.expanduser('~')
self.add_alias('--user', ['--prefix=%s' % home, '--enable-rpath=relative'],
help='alias for --prefix=$HOME --enable-rpath=relative', hidden=False)
self.add_alias('--dev', ['--user', '--enable-warnings', '--enable-abi'],
help=None, hidden=False)
def paths(self):
super(Configuration, self).paths()
self.add_option('--debugdir', init='/.',
type=filepath, check=lambda build, DIR: None,
help='root for split debug files (often /usr/lib/debug)', hidden=False,
help_var='DIR')
def features(self):
super(Configuration, self).features()
self.add_bool_feature('warnings', init='no',
check=lambda build, ENABLE_WARNINGS: None,
help='Enable warnings (for development)')
self.add_bool_feature('abi', init='no',
check=lambda build, ENABLE_ABI: None,
help='Force a nonbuggy gcc ABI (for development)')
self.add_bool_feature('cygwin-hacks', init='no',
check=lambda build, ENABLE_CYGWIN_HACKS: None,
help='Work around bugs in certain cygwin versions')
self.add_bool_feature('debug', init='yes',
check=lambda build, ENABLE_DEBUG: None,
help='Install extra files useful for debugging')
self.add_option('--enable-rpath', init='none',
type=enum('none', 'relative', 'absolute'), check=lambda build, ENABLE_RPATH: None,
help='Use rpaths to find libraries', hidden=False)
self.add_bool_feature('shared', init='yes',
check=lambda build, ENABLE_SHARED: None,
help='Build shared libraries instead of static (required for debug, DOES NOT WORK WITH CLANG)')
def vars(self):
super(Configuration, self).vars()
# Why submodule gtest?
# 1) make test requires gtest-all.cc. This file is shipped by Ubuntu,
# but not by Gentoo;
# 2) Modern distros ship gtest-1.13+. It requires C++14+, while
# TMWA is currently a C++0x codebase.
self.add_option('GTEST_DIR',
init=os.path.join(os.getcwd(), 'deps/googletest/googletest'),
# http://code.google.com/p/googletest/wiki/FAQ#Why_is_it_not_recommended_to_install_a_pre-compiled_copy_of_Goog
type=filepath, check=lambda build, GTEST_DIR: None,
help='Location of Google Test sources, must contain src/gtest-all.cc (linking to a precompiled library is NOT supported)', hidden=False)
self.add_option('GDB', init=['gdb'],
type=ShellList, check=lambda build, GDB: None,
help='debugger to run tests', hidden=False)
def add_bool_feature(self, arg, hidden=False, **kwargs):
positive = '--enable-' + arg
negative = '--disable-' + arg
self.add_option(positive, type=yesno, hidden=hidden, **kwargs)
# TODO: instead reveal one of the aliases and hide the main
# this requires messing with help slightly
self.add_alias(positive, [positive + '=yes'], help=None, hidden=True)
self.add_alias(negative, [positive + '=no'], help=None, hidden=True)
def main():
srcdir = os.path.dirname(sys.argv[0])
proj = Configuration(
srcdir=srcdir,
template_files=['Makefile'],
)
proj.set_package('tmwa', 'The Mana World (Athena server)');
proj.jiggle()
build = proj.build('.')
build.configure(sys.argv[1:], os.environ)
if __name__ == '__main__':
main()