Skip to content
Snippets Groups Projects
Commit 0e5fc53c authored by Markus Holzer's avatar Markus Holzer Committed by Dominik Thoennes
Browse files

Clean CMake with CodeGen

parent b4862805
No related merge requests found
...@@ -3,7 +3,6 @@ from dataclasses import replace ...@@ -3,7 +3,6 @@ from dataclasses import replace
import sympy as sp import sympy as sp
import pystencils as ps import pystencils as ps
from pystencils.fast_approximation import insert_fast_divisions, insert_fast_sqrts
from pystencils.simp.subexpression_insertion import insert_zeros, insert_aliases, insert_constants,\ from pystencils.simp.subexpression_insertion import insert_zeros, insert_aliases, insert_constants,\
insert_symbol_times_minus_one insert_symbol_times_minus_one
......
...@@ -61,25 +61,23 @@ function( waLBerla_generate_target_from_python ) ...@@ -61,25 +61,23 @@ function( waLBerla_generate_target_from_python )
list(APPEND generatedWithAbsolutePath ${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}/${filename}) list(APPEND generatedWithAbsolutePath ${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}/${filename})
endforeach() endforeach()
string (REPLACE ";" "\", \"" jsonFileList "${generatedWithAbsolutePath}" ) set(cmakeVars "\\\{ "
set(pythonParameters "\"WALBERLA_OPTIMIZE_FOR_LOCALHOST\": \"${WALBERLA_OPTIMIZE_FOR_LOCALHOST}\","
"\\\{\"EXPECTED_FILES\": [\"${jsonFileList}\"], \"CMAKE_VARS\" : \\\{ " "\"WALBERLA_DOUBLE_ACCURACY\": \"${WALBERLA_DOUBLE_ACCURACY}\","
"\"WALBERLA_OPTIMIZE_FOR_LOCALHOST\": \"${WALBERLA_OPTIMIZE_FOR_LOCALHOST}\"," "\"CODEGEN_CFG\": \"${codegenCfg}\","
"\"WALBERLA_DOUBLE_ACCURACY\": \"${WALBERLA_DOUBLE_ACCURACY}\"," "\"WALBERLA_BUILD_WITH_MPI\": \"${WALBERLA_BUILD_WITH_MPI}\","
"\"CODEGEN_CFG\": \"${codegenCfg}\"," "\"WALBERLA_BUILD_WITH_CUDA\": \"${WALBERLA_BUILD_WITH_CUDA}\","
"\"WALBERLA_BUILD_WITH_MPI\": \"${WALBERLA_BUILD_WITH_MPI}\"," "\"WALBERLA_BUILD_WITH_OPENMP\": \"${WALBERLA_BUILD_WITH_OPENMP}\" \\\}"
"\"WALBERLA_BUILD_WITH_CUDA\": \"${WALBERLA_BUILD_WITH_CUDA}\"," )
"\"WALBERLA_BUILD_WITH_OPENMP\": \"${WALBERLA_BUILD_WITH_OPENMP}\" \\\} \\\}" string(REPLACE "\"" "\\\"" cmakeVars ${cmakeVars}) # even one more quoting level required
) string(REPLACE "\n" "" cmakeVars ${cmakeVars}) # remove newline characters
string(REPLACE "\"" "\\\"" pythonParameters ${pythonParameters}) # even one more quoting level required
string(REPLACE "\n" "" pythonParameters ${pythonParameters}) # remove newline characters
set( WALBERLA_PYTHON_DIR ${walberla_SOURCE_DIR}/python) set( WALBERLA_PYTHON_DIR ${walberla_SOURCE_DIR}/python)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}") file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}")
add_custom_command(OUTPUT ${generatedWithAbsolutePath} add_custom_command(OUTPUT ${generatedWithAbsolutePath}
DEPENDS ${sourceFile} DEPENDS ${sourceFile}
COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${WALBERLA_PYTHON_DIR}:$ENV{PYTHONPATH} ${Python_EXECUTABLE} ${sourceFile} ${pythonParameters} COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${WALBERLA_PYTHON_DIR}:$ENV{PYTHONPATH} ${Python_EXECUTABLE} ${sourceFile} -f ${generatedWithAbsolutePath} -c ${cmakeVars}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}") WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${codegenCfg}")
add_library(${PYGEN_NAME} ${generatedWithAbsolutePath}) add_library(${PYGEN_NAME} ${generatedWithAbsolutePath})
......
...@@ -9,19 +9,41 @@ Usage example: ...@@ -9,19 +9,41 @@ Usage example:
codegen.register(['MyClass.h', 'MyClass.cpp'], functionReturningTwoStringsForHeaderAndCpp) codegen.register(['MyClass.h', 'MyClass.cpp'], functionReturningTwoStringsForHeaderAndCpp)
""" """
import argparse
import json import json
import os import os
import sys
import warnings
__all__ = ['CodeGeneration', 'ManualCodeGenerationContext'] __all__ = ['CodeGeneration', 'ManualCodeGenerationContext']
DEFAULT_CMAKE_VARS = {'WALBERLA_BUILD_WITH_OPENMP': False,
'WALBERLA_OPTIMIZE_FOR_LOCALHOST': False,
'WALBERLA_DOUBLE_ACCURACY': True,
'WALBERLA_BUILD_WITH_MPI': True,
'WALBERLA_BUILD_WITH_CUDA': False,
"CODEGEN_CFG": ""}
PARSE_HELPER = {"on": True, "1": True, "yes": True, "true": True,
"off": False, "0": False, "no": False, "false": False}
class CodeGeneration: class CodeGeneration:
def __init__(self): def __init__(self):
expected_files, cmake_vars = parse_json_args() parser = argparse.ArgumentParser(description='Code Generation script for waLBerla.')
self.context = CodeGenerationContext(cmake_vars) parser.add_argument('-f', '--files', nargs='*',
self.expected_files = expected_files help='List all files that will be generated with absolute path',
default=[])
parser.add_argument('-c', '--cmake-args', type=json.loads,
help='Provide CMake configuration (will be used in the codegen config)',
default=DEFAULT_CMAKE_VARS)
parser.add_argument('-l', '--list-only',
help="Script will not generate files but list files it would generated without this option")
args = parser.parse_args()
cmake_args = {key: PARSE_HELPER.get(str(value).lower(), value) for key, value in args.cmake_args.items()}
self.context = CodeGenerationContext(cmake_args)
self.expected_files = args.files
self.list_only = True if args.list_only else False
def __enter__(self): def __enter__(self):
return self.context return self.context
...@@ -43,35 +65,6 @@ class CodeGeneration: ...@@ -43,35 +65,6 @@ class CodeGeneration:
raise ValueError(error_message) raise ValueError(error_message)
def parse_json_args():
default = {'EXPECTED_FILES': [],
'CMAKE_VARS': {'WALBERLA_BUILD_WITH_OPENMP': False,
'WALBERLA_OPTIMIZE_FOR_LOCALHOST': False,
'WALBERLA_DOUBLE_ACCURACY': True,
'WALBERLA_BUILD_WITH_MPI': True,
'WALBERLA_BUILD_WITH_CUDA': False,
"CODEGEN_CFG": ""}
}
if len(sys.argv) == 2:
try:
parsed = json.loads(sys.argv[1])
except json.JSONDecodeError:
warnings.warn("Could not parse JSON arguments: " + sys.argv[1])
parsed = default
else:
parsed = default
expected_files = parsed['EXPECTED_FILES']
cmake_vars = {}
for key, value in parsed['CMAKE_VARS'].items():
if str(value).lower() in ("on", "1", "yes", "true"):
value = True
elif str(value).lower() in ("off", "0", "no", "false"):
value = False
cmake_vars[key] = value
return expected_files, cmake_vars
class CodeGenerationContext: class CodeGenerationContext:
def __init__(self, cmake_vars): def __init__(self, cmake_vars):
self.files_written = [] self.files_written = []
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment