Buildbot: Increase number of compile thread for Linux Buildbot
[blender.git] / build_files / buildbot / slave_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 def get_cmake_options(builder):
27     post_install_script = os.path.join(
28         builder.blender_dir, 'build_files', 'buildbot', 'slave_codesign.cmake')
29
30     config_file = "build_files/cmake/config/blender_release.cmake"
31     options = ['-DCMAKE_BUILD_TYPE:STRING=Release',
32                '-DWITH_GTESTS=ON']
33
34     if builder.platform == 'mac':
35         options.append('-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64')
36         options.append('-DCMAKE_OSX_DEPLOYMENT_TARGET=10.9')
37     elif builder.platform == 'win':
38         options.extend(['-G', 'Visual Studio 15 2017 Win64'])
39         options.extend(['-DPOSTINSTALL_SCRIPT:PATH=' + post_install_script])
40     elif builder.platform == 'linux':
41         config_file = "build_files/buildbot/config/blender_linux.cmake"
42
43     optix_sdk_dir = os.path.join(builder.blender_dir, '..', '..', 'NVIDIA-Optix-SDK')
44     options.append('-DOPTIX_ROOT_DIR:PATH=' + optix_sdk_dir)
45
46     options.append("-C" + os.path.join(builder.blender_dir, config_file))
47     options.append("-DCMAKE_INSTALL_PREFIX=%s" % (builder.install_dir))
48
49     return options
50
51 def update_git(builder):
52     # Do extra git fetch because not all platform/git/buildbot combinations
53     # update the origin remote, causing buildinfo to detect local changes.
54     os.chdir(builder.blender_dir)
55
56     print("Fetching remotes")
57     command = ['git', 'fetch', '--all']
58     buildbot_utils.call(builder.command_prefix + command)
59
60 def clean_directories(builder):
61     # Make sure no garbage remained from the previous run
62     if os.path.isdir(builder.install_dir):
63         shutil.rmtree(builder.install_dir)
64
65     # Make sure build directory exists and enter it
66     os.makedirs(builder.build_dir, exist_ok=True)
67
68     # Remove buildinfo files to force buildbot to re-generate them.
69     for buildinfo in ('buildinfo.h', 'buildinfo.h.txt', ):
70         full_path = os.path.join(builder.build_dir, 'source', 'creator', buildinfo)
71         if os.path.exists(full_path):
72             print("Removing {}" . format(buildinfo))
73             os.remove(full_path)
74
75 def cmake_configure(builder):
76     # CMake configuration
77     os.chdir(builder.build_dir)
78
79     cmake_cache = os.path.join(builder.build_dir, 'CMakeCache.txt')
80     if os.path.exists(cmake_cache):
81         print("Removing CMake cache")
82         os.remove(cmake_cache)
83
84     print("CMake configure:")
85     cmake_options = get_cmake_options(builder)
86     command = ['cmake', builder.blender_dir] + cmake_options
87     buildbot_utils.call(builder.command_prefix + command)
88
89 def cmake_build(builder):
90     # CMake build
91     os.chdir(builder.build_dir)
92
93     # NOTE: CPack will build an INSTALL target, which would mean that code
94     # signing will happen twice when using `make install` and CPack.
95     # The tricky bit here is that it is not possible to know whether INSTALL
96     # target is used by CPack or by a buildbot itaself. Extra level on top of
97     # this is that on Windows it is required to build INSTALL target in order
98     # to have unit test binaries to run.
99     # So on the one hand we do an extra unneeded code sign on Windows, but on
100     # a positive side we don't add complexity and don't make build process more
101     # fragile trying to avoid this. The signing process is way faster than just
102     # a clean build of buildbot, especially with regression tests enabled.
103     if builder.platform == 'win':
104         command = ['cmake', '--build', '.', '--target', 'install', '--config', 'Release']
105     elif builder.platform == 'linux':
106         command = ['make', '-s', '-j16', 'install']
107     else:
108         command = ['make', '-s', '-j2', 'install']
109
110     print("CMake build:")
111     buildbot_utils.call(builder.command_prefix + command)
112
113 if __name__ == "__main__":
114     builder = buildbot_utils.create_builder_from_arguments()
115     update_git(builder)
116     clean_directories(builder)
117     cmake_configure(builder)
118     cmake_build(builder)