Skip to content
Snippets Groups Projects
Commit aff6f4fd authored by Frederik Hennig's avatar Frederik Hennig
Browse files

added cli script + patches to cmake_integration

parent a0b5f900
No related branches found
No related tags found
No related merge requests found
Pipeline #57221 passed
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
.pdm-python .pdm-python
# build artifacts # build artifacts
dist
*.tar.gz *.tar.gz
*.whl *.whl
*.egg-info *.egg-info
include src/pystencilssfg/cmake/*.cmake
\ No newline at end of file
set( PystencilsSfg_FOUND OFF CACHE BOOL "pystencils source file generator found" ) set( PystencilsSfg_FOUND OFF CACHE BOOL "pystencils source file generator found" )
set( PystencilsSfg_CONFIGURATOR_SCRIPT "" CACHE STRING "Configurator script for the pystencils source file generator" )
mark_as_advanced( PystencilsSfg_FOUND ) mark_as_advanced( PystencilsSfg_FOUND )
......
...@@ -13,6 +13,9 @@ readme = "README.md" ...@@ -13,6 +13,9 @@ readme = "README.md"
license = {text = "noneyet"} license = {text = "noneyet"}
dynamic = ["version"] dynamic = ["version"]
[project.scripts]
sfg-cli = "pystencilssfg.cli:cli_main"
[build-system] [build-system]
requires = ["setuptools>=61", "versioneer>=0.29"] requires = ["setuptools>=61", "versioneer>=0.29"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
......
import sys
from os import path
from argparse import ArgumentParser if __name__ == "__main__":
from .cli import cli_main
from .configuration import ( cli_main("python -m pystencilssfg")
SfgConfigException, SfgConfigSource,
add_config_args_to_parser, config_from_parser_args, merge_configurations
)
def main():
parser = ArgumentParser("pystencilssfg",
description="pystencilssfg command-line utility")
subparsers = parser.add_subparsers(required=True, title="Subcommands")
version_parser = subparsers.add_parser(
"version", help="Print version and exit.")
version_parser.set_defaults(func=version)
outfiles_parser = subparsers.add_parser(
"list-files", help="List files produced by given codegen script.")
outfiles_parser.set_defaults(func=list_files)
outfiles_parser.add_argument(
"--format", type=str, choices=("human", "cmake"), default="human")
outfiles_parser.add_argument("codegen_script", type=str)
add_config_args_to_parser(outfiles_parser)
args = parser.parse_args()
args.func(args)
def version(args, argv):
from . import __version__
print(__version__)
exit(0)
def list_files(args):
try:
project_config, cmdline_config = config_from_parser_args(args)
except SfgConfigException as exc:
abort_with_config_exception(exc)
config = merge_configurations(project_config, cmdline_config, None)
scriptdir, scriptname = path.split(args.codegen_script)
basename = path.splitext(scriptname)[0]
from .emitters.cpu.basic_cpu import BasicCpuEmitter
emitter = BasicCpuEmitter(basename, config)
match args.format:
case "human": print(" ".join(emitter.output_files))
case "cmake": print(";".join(emitter.output_files), end="")
exit(0)
def abort_with_config_exception(exception: SfgConfigException):
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
match exception.config_source:
case SfgConfigSource.PROJECT:
eprint(
f"Invalid project configuration: {exception.message}\nCheck your configurator script.")
case SfgConfigSource.COMMANDLINE:
eprint(
f"Invalid configuration on command line: {exception.message}")
case _: assert False, "(Theoretically) unreachable code. Contact the developers."
exit(1)
main()
import sys
from os import path
from argparse import ArgumentParser
from .configuration import (
SfgConfigException, SfgConfigSource,
add_config_args_to_parser, config_from_parser_args, merge_configurations
)
def cli_main(program='sfg-cli'):
parser = ArgumentParser(program,
description="pystencilssfg command-line utility")
subparsers = parser.add_subparsers(required=True, title="Subcommands")
version_parser = subparsers.add_parser(
"version", help="Print version and exit.")
version_parser.set_defaults(func=version)
outfiles_parser = subparsers.add_parser(
"list-files", help="List files produced by given codegen script.")
outfiles_parser.set_defaults(func=list_files)
outfiles_parser.add_argument(
"--format", type=str, choices=("human", "cmake"), default="human")
outfiles_parser.add_argument("codegen_script", type=str)
add_config_args_to_parser(outfiles_parser)
args = parser.parse_args()
args.func(args)
exit(-1) # should never happen
def version(args):
from . import __version__
print(__version__)
exit(0)
def list_files(args):
try:
project_config, cmdline_config = config_from_parser_args(args)
except SfgConfigException as exc:
abort_with_config_exception(exc)
config = merge_configurations(project_config, cmdline_config, None)
scriptdir, scriptname = path.split(args.codegen_script)
basename = path.splitext(scriptname)[0]
from .emitters.cpu.basic_cpu import BasicCpuEmitter
emitter = BasicCpuEmitter(basename, config)
match args.format:
case "human": print(" ".join(emitter.output_files))
case "cmake": print(";".join(emitter.output_files), end="")
exit(0)
def abort_with_config_exception(exception: SfgConfigException):
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
match exception.config_source:
case SfgConfigSource.PROJECT:
eprint(
f"Invalid project configuration: {exception.message}\nCheck your configurator script.")
case SfgConfigSource.COMMANDLINE:
eprint(
f"Invalid configuration on command line: {exception.message}")
case _: assert False, "(Theoretically) unreachable code. Contact the developers."
exit(1)
set(PSSFG_CONFIGURATOR_SCRIPT "" CACHE FILEPATH "Configurator script for the pystencils Source File Generator" ) set(PystencilsSfg_CONFIGURATOR_SCRIPT "" CACHE FILEPATH "Configurator script for the pystencils Source File Generator" )
set(PystencilsSfg_GENERATED_SOURCES_DIR "${CMAKE_BINARY_DIR}/sfg_sources" CACHE PATH "Output directory for genenerated sources" )
set(PSSFG_GENERATED_SOURCES_DIR "${CMAKE_BINARY_DIR}/pystencils_generated_sources") mark_as_advanced(PystencilsSfg_GENERATED_SOURCES_DIR)
file(MAKE_DIRECTORY "${PSSFG_GENERATED_SOURCES_DIR}")
include_directories(${PSSFG_GENERATED_SOURCES_DIR}) file(MAKE_DIRECTORY "${PystencilsSfg_GENERATED_SOURCES_DIR}")
include_directories(${PystencilsSfg_GENERATED_SOURCES_DIR})
function(_pssfg_add_gen_source target script) function(_pssfg_add_gen_source target script)
...@@ -13,7 +15,7 @@ function(_pssfg_add_gen_source target script) ...@@ -13,7 +15,7 @@ function(_pssfg_add_gen_source target script)
cmake_parse_arguments(_pssfg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(_pssfg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(generatedSourcesDir ${PSSFG_GENERATED_SOURCES_DIR}/gen/${target}) set(generatedSourcesDir ${PystencilsSfg_GENERATED_SOURCES_DIR}/${target})
get_filename_component(basename ${script} NAME_WLE) get_filename_component(basename ${script} NAME_WLE)
cmake_path(ABSOLUTE_PATH script OUTPUT_VARIABLE scriptAbsolute) cmake_path(ABSOLUTE_PATH script OUTPUT_VARIABLE scriptAbsolute)
...@@ -46,16 +48,14 @@ function(pystencilssfg_generate_target_sources TARGET) ...@@ -46,16 +48,14 @@ function(pystencilssfg_generate_target_sources TARGET)
set(multiValueArgs SCRIPTS DEPENDS FILE_EXTENSIONS) set(multiValueArgs SCRIPTS DEPENDS FILE_EXTENSIONS)
cmake_parse_arguments(_pssfg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(_pssfg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(generatedSourcesDir ${PSSFG_GENERATED_SOURCES_DIR}/gen/${_pssfg_TARGET})
set(generatorArgs) set(generatorArgs)
if(_pssfg_HEADER_ONLY) if(_pssfg_HEADER_ONLY)
list(APPEND generatorArgs "--sfg-header-only") list(APPEND generatorArgs "--sfg-header-only")
endif() endif()
if(NOT (PSSFG_CONFIGURATOR_SCRIPT STREQUAL "")) if(NOT (PystencilsSfg_CONFIGURATOR_SCRIPT STREQUAL ""))
list(APPEND generatorArgs "--sfg-configurator='${_pssfg_CONFIGURATOR_SCRIPT}'") list(APPEND generatorArgs "--sfg-configurator='${_PystencilsSfg_CONFIGURATOR_SCRIPT}'")
endif() endif()
if(DEFINED _pssfg_FILE_EXTENSIONS) if(DEFINED _pssfg_FILE_EXTENSIONS)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment