LIVE / thrust /generate_mk.py
Xu Ma
update
1c3c0d9
raw
history blame
4.5 kB
#!/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()