initial sandbox version
This commit is contained in:
122
lib/config.py
Normal file
122
lib/config.py
Normal file
@ -0,0 +1,122 @@
|
||||
|
||||
# Copyright (c) 2015 by Radovan Bast and Jonas Juselius
|
||||
# see https://github.com/scisoft/cframe/blob/master/LICENSE
|
||||
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
|
||||
|
||||
def check_cmake_exists(cmake_command):
|
||||
"""
|
||||
Check whether CMake is installed. If not, print
|
||||
informative error message and quits.
|
||||
"""
|
||||
p = subprocess.Popen('%s --version' % cmake_command,
|
||||
shell=True,
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE)
|
||||
if not ('cmake version' in p.communicate()[0]):
|
||||
sys.stderr.write(' This code is built using CMake\n\n')
|
||||
sys.stderr.write(' CMake is not found\n')
|
||||
sys.stderr.write(' get CMake at http://www.cmake.org/\n')
|
||||
sys.stderr.write(' on many clusters CMake is installed\n')
|
||||
sys.stderr.write(' but you have to load it first:\n')
|
||||
sys.stderr.write(' $ module load cmake\n')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def setup_build_path(build_path):
|
||||
"""
|
||||
Create build directory. If this already exists, print informative
|
||||
error message and quit.
|
||||
"""
|
||||
if os.path.isdir(build_path):
|
||||
fname = os.path.join(build_path, 'CMakeCache.txt')
|
||||
if os.path.exists(fname):
|
||||
sys.stderr.write('aborting setup\n')
|
||||
sys.stderr.write('build directory %s which contains CMakeCache.txt already exists\n' % build_path)
|
||||
sys.stderr.write('remove the build directory and then rerun setup\n')
|
||||
sys.exit(1)
|
||||
else:
|
||||
os.makedirs(build_path, 0755)
|
||||
|
||||
|
||||
def run_cmake(command, build_path, default_build_path):
|
||||
"""
|
||||
Execute CMake command.
|
||||
"""
|
||||
topdir = os.getcwd()
|
||||
os.chdir(build_path)
|
||||
p = subprocess.Popen(
|
||||
command,
|
||||
shell=True,
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE
|
||||
)
|
||||
s = p.communicate()[0]
|
||||
# print cmake output to screen
|
||||
print(s)
|
||||
# write cmake output to file
|
||||
f = open('cmake_output', 'w')
|
||||
f.write(s)
|
||||
f.close()
|
||||
# change directory and return
|
||||
os.chdir(topdir)
|
||||
if 'Configuring incomplete' in s:
|
||||
# configuration was not successful
|
||||
if (build_path == default_build_path):
|
||||
# remove build_path iff not set by the user
|
||||
# otherwise removal can be dangerous
|
||||
shutil.rmtree(default_build_path)
|
||||
else:
|
||||
# configuration was successful
|
||||
save_configure_command(sys.argv, build_path)
|
||||
print_build_help(build_path, default_build_path)
|
||||
|
||||
|
||||
def print_build_help(build_path, default_build_path):
|
||||
"""
|
||||
Print help text after configuration step is done.
|
||||
"""
|
||||
print(' configure step is done')
|
||||
print(' now you need to compile the sources:')
|
||||
if (build_path == default_build_path):
|
||||
print(' $ cd build')
|
||||
else:
|
||||
print(' $ cd ' + build_path)
|
||||
print(' $ make')
|
||||
|
||||
|
||||
def save_configure_command(argv, build_path):
|
||||
"""
|
||||
Save configure command to a file.
|
||||
"""
|
||||
file_name = os.path.join(build_path, 'configure_command')
|
||||
f = open(file_name, 'w')
|
||||
f.write(' '.join(argv[:]) + '\n')
|
||||
f.close()
|
||||
|
||||
|
||||
def configure(root_directory, build_path, cmake_command, only_show):
|
||||
"""
|
||||
Main configure function.
|
||||
"""
|
||||
default_build_path = os.path.join(root_directory, 'build')
|
||||
|
||||
# check that CMake is available, if not stop
|
||||
check_cmake_exists('cmake')
|
||||
|
||||
# deal with build path
|
||||
if build_path is None:
|
||||
build_path = default_build_path
|
||||
if not only_show:
|
||||
setup_build_path(build_path)
|
||||
|
||||
print('%s\n' % cmake_command)
|
||||
if only_show:
|
||||
sys.exit(0)
|
||||
|
||||
run_cmake(cmake_command, build_path, default_build_path)
|
Reference in New Issue
Block a user