b/c...py: compile into a temporary directory
Generate intermediate files into a temporary directory
This commit is contained in:
parent
81782ef23d
commit
0ab521e2ca
@ -4,12 +4,12 @@ if __name__ == "__main__":
|
|||||||
print(":: C bytebeat generator: compiler unit")
|
print(":: C bytebeat generator: compiler unit")
|
||||||
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from os import environ, listdir, makedirs, name as os_name, \
|
from os import environ, makedirs, name as os_name, rename
|
||||||
remove as delete_file, rmdir
|
from os.path import basename, exists, join as path_join
|
||||||
from os.path import exists, join as path_join
|
|
||||||
from shlex import join as command_line_join, split as command_line_split
|
from shlex import join as command_line_join, split as command_line_split
|
||||||
from shutil import which
|
from shutil import which
|
||||||
from sys import stdin, stdout
|
from sys import stdin, stdout
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
from typing import Dict, Union
|
from typing import Dict, Union
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -33,8 +33,8 @@ PATHS = {
|
|||||||
|
|
||||||
# Resolve paths
|
# Resolve paths
|
||||||
PATHS["template"] = path_join(PATHS["src_dir"], PATHS["template"])
|
PATHS["template"] = path_join(PATHS["src_dir"], PATHS["template"])
|
||||||
PATHS["substitute"] = path_join(PATHS["bin_dir"], PATHS["substitute"])
|
PATHS["substitute_kept"] = path_join(PATHS["bin_dir"], PATHS["substitute"])
|
||||||
PATHS["output"] = path_join(PATHS["bin_dir"], PATHS["output"])
|
PATHS["output_kept"] = path_join(PATHS["bin_dir"], PATHS["output"])
|
||||||
PATHS["fwrite_le"] = path_join(PATHS["src_dir"], PATHS["fwrite_le"])
|
PATHS["fwrite_le"] = path_join(PATHS["src_dir"], PATHS["fwrite_le"])
|
||||||
|
|
||||||
# Add `.` directory before all paths for compilation
|
# Add `.` directory before all paths for compilation
|
||||||
@ -48,8 +48,8 @@ DEFAULT_PARAMETERS = {
|
|||||||
"CFLAGS": "-Ofast -march=native -mtune=native -Wall -Wextra -Wpedantic "
|
"CFLAGS": "-Ofast -march=native -mtune=native -Wall -Wextra -Wpedantic "
|
||||||
"-pedantic -Wno-unused-variable -Wno-unused-but-set-variable "
|
"-pedantic -Wno-unused-variable -Wno-unused-but-set-variable "
|
||||||
"-Wno-dangling-else -Wno-parentheses -std=c99",
|
"-Wno-dangling-else -Wno-parentheses -std=c99",
|
||||||
"INPUT_FILE": PATHS["substitute"],
|
"INPUT_FILE": PATHS["substitute_kept"],
|
||||||
"OUTPUT_FILE": PATHS["output"]
|
"OUTPUT_FILE": PATHS["output_kept"]
|
||||||
}
|
}
|
||||||
|
|
||||||
stdout_atty = hasattr(stdout, "isatty") and stdout.isatty()
|
stdout_atty = hasattr(stdout, "isatty") and stdout.isatty()
|
||||||
@ -95,10 +95,6 @@ def run_command(*command: list[str]) -> None:
|
|||||||
if subprocess.run(command).returncode != EXIT_SUCCESS:
|
if subprocess.run(command).returncode != EXIT_SUCCESS:
|
||||||
raise SystemExit(EXIT_FAILURE)
|
raise SystemExit(EXIT_FAILURE)
|
||||||
|
|
||||||
def delete_empty_dir(path: str) -> None:
|
|
||||||
if exists(path) and len(listdir(path)) == 0:
|
|
||||||
rmdir(path)
|
|
||||||
|
|
||||||
preprocessor_bool = lambda value: "1" if value else "0"
|
preprocessor_bool = lambda value: "1" if value else "0"
|
||||||
C_str_repr = lambda s: '"' + s.replace("\\", "\\\\").replace(r'"', r'\"') + '"'
|
C_str_repr = lambda s: '"' + s.replace("\\", "\\\\").replace(r'"', r'\"') + '"'
|
||||||
|
|
||||||
@ -251,8 +247,6 @@ if __name__ == "__main__":
|
|||||||
args.signed = False
|
args.signed = False
|
||||||
|
|
||||||
# - Compilation
|
# - Compilation
|
||||||
makedirs(PATHS["bin_dir"], exist_ok=True)
|
|
||||||
|
|
||||||
if not args.no_return: # Insert `return` statement
|
if not args.no_return: # Insert `return` statement
|
||||||
# XXX: The bytebeat code is enclosed in parentheses to allow for the
|
# XXX: The bytebeat code is enclosed in parentheses to allow for the
|
||||||
# use of commas as a comma operator, enabling more formulas to function.
|
# use of commas as a comma operator, enabling more formulas to function.
|
||||||
@ -337,7 +331,30 @@ if __name__ == "__main__":
|
|||||||
gen_length = length_formula(args.channels, samples, 0)
|
gen_length = length_formula(args.channels, samples, 0)
|
||||||
loop_end = length_formula(args.channels, samples, skip_first_samples)
|
loop_end = length_formula(args.channels, samples, skip_first_samples)
|
||||||
|
|
||||||
rewrite_file(PATHS["substitute"], substitute_vars({
|
if is_cmd_unavailable(CC):
|
||||||
|
print(f"Compiler {CC} is not available, searching:")
|
||||||
|
|
||||||
|
still_unavailable = True
|
||||||
|
for compiler in CC_SEARCH_LIST:
|
||||||
|
print(f"* Trying CC={compiler}", end="")
|
||||||
|
if is_cmd_available(compiler):
|
||||||
|
print(": OK")
|
||||||
|
CC = compiler
|
||||||
|
still_unavailable = False
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print()
|
||||||
|
|
||||||
|
if still_unavailable:
|
||||||
|
raise SystemExit("Could not find an available compiler. Please "
|
||||||
|
"specify it by setting\nan environmental variable "
|
||||||
|
"CC.")
|
||||||
|
|
||||||
|
with TemporaryDirectory() as tmpdirname:
|
||||||
|
temporary_path = lambda path: path_join(tmpdirname, basename(path))
|
||||||
|
|
||||||
|
substitute_temp = temporary_path(INPUT_FILE)
|
||||||
|
rewrite_file(substitute_temp, substitute_vars({
|
||||||
"bytebeat_contents": bytebeat_contents,
|
"bytebeat_contents": bytebeat_contents,
|
||||||
"output_file": C_str_repr(args.output),
|
"output_file": C_str_repr(args.output),
|
||||||
"sample_rate": actual_sample_rate,
|
"sample_rate": actual_sample_rate,
|
||||||
@ -364,39 +381,23 @@ if __name__ == "__main__":
|
|||||||
"ansi_escape_codes_supported": ansi_escape_codes_supported
|
"ansi_escape_codes_supported": ansi_escape_codes_supported
|
||||||
}, read_file(PATHS["template"]), args.show_substituted_values))
|
}, read_file(PATHS["template"]), args.show_substituted_values))
|
||||||
|
|
||||||
if is_cmd_unavailable(CC):
|
|
||||||
print(f"Compiler {CC} is not available, searching:")
|
|
||||||
|
|
||||||
still_unavailable = True
|
|
||||||
for compiler in CC_SEARCH_LIST:
|
|
||||||
print(f"* Trying CC={compiler}", end="")
|
|
||||||
if is_cmd_available(compiler):
|
|
||||||
print(": OK")
|
|
||||||
CC = compiler
|
|
||||||
still_unavailable = False
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
print()
|
|
||||||
|
|
||||||
if still_unavailable:
|
|
||||||
raise SystemExit("Could not find an available compiler. Please "
|
|
||||||
"specify it by setting\nan environmental variable "
|
|
||||||
"CC.")
|
|
||||||
|
|
||||||
# Compile
|
# Compile
|
||||||
print("Compiling")
|
print("Compiling")
|
||||||
|
|
||||||
|
output_file_temp = temporary_path(OUTPUT_FILE)
|
||||||
|
|
||||||
run_command(
|
run_command(
|
||||||
CC,
|
CC,
|
||||||
*command_line_split(CFLAGS),
|
*command_line_split(CFLAGS),
|
||||||
INPUT_FILE,
|
substitute_temp,
|
||||||
PATHS["fwrite_le"],
|
PATHS["fwrite_le"],
|
||||||
"-o", OUTPUT_FILE,
|
"-o", output_file_temp,
|
||||||
"-I" + PATHS["include_directory"]
|
"-I" + PATHS["include_directory"]
|
||||||
)
|
)
|
||||||
run_command(OUTPUT_FILE)
|
run_command(output_file_temp)
|
||||||
|
|
||||||
if not args.keep_files:
|
if args.keep_files:
|
||||||
delete_file(PATHS["substitute"])
|
makedirs(PATHS["bin_dir"], exist_ok=True)
|
||||||
delete_file(OUTPUT_FILE)
|
|
||||||
delete_empty_dir(PATHS["bin_dir"])
|
rename(substitute_temp, INPUT_FILE)
|
||||||
|
rename(output_file_temp, OUTPUT_FILE)
|
||||||
|
Loading…
Reference in New Issue
Block a user