Python: Remove deprecated uses of os.popen
[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 re
29 import subprocess
30 import sys
31 import os
32 import Blender as B
33
34 def normpath(path):
35     return os.path.abspath(os.path.normpath(path))
36
37 Import ('env')
38
39 kernel_binaries = []
40
41 #Bitness
42 if B.bitness == 32:
43     bits = 32
44 else:
45     bits = 64
46
47 if env['WITH_BF_CYCLES_CUDA_BINARIES']:
48     kernel = env.Clone()
49
50     # cuda info
51     nvcc = env['BF_CYCLES_CUDA_NVCC']
52     cuda_archs = env['BF_CYCLES_CUDA_BINARIES_ARCH']
53
54     # build directory
55     root_build_dir = normpath(env['BF_BUILDDIR'])
56     build_dir = os.path.join(root_build_dir, 'intern/cycles/kernel')
57
58     # source directories and files
59     source_dir = Dir('.').srcnode().path
60     kernel_file = os.path.join(source_dir, "kernel.cu")
61     util_dir = os.path.join(source_dir, "../util")
62     svm_dir = os.path.join(source_dir, "../svm")
63     geom_dir = os.path.join(source_dir, "../geom")
64     closure_dir = os.path.join(source_dir, "../closure")
65
66     # get CUDA version
67     output = subprocess.check_output([nvcc, "--version"])
68     cuda_major_minor = re.findall(r'release (\d+).(\d+)', output)[0]
69     cuda_version = int(cuda_major_minor[0])*10 + int(cuda_major_minor[1])
70
71     if cuda_version != 60:
72         print("CUDA version %d.%d detected, build may succeed but only CUDA 6.0 is officially supported." % (cuda_version/10, cuda_version%10))
73
74     # nvcc flags
75     nvcc_flags = "-m%s" % (bits)
76     nvcc_flags += " --cubin --ptxas-options=\"-v\" --use_fast_math"
77     nvcc_flags += " -D__KERNEL_CUDA_VERSION__=%d" % (cuda_version)
78     nvcc_flags += " -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DNVCC"
79     nvcc_flags += " -I \"%s\" -I \"%s\" -I \"%s\" -I \"%s\"" % (util_dir, svm_dir, geom_dir, closure_dir)
80
81     # dependencies
82     dependencies = ['kernel.cu'] + kernel.Glob('*.h') + kernel.Glob('../util/*.h') + kernel.Glob('svm/*.h') + kernel.Glob('geom/*.h') + kernel.Glob('closure/*.h')
83     last_cubin_file = None
84
85     # add command for each cuda architecture
86     for arch in cuda_archs:
87         if cuda_version < 60 and arch == "sm_50":
88             print("Can't build kernel for CUDA sm_50 architecture, skipping")
89             continue
90
91         cubin_file = os.path.join(build_dir, "kernel_%s.cubin" % arch)
92
93         if env['BF_CYCLES_CUDA_ENV']:
94             MS_SDK = "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\SetEnv.cmd"
95             command = "\"%s\" & \"%s\" -arch=%s %s \"%s\" -o \"%s\"" % (MS_SDK, nvcc, arch, nvcc_flags, kernel_file, cubin_file)
96         else:
97             command = "\"%s\" -arch=%s %s \"%s\" -o \"%s\"" % (nvcc, arch, nvcc_flags, kernel_file, cubin_file)
98
99         kernel.Command(cubin_file, 'kernel.cu', command)
100         kernel.Depends(cubin_file, dependencies)
101
102         kernel_binaries.append(cubin_file)
103         
104         if not env['WITH_BF_CYCLES_CUDA_THREADED_COMPILE']:
105             # trick to compile one kernel at a time to reduce memory usage
106             if last_cubin_file:
107                 kernel.Depends(cubin_file, last_cubin_file)
108             last_cubin_file = cubin_file
109
110 Return('kernel_binaries')
111