This adds support for building the icons from make.bat unlike bash there is no passing environment variables on the command line. The scripts go out of their way to locate both blender and inkscape however if they are not found, the user is given a helpful error message telling them how to set the variables. Although some extra help can be given there, if your normal build is a 2019 full build running `make 2019 full icons` will help it find the blender executable as well. finally if you know the name of your build folder running `make builddir build_windows_Lite_x64_vc16_Release icons` will also work, if all fails you can point directly to the blender executable by running `set BLENDER_BIN=c:\where\blender\lives\blender.exe` before running `make icons` or `make icons_geom` The python scripts needed some small modifications since without the PATHEXT, SystemRoot and SystemDrive environment variables python will not initialize properly on windows. (Not blender related, even mainline python won't start without those)
120 lines
3.9 KiB
Python
Executable File
120 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
|
|
# This script updates icons from the BLEND file
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def run(cmd, *, env=None):
|
|
print(" ", " ".join(cmd))
|
|
subprocess.check_call(cmd, env=env)
|
|
|
|
|
|
def edit_text_file(filename, marker_begin, marker_end, content):
|
|
with open(filename, 'r', encoding='utf-8') as f:
|
|
data = f.read()
|
|
marker_begin_index = data.find(marker_begin)
|
|
marker_end_index = data.find(marker_end, marker_begin_index)
|
|
# include indentation of marker
|
|
while data[marker_end_index - 1] in {'\t', ' '}:
|
|
marker_end_index -= 1
|
|
if marker_begin_index == -1:
|
|
print('Error: %r not found' % marker_begin)
|
|
return
|
|
if marker_end_index == -1:
|
|
print('Error: %r not found' % marker_end)
|
|
return
|
|
marker_begin_index += len(marker_begin) + 1
|
|
data_update = data[:marker_begin_index] + content + data[marker_end_index:]
|
|
if data != data_update:
|
|
with open(filename, 'w', encoding='utf-8') as f:
|
|
f.write(data_update)
|
|
|
|
|
|
BASEDIR = os.path.abspath(os.path.dirname(__file__))
|
|
ROOTDIR = os.path.normpath(os.path.join(BASEDIR, "..", ".."))
|
|
|
|
blender_bin = os.environ.get("BLENDER_BIN", "blender")
|
|
if not os.path.exists(blender_bin):
|
|
blender_bin = os.path.join(ROOTDIR, "blender.bin")
|
|
|
|
if not os.path.exists(blender_bin):
|
|
if sys.platform == 'darwin':
|
|
blender_app_path = '/Applications/Blender.app/Contents/MacOS/Blender'
|
|
if os.path.exists(blender_app_path):
|
|
blender_bin = blender_app_path
|
|
|
|
icons_blend = (
|
|
os.path.join(ROOTDIR, "..", "lib", "resources", "icon_geom.blend"),
|
|
)
|
|
|
|
|
|
def names_and_time_from_path(path):
|
|
for entry in os.scandir(path):
|
|
name = entry.name
|
|
if name.endswith(".dat"):
|
|
yield (name, entry.stat().st_mtime)
|
|
|
|
|
|
# Collect icons files and update CMake.
|
|
icon_files = []
|
|
|
|
# create .dat geometry (which are stored in git)
|
|
for blend in icons_blend:
|
|
output_dir = os.path.join(BASEDIR, "icons")
|
|
files_old = set(names_and_time_from_path(output_dir))
|
|
cmd = (
|
|
blender_bin, "--background", "--factory-startup", "-noaudio",
|
|
blend,
|
|
"--python", os.path.join(BASEDIR, "blender_icons_geom.py"),
|
|
"--",
|
|
"--group", "Export",
|
|
"--output-dir", output_dir,
|
|
)
|
|
|
|
env = {}
|
|
# Developers may have ASAN enabled, avoid non-zero exit codes.
|
|
env["ASAN_OPTIONS"] = "exitcode=0:" + os.environ.get("ASAN_OPTIONS", "")
|
|
# These NEED to be set on windows for python to initialize properly.
|
|
if sys.platform[:3] == "win":
|
|
env["PATHEXT"] = os.environ.get("PATHEXT", "")
|
|
env["SystemDrive"] = os.environ.get("SystemDrive", "")
|
|
env["SystemRoot"] = os.environ.get("SystemRoot", "")
|
|
|
|
run(cmd, env=env)
|
|
files_new = set(names_and_time_from_path(output_dir))
|
|
|
|
icon_files.extend([
|
|
name[:-4] # no .dat
|
|
for (name, _) in sorted((files_new - files_old))
|
|
])
|
|
|
|
|
|
edit_text_file(
|
|
os.path.join(ROOTDIR, "source", "blender", "editors", "datafiles", "CMakeLists.txt"),
|
|
"# BEGIN ICON_GEOM_NAMES",
|
|
"# END ICON_GEOM_NAMES",
|
|
" " + "\n ".join(icon_files) + "\n",
|
|
)
|