#!/usr/bin/env python # Generate set of projects mk files. # Usage: python generate_mk.py PROJECTS_MK_DIR THRUST_SOURCE_DIR # The program scans through unit tests and examples in THRUST_SOURCE_DIR # and generates project mk for each of the tests and examples in PROJECTS_MK_DIR # A single example or unit test source file generates its own executable # This program is called by a top level Makefile, but can also be used stand-alone for debugging # This program also generates testing.mk, examples.mk and dependencies.mk from __future__ import print_function import sys import shutil as sh import os import glob import re test_template = """ TEST_SRC := %(TEST_SRC)s TEST_NAME := %(TEST_NAME)s include $(ROOTDIR)/thrust/internal/build/generic_test.mk """ example_template = """ EXAMPLE_SRC := %(EXAMPLE_SRC)s EXAMPLE_NAME := %(EXAMPLE_NAME)s include $(ROOTDIR)/thrust/internal/build/generic_example.mk """ def Glob(pattern, directory,exclude='\B'): src = glob.glob(os.path.join(directory,pattern)) p = re.compile(exclude) src = [s for s in src if not p.match(s)] return src def generate_test_mk(mk_path, test_path, group, TEST_DIR): print('Generating makefiles in "'+mk_path+'" for tests in "'+test_path+'"') src_cu = Glob("*.cu", test_path, ".*testframework.cu$") src_cxx = Glob("*.cpp", test_path) src_cu.sort(); src_cxx.sort(); src_all = src_cu + src_cxx; tests_all = [] dependencies_all = [] for s in src_all: fn = os.path.splitext(os.path.basename(s)); t = "thrust."+group+"."+fn[0] e = fn[1] mkfile = test_template % {"TEST_SRC" : s, "TEST_NAME" : t} f = open(os.path.join(mk_path,t+".mk"), 'w') f.write(mkfile) f.close() tests_all.append(os.path.join(mk_path,t)) dependencies_all.append(t+": testframework") return [tests_all, dependencies_all] def generate_example_mk(mk_path, example_path, group, EXAMPLE_DIR): print('Generating makefiles in "'+mk_path+'" for examples in "'+example_path+'"') src_cu = Glob("*.cu", example_path) src_cxx = Glob("*.cpp", example_path) src_cu.sort(); src_cxx.sort(); src_all = src_cu + src_cxx; examples_all = [] for s in src_all: fn = os.path.splitext(os.path.basename(s)); t = "thrust."+group+"."+fn[0] e = fn[1] mkfile = example_template % {"EXAMPLE_SRC" : s, "EXAMPLE_NAME" : t} f = open(os.path.join(mk_path,t+".mk"), 'w') f.write(mkfile) f.close() examples_all.append(os.path.join(mk_path,t)) return examples_all ## relpath : backported from os.relpath form python 2.6+ def relpath(path, start): """Return a relative version of a path""" import posixpath if not path: raise ValueError("no path specified") start_list = posixpath.abspath(start).split(posixpath.sep) path_list = posixpath.abspath(path).split(posixpath.sep) # Work out how much of the filepath is shared by start and path. i = len(posixpath.commonprefix([start_list, path_list])) rel_list = [posixpath.pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: return posixpath.curdir return posixpath.join(*rel_list) mk_path=sys.argv[1] REL_DIR="../../" if (len(sys.argv) > 2): root_path=sys.argv[2]; mk_path = relpath(mk_path, root_path) REL_DIR = relpath(root_path,mk_path) try: sh.rmtree(mk_path) except: pass os.makedirs(mk_path) tests_all, dependencies_all = generate_test_mk(mk_path, "testing/", "test", REL_DIR) tests_cu, dependencies_cu = generate_test_mk(mk_path, "testing/cuda/", "test.cuda", REL_DIR) tests_all.extend(tests_cu) dependencies_all.extend(dependencies_cu) testing_mk = "" for t in tests_all: testing_mk += "PROJECTS += "+t+"\n" testing_mk += "PROJECTS += internal/build/testframework\n" f = open(os.path.join(mk_path,"testing.mk"),'w') f.write(testing_mk) f.close() dependencies_mk = "" for d in dependencies_all: dependencies_mk += d + "\n" f = open(os.path.join(mk_path,"dependencies.mk"),'w') f.write(dependencies_mk) f.close() examples_mk = "" examples_all = generate_example_mk(mk_path, "examples/", "example", REL_DIR) examples_cuda = generate_example_mk(mk_path, "examples/cuda/", "example.cuda", REL_DIR) examples_all.extend(examples_cuda) for e in examples_all: examples_mk += "PROJECTS += "+e+"\n" f = open(os.path.join(mk_path,"examples.mk"),'w') f.write(examples_mk) f.close()