add BLI_strcpy_rlen, replace strcat, which was used in misleading way.
[blender.git] / intern / cycles / kernel / SConscript
1 #!/usr/bin/env python
2 #
3 # ***** BEGIN GPL LICENSE BLOCK *****
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software Foundation,
17 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #
19 # The Original Code is Copyright (C) 2011, Blender Foundation
20 # All rights reserved.
21 #
22 # The Original Code is: all of this file.
23 #
24 # Contributor(s): Nathan Letwory.
25 #
26 # ***** END GPL LICENSE BLOCK *****
27
28 import sys
29 import os
30 import Blender as B
31
32 def normpath(path):
33     return os.path.abspath(os.path.normpath(path))
34
35 Import ('env')
36
37 kernel_binaries = []
38
39 #Bitness
40 if B.bitness == 32:
41     bits = 32
42 else:
43     bits = 64
44
45 if env['WITH_BF_CYCLES_CUDA_BINARIES']:
46     kernel = env.Clone()
47
48     # cuda info
49     nvcc = env['BF_CYCLES_CUDA_NVCC']
50     cuda_archs = env['BF_CYCLES_CUDA_BINARIES_ARCH']
51
52     # build directory
53     root_build_dir = normpath(env['BF_BUILDDIR'])
54     build_dir = os.path.join(root_build_dir, 'intern/cycles/kernel')
55
56     # source directories and files
57     source_dir = Dir('.').srcnode().path
58     kernel_file = os.path.join(source_dir, "kernel.cu")
59     util_dir = os.path.join(source_dir, "../util")
60     svm_dir = os.path.join(source_dir, "../svm")
61     closure_dir = os.path.join(source_dir, "../closure")
62
63     # nvcc flags
64     nvcc_flags = "-m%s" % (bits)
65     nvcc_flags += " --cubin --ptxas-options=\"-v\" --maxrregcount=24"
66     nvcc_flags += " --opencc-options -OPT:Olimit=0"
67     nvcc_flags += " -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DNVCC"
68     nvcc_flags += " -I \"%s\" -I \"%s\" -I \"%s\"" % (util_dir, svm_dir, closure_dir)
69
70     # dependencies
71     dependencies = ['kernel.cu'] + kernel.Glob('*.h') + kernel.Glob('../util/*.h') + kernel.Glob('svm/*.h') + kernel.Glob('closure/*.h')
72     last_cubin_file = None
73
74     # add command for each cuda architecture
75     for arch in cuda_archs:
76         cubin_file = os.path.join(build_dir, "kernel_%s.cubin" % arch)
77
78         command = "\"%s\" -arch=%s %s \"%s\" -o \"%s\"" % (nvcc, arch, nvcc_flags, kernel_file, cubin_file)
79
80         kernel.Command(cubin_file, 'kernel.cu', command)
81         kernel.Depends(cubin_file, dependencies)
82
83         kernel_binaries.append(cubin_file)
84         
85         if not env['WITH_BF_CYCLES_CUDA_THREADED_COMPILE']:
86             # trick to compile one kernel at a time to reduce memory usage
87             if last_cubin_file:
88                 kernel.Depends(cubin_file, last_cubin_file)
89             last_cubin_file = cubin_file
90
91 Return('kernel_binaries')
92