Spaces:
Runtime error
Runtime error
| #!/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() | |