diff --git a/.travis.yml b/.travis.yml index fb59ac22..518141e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: cpp script: - - mkdir build && cd build && cmake -G "Unix Makefiles" -D SHARED=0 -D AUTORUN_TESTS=1 -D BUILD_TESTS=1 ../cmake && make + - ./configure SHARED=0 BUILD_TESTS=1 AUTORUN_TESTS=1 "Unix Makefiles" && make -C build compiler: - clang - gcc diff --git a/clean b/clean index 444a76dd..fab7ba3b 100755 --- a/clean +++ b/clean @@ -1,11 +1,3 @@ -#!/usr/bin/env python3 - -import os -import shutil - -os.chdir(os.path.dirname(os.path.abspath(__file__))) - -dirs = ['./bin', './lib', './build'] - -for dir in dirs: - if os.path.isdir(dir): shutil.rmtree(dir) +# -*- mode: sh -*- +cd ${0%/*} +./configure clean diff --git a/clean.bat b/clean.bat index 60b4c7b4..44fbe3ee 100644 --- a/clean.bat +++ b/clean.bat @@ -4,4 +4,4 @@ for /f %%i in ('where python') DO (set PYTHON=%%i) & goto :done1 :done1 @where python3 > nul 2>&1 && for /f %%i in ('@where python3') DO (@set PYTHON=%%i) & goto :done2 :done2 -!PYTHON! clean \ No newline at end of file +!PYTHON! configure %* \ No newline at end of file diff --git a/configure b/configure index 6f3f5aef..eacd1b0f 100755 --- a/configure +++ b/configure @@ -1,14 +1,24 @@ #!/usr/bin/env python3 +# -*- mode: python -*- import os import subprocess import sys -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) +def clean(): + import shutil + dirs = ['./bin', './lib', './build'] + + for dir in dirs: + if os.path.isdir(dir): shutil.rmtree(dir) + +def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + +def which(program): fpath, fname = os.path.split(program) + if fpath: if is_exe(program): return program @@ -16,28 +26,81 @@ def which(program): for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') exe_file = os.path.join(path, program) + if is_exe(exe_file): return exe_file return None -os.chdir(os.path.dirname(os.path.abspath(__file__))) +def default_generator(platform): + generator = 'Unix Makefiles' -if not os.path.isdir('./build'): - os.mkdir('./build') + if sys.platform == 'darwin': + generator = 'Xcode' + elif sys.platform == 'win32': + generator = 'Visual Studio 14 2015 Win64' -generator = 'Unix Makefiles' + return generator -if len(sys.argv) > 1: - generator = sys.argv[1] -elif sys.platform == 'darwin': - generator = 'Unix Makefiles' -elif sys.platform == 'win32': - generator = 'Visual Studio 14 2015 Win64' +def find_cmake(): + cmake = None + + if which('cmake3'): + cmake = 'cmake3' + elif which('cmake'): + cmake = 'cmake' + + if cmake == None: + raise Exception("cmake not found") -cmake = 'cmake' + return cmake -if which('cmake3'): - cmake = 'cmake3' +def parse_args(args): + options = {} + generator = default_generator(sys.platform) -subprocess.call([cmake, '-G', generator, '../cmake'], cwd='./build') + if len(args) == 0: + return options, generator + + while len(args) > 1: + option = args.pop(0) + + if '=' not in option: + raise Exception('bad option: {}'.format(option)) + + options[option.split('=')[0]] = option.split('=')[1] + + generator = args[0] + + return options, generator + +def main(): + os.chdir(os.path.dirname(os.path.abspath(__file__))) + + if len(sys.argv) == 2 and sys.argv[1] == 'clean': + clean() + return + + build_dir = './build' + + if not os.path.isdir(build_dir): + os.mkdir(build_dir) + + cmake = find_cmake() + options, generator = parse_args(sys.argv[1:]) + command = [cmake] + + if generator != None: + command.extend(['-G', generator]) + + if options != None: + for option in options: + command.extend(['-D', '{}={}'.format(option, options[option])]) + + cmake_scripts_dir = '../cmake' # relative to build_dir + command.append(cmake_scripts_dir) + + subprocess.call(command, cwd=build_dir) + +if __name__ == '__main__': + main()