pogojig/support/openscad/__main__.py
Michael Schwarz 987fa08ce6 New workaround for temp dir on different device.
Currently, on setups where the project dir is on a different file system as the system temporary directory, a temporary directory is instead created on the project dir. This is not very nice.

With this change, we still create temporary files in the system temporary directory but copy instead of move files from and to the temporary directory, if necessary, which solves the problems.
2015-09-16 01:40:00 +02:00

54 lines
1.7 KiB
Python

import os, sys
from lib import util
def _openscad(in_path, out_path, deps_path):
util.command([os.environ['OPENSCAD'], '-o', out_path, '-d', deps_path, in_path])
def _write_dependencies(path, target, dependencies):
util.write_file(path, '{}: {}\n'.format(target, ' '.join(dependencies)).encode())
def main(in_path, out_path, deps_path):
cwd = os.getcwd()
def relpath(path):
return os.path.relpath(path, cwd)
with util.TemporaryDirectory() as temp_dir:
temp_deps_path = os.path.join(temp_dir, 'deps')
temp_mk_path = os.path.join(temp_dir, 'mk')
temp_files_path = os.path.join(temp_dir, 'files')
_, out_ext = os.path.splitext(out_path)
# OpenSCAD requires the output file name to end in .stl or .dxf.
temp_out_path = os.path.join(temp_dir, 'out' + out_ext)
_openscad(in_path, temp_out_path, temp_deps_path)
mk_content = '%:; echo "$@" >> {}'.format(util.bash_escape_string(temp_files_path))
# Use make to parse the dependency makefile written by OpenSCAD.
util.write_file(temp_mk_path, mk_content.encode())
util.command(['make', '-s', '-B', '-f', temp_mk_path, '-f', temp_deps_path], remove_env = ['MAKELEVEL', 'MAKEFLAGS'])
# All dependencies as paths relative to the project root.
deps = set(map(relpath, util.read_file(temp_files_path).decode().splitlines()))
# Relative paths to all files that should not appear in the dependency makefile.
ignored_files = set(map(relpath, [in_path, temp_deps_path, temp_mk_path, temp_out_path]))
# Write output files.
_write_dependencies(deps_path, relpath(out_path), deps - ignored_files)
util.rename_atomic(temp_out_path, out_path)
try:
main(*sys.argv[1:])
except util.UserError as e:
print 'Error:', e
sys.exit(1)
except KeyboardInterrupt:
sys.exit(2)