#!/usr/bin/env python3.4 """ This utility script helps in the creation of experiment setups. It therefore reads experiment descriptions from json files and creates everything necessary as a result. It therefore performs the following actions: * [x] Read the json file of every experiment * [x] Create folders for every experiment * [ ] Create the header file for every experiment * [x] Add the make file for every experiment * [x] Add c++ file for every experiment """ import sys import os import argparse import shutil import json def query_yes_no(question, default=None): """ Queries the user for a decision. """ if default is None: prompt = ' [y/n]' elif default.lower() is 'yes': prompt = ' [Y/n]' elif default.lower() is 'no': prompt = ' [y/N]' else: raise ValueError('Invalid default answer {}'.format(default)) while True: print(question, prompt) choice = input().lower() if 'yes'.find(choice) == 0: return True elif 'no'.find(choice) == 0: return False def create_dir(filename): """ Create the directory denoted by filename, if it doesn't exists. Ask for its removal if it exists. """ try: os.makedirs(path) except FileExistsError: if not query_yes_no('Folder exists, remove?', default='yes'): return False shutil.rmtree(path) os.makedirs(path) return True def create_header(headerfile, tasks, destination): """ Create a header file for the experiment. """ pass def main(): """ Starting point of the script, parses arguments and creates the experiments. """ parser = argparse.ArgumentParser(description='Generate experiment data.') parser.add_argument('description', type=str, nargs='+', help='file containing the taskset description.') parser.add_argument('header', type=str, nargs='?', default='./template/config.h', help='path to optional custom header file.') parser.add_argument('makefile', type=str, nargs='?', default='./template/Makefile', help='path to optional custom makefile.') parser.add_argument('cpp', type=str, nargs='?', default='./template/experiment.cpp', help='path to optional custom c++ implementation.') args = parser.parse_args() cwd = os.getcwd() for num, experiment_file in enumerate(args.description): with open(experiment_file, 'r') as experiment_description: descr_json = experiment_description.read() experiment = json.loads(descr_json) print('[{}/{}] Creating experiment {}:'.format(num, len(args.description), experiment['name']), file=sys.stderr) experiment_dir = os.path.join(cwd, experiment['name']) # Create folder print('create folder') if not create_dir(experiment_dir): print('Skipping experiment ', experiment['name'], file=sys.stderr) continue # Read tasks tasks = [] # Add header print('create header file') create_header(args.headerfile, experiment, experiment_dir) # Add makefile & c++ file print('add Makefile') makefile_path = os.path.join(experiment_dir, 'Makefile') shutil.copyfile(args.makefile, makefile_path) print('add C++ file') cpp_file_path = os.path.join(experiment_dir, 'experiment.cpp') shutil.copyfile(args.cpp, cpp_file_path) if __name__ == '__main__': main()