"""Compile all OpenSCAD files into a build directory and package it with docs. (a.k.a.: "make is hard" SPDX-FileCopyrightText: © 2024 Brian S. Stephan SPDX-License-Identifier: GPL-3.0-or-later """ import os import os.path import re import subprocess PROJECT_ROOT = os.path.abspath(os.getcwd()) BUILD_DIR = os.path.join(PROJECT_ROOT, 'build/') SOURCE_DIR = os.path.join(PROJECT_ROOT, 'src/') EXCLUDES = ['components.scad', 'parameters.scad'] # set up our environment to point openscad at the right stuff os.environ['OPENSCADPATH'] = SOURCE_DIR # track processes to wait on processes = [] os.chdir(SOURCE_DIR) for root, dirs, files in os.walk('.'): print(f"{root} {dirs} {files}") # make the current directory so that openscad can write stuff into it try: os.makedirs(os.path.join(BUILD_DIR, root)) except FileExistsError: pass input_dir = os.path.join(SOURCE_DIR, root) output_dir = os.path.join(BUILD_DIR, root) for file in files: if not re.match(r'.*\.scad$', file): continue if file in EXCLUDES: continue stl_file = re.sub(r'\.scad$', '.stl', file) input_ = os.path.join(input_dir, file) output = os.path.join(output_dir, stl_file) cmd = f'openscad -o {output} {input_}' print(cmd) processes.append(subprocess.Popen(cmd.split(' '))) for process in processes: process.wait()