UI: Viewport Navigate Gizmo Refactor
[blender.git] / build_files / buildbot / worker_compile.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 import os
22 import shutil
23
24 import buildbot_utils
25
26
27 def get_cmake_options(builder):
28     codesign_script = os.path.join(
29         builder.blender_dir, 'build_files', 'buildbot', 'worker_codesign.cmake')
30
31     config_file = "build_files/cmake/config/blender_release.cmake"
32     options = ['-DCMAKE_BUILD_TYPE:STRING=Release',
33                '-DWITH_GTESTS=ON']
34
35     if builder.platform == 'mac':
36         options.append('-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64')
37         options.append('-DCMAKE_OSX_DEPLOYMENT_TARGET=10.9')
38     elif builder.platform == 'win':
39         options.extend(['-G', 'Visual Studio 16 2019', '-A', 'x64'])
40         if builder.codesign:
41             options.extend(['-DPOSTINSTALL_SCRIPT:PATH=' + codesign_script])
42     elif builder.platform == 'linux':
43         config_file = "build_files/buildbot/config/blender_linux.cmake"
44
45     optix_sdk_dir = os.path.join(builder.blender_dir, '..', '..', 'NVIDIA-Optix-SDK-7.1')
46     options.append('-DOPTIX_ROOT_DIR:PATH=' + optix_sdk_dir)
47
48     # Workaround to build sm_30 kernels with CUDA 10, since CUDA 11 no longer supports that architecture
49     if builder.platform == 'win':
50         options.append('-DCUDA10_TOOLKIT_ROOT_DIR:PATH=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1')
51         options.append('-DCUDA10_NVCC_EXECUTABLE:FILEPATH=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1/bin/nvcc.exe')
52         options.append('-DCUDA11_TOOLKIT_ROOT_DIR:PATH=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1')
53         options.append('-DCUDA11_NVCC_EXECUTABLE:FILEPATH=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/bin/nvcc.exe')
54     elif builder.platform == 'linux':
55         options.append('-DCUDA10_TOOLKIT_ROOT_DIR:PATH=/usr/local/cuda-10.1')
56         options.append('-DCUDA10_NVCC_EXECUTABLE:FILEPATH=/usr/local/cuda-10.1/bin/nvcc')
57         options.append('-DCUDA11_TOOLKIT_ROOT_DIR:PATH=/usr/local/cuda-11.1')
58         options.append('-DCUDA11_NVCC_EXECUTABLE:FILEPATH=/usr/local/cuda-11.1/bin/nvcc')
59
60     options.append("-C" + os.path.join(builder.blender_dir, config_file))
61     options.append("-DCMAKE_INSTALL_PREFIX=%s" % (builder.install_dir))
62
63     return options
64
65
66 def update_git(builder):
67     # Do extra git fetch because not all platform/git/buildbot combinations
68     # update the origin remote, causing buildinfo to detect local changes.
69     os.chdir(builder.blender_dir)
70
71     print("Fetching remotes")
72     command = ['git', 'fetch', '--all']
73     buildbot_utils.call(builder.command_prefix + command)
74
75
76 def clean_directories(builder):
77     # Make sure no garbage remained from the previous run
78     if os.path.isdir(builder.install_dir):
79         shutil.rmtree(builder.install_dir)
80
81     # Make sure build directory exists and enter it
82     os.makedirs(builder.build_dir, exist_ok=True)
83
84     # Remove buildinfo files to force buildbot to re-generate them.
85     for buildinfo in ('buildinfo.h', 'buildinfo.h.txt', ):
86         full_path = os.path.join(builder.build_dir, 'source', 'creator', buildinfo)
87         if os.path.exists(full_path):
88             print("Removing {}" . format(buildinfo))
89             os.remove(full_path)
90
91
92 def cmake_configure(builder):
93     # CMake configuration
94     os.chdir(builder.build_dir)
95
96     cmake_cache = os.path.join(builder.build_dir, 'CMakeCache.txt')
97     if os.path.exists(cmake_cache):
98         print("Removing CMake cache")
99         os.remove(cmake_cache)
100
101     print("CMake configure:")
102     cmake_options = get_cmake_options(builder)
103     command = ['cmake', builder.blender_dir] + cmake_options
104     buildbot_utils.call(builder.command_prefix + command)
105
106
107 def cmake_build(builder):
108     # CMake build
109     os.chdir(builder.build_dir)
110
111     # NOTE: CPack will build an INSTALL target, which would mean that code
112     # signing will happen twice when using `make install` and CPack.
113     # The tricky bit here is that it is not possible to know whether INSTALL
114     # target is used by CPack or by a buildbot itaself. Extra level on top of
115     # this is that on Windows it is required to build INSTALL target in order
116     # to have unit test binaries to run.
117     # So on the one hand we do an extra unneeded code sign on Windows, but on
118     # a positive side we don't add complexity and don't make build process more
119     # fragile trying to avoid this. The signing process is way faster than just
120     # a clean build of buildbot, especially with regression tests enabled.
121     if builder.platform == 'win':
122         command = ['cmake', '--build', '.', '--target', 'install', '--config', 'Release']
123     else:
124         command = ['make', '-s', '-j16', 'install']
125
126     print("CMake build:")
127     buildbot_utils.call(builder.command_prefix + command)
128
129
130 if __name__ == "__main__":
131     builder = buildbot_utils.create_builder_from_arguments()
132     update_git(builder)
133     clean_directories(builder)
134     cmake_configure(builder)
135     cmake_build(builder)