diff --git a/integration/CMakeDemo/CMakeLists.txt b/integration/CMakeDemo/CMakeLists.txt index 54769ad514b4b4194511543e6ebf0e88debdcbff..6642f40e63368d7ad60b4dd602eaab8e737c1c71 100644 --- a/integration/CMakeDemo/CMakeLists.txt +++ b/integration/CMakeDemo/CMakeLists.txt @@ -5,12 +5,14 @@ project( pssfg_cmake_integration_test ) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${pssfg_cmake_integration_test_SOURCE_DIR}/.cmake ) # Don't try this at home! +file(MAKE_DIRECTORY .cmake) execute_process( COMMAND sfg-cli cmake make-find-module WORKING_DIRECTORY ${pssfg_cmake_integration_test_SOURCE_DIR}/.cmake ) find_package( PystencilsSfg REQUIRED ) -# set( PSSFG_CONFIGURATOR_SCRIPT "codegen_config.py" ) +set( PystencilsSfg_CONFIGURATOR_SCRIPT codegen_config.py ) add_library( genlib ) -pystencilssfg_generate_target_sources( genlib SCRIPTS kernels.py more_kernels.py FILE_EXTENSIONS .hpp .cpp ) +pystencilssfg_generate_target_sources( genlib SCRIPTS kernels.py FILE_EXTENSIONS .h .cpp ) +pystencilssfg_generate_target_sources( genlib SCRIPTS more_kernels.py ) diff --git a/integration/CMakeDemo/codegen_config.py b/integration/CMakeDemo/codegen_config.py new file mode 100644 index 0000000000000000000000000000000000000000..67f309315f3b6bb95146d4be4a0e40dbd6b57d0e --- /dev/null +++ b/integration/CMakeDemo/codegen_config.py @@ -0,0 +1,16 @@ +from sys import stderr +from pystencilssfg import SfgConfiguration + +def sfg_config(): + print("sfg_config() called!", file=stderr) + + project_info = { + 'B': 'A' + } + + return SfgConfiguration( + header_extension='hpp', + source_extension='cpp', + base_namespace='cmake_demo', + project_info=project_info + ) diff --git a/src/pystencilssfg/__init__.py b/src/pystencilssfg/__init__.py index 96c285db2461ef2dea5bbc6880c4e6c3f5eedcdd..88a635ffd96cfea562ef3ad344ddb0c8b3bfa2e2 100644 --- a/src/pystencilssfg/__init__.py +++ b/src/pystencilssfg/__init__.py @@ -1,8 +1,9 @@ +from .configuration import SfgConfiguration from .generator import SourceFileGenerator from .composer import SfgComposer __all__ = [ - "SourceFileGenerator", "SfgComposer" + "SourceFileGenerator", "SfgComposer", "SfgConfiguration" ] from . import _version diff --git a/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake b/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake index b2d98f2160d6cbd3418ae2484904709289f5c770..26992cbb1e90fb5855248327c8233dcee9ff4a45 100644 --- a/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake +++ b/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake @@ -1,5 +1,4 @@ -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" ) mark_as_advanced(PystencilsSfg_GENERATED_SOURCES_DIR) @@ -19,7 +18,7 @@ function(_pssfg_add_gen_source target script) get_filename_component(basename ${script} NAME_WLE) cmake_path(ABSOLUTE_PATH script OUTPUT_VARIABLE scriptAbsolute) - execute_process(COMMAND ${Python_EXECUTABLE} -m pystencilssfg list-files "--sep=\;" --no-newline ${_pssfg_GENERATOR_ARGS} ${script} + execute_process(COMMAND ${Python_EXECUTABLE} -m pystencilssfg list-files "--sep=;" --no-newline ${_pssfg_GENERATOR_ARGS} ${script} OUTPUT_VARIABLE generatedSources RESULT_VARIABLE _pssfg_result ERROR_VARIABLE _pssfg_stderr) @@ -29,7 +28,7 @@ function(_pssfg_add_gen_source target script) set(generatedSourcesAbsolute) foreach (filename ${generatedSources}) - list(APPEND generatedSourcesAbsolute ${generatedSourcesDir}/${filename}) + list(APPEND generatedSourcesAbsolute "${generatedSourcesDir}/${filename}") endforeach () file(MAKE_DIRECTORY "${generatedSourcesDir}") @@ -54,8 +53,9 @@ function(pystencilssfg_generate_target_sources TARGET) list(APPEND generatorArgs "--sfg-header-only") endif() - if(NOT (PystencilsSfg_CONFIGURATOR_SCRIPT STREQUAL "")) - list(APPEND generatorArgs "--sfg-configurator='${_PystencilsSfg_CONFIGURATOR_SCRIPT}'") + if(DEFINED PystencilsSfg_CONFIGURATOR_SCRIPT) + cmake_path(ABSOLUTE_PATH PystencilsSfg_CONFIGURATOR_SCRIPT OUTPUT_VARIABLE configscript) + list(APPEND generatorArgs "--sfg-configurator=${configscript}") endif() if(DEFINED _pssfg_FILE_EXTENSIONS) diff --git a/src/pystencilssfg/configuration.py b/src/pystencilssfg/configuration.py index 1de3a19ed7c8322eb902b614e43b2bd611dd3bf4..ee828f476e0a10e0aa664ee03a9acb8a10c6168a 100644 --- a/src/pystencilssfg/configuration.py +++ b/src/pystencilssfg/configuration.py @@ -1,6 +1,8 @@ from __future__ import annotations +import sys from typing import Sequence, Any +from os import path from enum import Enum, auto from dataclasses import dataclass, replace, asdict, InitVar from argparse import ArgumentParser @@ -77,7 +79,7 @@ class SfgConfiguration: def override(self, other: SfgConfiguration): other_dict = asdict(other) - other_dict = {k: v for k, v in other_dict.items() if v is not None} + other_dict: dict[str, Any] = {k: v for k, v in other_dict.items() if v is not None} return replace(self, **other_dict) @@ -93,13 +95,16 @@ DEFAULT_CONFIG = SfgConfiguration( def run_configurator(configurator_script: str): - cfg_spec = iutil.spec_from_file_location(configurator_script) + cfg_modulename = path.splitext(path.split(configurator_script)[1])[0] + + cfg_spec = iutil.spec_from_file_location(cfg_modulename, configurator_script) if cfg_spec is None: raise SfgConfigException(SfgConfigSource.PROJECT, f"Unable to load configurator script {configurator_script}") configurator = iutil.module_from_spec(cfg_spec) + cfg_spec.loader.exec_module(configurator) if not hasattr(configurator, "sfg_config"): raise SfgConfigException(SfgConfigSource.PROJECT, "Project configurator does not define function `sfg_config`.")