Skip to content

Instantly share code, notes, and snippets.

@sergey-shambir
Last active October 10, 2017 14:23
Show Gist options
  • Save sergey-shambir/388a984923bcb0960d73d068d8008090 to your computer and use it in GitHub Desktop.
Save sergey-shambir/388a984923bcb0960d73d068d8008090 to your computer and use it in GitHub Desktop.
Build script for student labs
#!/usr/bin/env python2
from __future__ import print_function
import subprocess
import os
import shutil
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
def prepare_dir(dir, prepare_git):
if prepare_git:
subprocess.check_call(['git', 'clean', '-fd'], cwd=dir)
subprocess.check_call(['git', 'reset', '--hard'], cwd=dir)
subprocess.check_call(['git', 'pull', 'origin'], cwd=dir)
subprocess.check_call(['git', 'clean', '-fd'], cwd=dir)
else:
# delete all exe, CMakeFiles, etc
for root, subdirs, files in os.walk(dir):
for subdir in subdirs:
if subdir == 'CMakeFiles':
shutil.rmtree(os.path.join(root, subdir))
for filename in files:
if filename.endswith('.exe') or filename in ['cmake_install.cmake', 'CMakeCache.txt', 'Makefile']:
os.remove(os.path.join(root, filename))
return True
def build_dir_impl(dir):
succeed = False
project_filepath = os.path.join(dir, 'CMakeLists.txt')
if os.path.exists(project_filepath):
subprocess.check_call(['cmake', '-Wno-dev', '-G', 'MinGW Makefiles', '.'], cwd=dir)
subprocess.check_call(['cmake', '--build', '.'], cwd=dir)
succeed = True
else:
for subdir in os.listdir(dir):
subdir_path = os.path.join(dir, subdir)
if os.path.isdir(subdir_path):
succeed = build_dir_impl(subdir_path) or succeed
return succeed
def build_dir(dir):
try:
return build_dir_impl(dir)
except subprocess.CalledProcessError as err:
print('cannot build {0}: subprocess error "{1}"'.format(dir, err))
return False
except Exception as err:
print('cannot build {0}: unknown error {1}'.format(dir, err))
return False
def build_given_dirs(dirs, prepare_git):
succeed_dirs = []
failed_dirs = []
for group_dirname in dirs:
group_dir = os.path.join(SCRIPT_DIR, group_dirname)
if os.path.isdir(group_dir):
for student_dirname in os.listdir(group_dir):
student_dir = os.path.join(group_dir, student_dirname)
if os.path.isdir(student_dir):
friendly_dirname = '{0} ({1})'.format(student_dirname, group_dirname)
if (prepare_dir(student_dir, prepare_git)) and build_dir(student_dir):
succeed_dirs.append(friendly_dirname)
else:
failed_dirs.append(friendly_dirname)
print('------------------- script finished --------------------')
print('succeed to build: ', succeed_dirs)
print('failed to build: ', failed_dirs)
GIT_DIRS = ['PS_11', 'PS_12', 'PS_13']
DROPBOX_DIRS = ['PS_11_dropbox', 'PS_12_dropbox', 'PS_13_dropbox']
#build_given_dirs(DROPBOX_DIRS, False)
build_given_dirs(GIT_DIRS, True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment