1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
|
cmake_minimum_required(VERSION 3.16)
include(${CMAKE_SOURCE_DIR}/cmake/MwrapAddMex.cmake)
add_custom_target(mwrap_examples)
set(example_source_dir "${CMAKE_CURRENT_SOURCE_DIR}")
set(_mwrap_example_targets
foobar
eventq_plain
eventq_handle
eventq_class
eventq2
zlib
fem_interface
)
set(fem_interface_support_sources
"${example_source_dir}/fem/src/assembler.cc"
"${example_source_dir}/fem/src/gauss2by2.cc"
"${example_source_dir}/fem/src/mesh.cc"
"${example_source_dir}/fem/src/quad2d1.cc"
"${example_source_dir}/fem/src/scalar1d.cc"
"${example_source_dir}/fem/src/scalar2d.cc"
"${example_source_dir}/fem/src/elastic2d1.cc"
)
mwrap_add_mex(foobar
MEX_NAME fbmex
CC_FILENAME fbmex.cc
M_FILENAME foobar.m
MW_FILES "${example_source_dir}/foobar/foobar.mw"
)
mwrap_add_mex(eventq_plain
MEX_NAME eventqpmex
CC_FILENAME eventqpmex.cc
MW_FILES "${example_source_dir}/eventq/eventq_plain.mw"
MWRAP_FLAGS -mb
)
mwrap_add_mex(eventq_handle
MEX_NAME eventqhmex
CC_FILENAME eventqhmex.cc
MW_FILES "${example_source_dir}/eventq/eventq_handle.mw"
MWRAP_FLAGS -mb
COMPILE_DEFINITIONS R2008OO
)
mwrap_add_mex(eventq_class
MEX_NAME eventqcmex
CC_FILENAME eventqcmex.cc
MW_FILES "${example_source_dir}/eventq/eventq_class.mw"
MWRAP_FLAGS -mb
CLASSDEF_NAME eventq
)
mwrap_add_mex(eventq2
MEX_NAME eventq2mex
CC_FILENAME eventq2mex.cc
MW_FILES "${example_source_dir}/eventq2/eventq2.mw"
MWRAP_FLAGS -mb
)
mwrap_add_mex(zlib
MEX_NAME gzmex
CC_FILENAME gzmex.cc
MW_FILES "${example_source_dir}/zlib/gzfile.mw"
MWRAP_FLAGS -mb
)
mwrap_add_mex(fem_interface
MEX_NAME femex
CC_FILENAME femex.cc
MW_FILES
"${example_source_dir}/fem/interface/assembler.mw"
"${example_source_dir}/fem/interface/mesh.mw"
"${example_source_dir}/fem/interface/elements.mw"
MWRAP_FLAGS -mb
EXTRA_SOURCES ${fem_interface_support_sources}
INCLUDE_DIRECTORIES "${example_source_dir}/fem/src"
)
foreach(example_target IN LISTS _mwrap_example_targets)
add_dependencies(mwrap_examples ${example_target})
endforeach()
if(MWRAP_COMPILE_MEX AND MWRAP_MEX_BACKENDS)
foreach(example_target IN LISTS _mwrap_example_targets)
_mwrap_compile_mex(${example_target} OUTPUT_VAR _mwrap_mex_targets)
get_target_property(_mex_output_dir ${example_target} MWRAP_OUTPUT_DIRECTORY)
get_target_property(_mex_target_list ${example_target} MWRAP_OUTPUT_MEX_TARGETS)
get_target_property(_mex_path_list ${example_target} MWRAP_OUTPUT_MEX_PATHS)
if(NOT _mex_target_list OR _mex_target_list STREQUAL "NOTFOUND")
continue()
endif()
if(NOT _mex_path_list OR _mex_path_list STREQUAL "NOTFOUND")
set(_mex_path_list)
endif()
list(LENGTH _mex_target_list _mex_target_count)
list(LENGTH _mex_path_list _mex_path_count)
if(NOT _mex_target_count EQUAL _mex_path_count)
message(FATAL_ERROR "Mismatch between recorded MEX targets and paths for ${example_target}")
endif()
math(EXPR _mex_index "0")
foreach(_mex_target IN LISTS _mex_target_list)
list(GET _mex_path_list ${_mex_index} _mex_path)
add_dependencies(mwrap_examples ${_mex_target})
if(_mex_output_dir AND NOT _mex_output_dir STREQUAL "NOTFOUND")
set(_mex_should_copy TRUE)
if(_mex_path MATCHES "\\$<TARGET_FILE:")
set(_mex_source_path "${_mex_path}")
set(_mex_dest_name "$<TARGET_FILE_NAME:${_mex_target}>")
set(_mex_dest_path "${_mex_output_dir}/${_mex_dest_name}")
else()
set(_mex_source_path "${_mex_path}")
if(NOT IS_ABSOLUTE "${_mex_source_path}")
get_filename_component(_mex_source_path "${_mex_source_path}" ABSOLUTE)
endif()
get_filename_component(_mex_dest_name "${_mex_path}" NAME)
set(_mex_dest_path "${_mex_output_dir}/${_mex_dest_name}")
if(NOT IS_ABSOLUTE "${_mex_dest_path}")
get_filename_component(_mex_dest_path "${_mex_dest_path}" ABSOLUTE)
endif()
if(_mex_source_path STREQUAL _mex_dest_path)
set(_mex_should_copy FALSE)
endif()
endif()
if(_mex_should_copy)
add_custom_command(TARGET ${_mex_target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${_mex_output_dir}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${_mex_source_path}"
"${_mex_dest_path}"
)
endif()
endif()
math(EXPR _mex_index "${_mex_index} + 1")
endforeach()
endforeach()
endif()
if(BUILD_TESTING AND MWRAP_COMPILE_MEX)
if(MWRAP_MEX_BACKENDS)
list(FIND MWRAP_MEX_BACKENDS "OCTAVE" _mwrap_octave_index)
list(FIND MWRAP_MEX_BACKENDS "MATLAB" _mwrap_matlab_index)
else()
set(_mwrap_octave_index -1)
set(_mwrap_matlab_index -1)
endif()
function(_mwrap_prepare_smoke_test_runner target_name runner_var workdir_var script_basename_var runner_escape_var)
set(options)
set(oneValueArgs SCRIPT WORKSPACE)
set(multiValueArgs EXTRA_PATHS)
cmake_parse_arguments(MTEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT TARGET ${target_name})
message(FATAL_ERROR "Unknown target '${target_name}' requested for smoke test")
endif()
if(NOT MTEST_SCRIPT)
message(FATAL_ERROR "SCRIPT must be provided for smoke test on target '${target_name}'")
endif()
get_target_property(wrapper_dir ${target_name} MWRAP_OUTPUT_DIRECTORY)
if(NOT wrapper_dir OR wrapper_dir STREQUAL "NOTFOUND")
message(FATAL_ERROR "Target '${target_name}' is missing wrapper directory metadata")
endif()
get_target_property(classdef_dir ${target_name} MWRAP_OUTPUT_CLASSDEF_DIR)
if(NOT classdef_dir OR classdef_dir STREQUAL "NOTFOUND")
unset(classdef_dir)
endif()
set(test_paths ${MTEST_EXTRA_PATHS} "${wrapper_dir}")
if(classdef_dir)
list(APPEND test_paths "${classdef_dir}")
endif()
list(REMOVE_DUPLICATES test_paths)
set(path_commands "")
foreach(test_path IN LISTS test_paths)
if(test_path)
file(TO_CMAKE_PATH "${test_path}" test_path_cmake)
string(REPLACE "'" "''" test_path_escaped "${test_path_cmake}")
string(APPEND path_commands "addpath('${test_path_escaped}');\n")
endif()
endforeach()
if(path_commands STREQUAL "")
set(path_commands "% No additional paths required\n")
endif()
if(MTEST_WORKSPACE)
set(work_dir "${MTEST_WORKSPACE}")
file(MAKE_DIRECTORY "${work_dir}")
file(TO_CMAKE_PATH "${work_dir}" work_dir_cmake)
string(REPLACE "'" "''" work_dir_escaped "${work_dir_cmake}")
set(work_dir_command "cd('${work_dir_escaped}');\n")
else()
set(work_dir "${CMAKE_CURRENT_BINARY_DIR}")
set(work_dir_command "% No staging directory requested\n")
file(TO_CMAKE_PATH "${work_dir}" work_dir_cmake)
endif()
get_filename_component(script_basename "${MTEST_SCRIPT}" NAME_WE)
set(runner_file "${CMAKE_CURRENT_BINARY_DIR}/${script_basename}_runner.m")
file(TO_CMAKE_PATH "${MTEST_SCRIPT}" script_path_cmake)
string(REPLACE "'" "''" script_path_escaped "${script_path_cmake}")
set(PATHS "${path_commands}")
set(WORK_DIR "${work_dir_command}")
set(CALL "${script_path_escaped}")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/run_example.m.in"
"${runner_file}"
@ONLY
)
unset(PATHS)
unset(WORK_DIR)
unset(CALL)
file(TO_CMAKE_PATH "${runner_file}" runner_path_cmake)
string(REPLACE "'" "''" runner_path_escaped "${runner_path_cmake}")
set(${runner_var} "${runner_file}" PARENT_SCOPE)
set(${workdir_var} "${work_dir}" PARENT_SCOPE)
set(${script_basename_var} "${script_basename}" PARENT_SCOPE)
set(${runner_escape_var} "${runner_path_escaped}" PARENT_SCOPE)
endfunction()
set(_mwrap_enable_octave_tests FALSE)
if(_mwrap_octave_index GREATER -1 AND DEFINED MWRAP_OCTAVE_EXECUTABLE AND MWRAP_OCTAVE_EXECUTABLE)
set(_mwrap_enable_octave_tests TRUE)
function(_mwrap_add_octave_smoke_test target_name)
_mwrap_prepare_smoke_test_runner(${target_name} runner_file work_dir script_basename runner_path_escaped ${ARGN})
set(test_name "octave-${script_basename}")
add_test(
NAME ${test_name}
COMMAND ${MWRAP_OCTAVE_EXECUTABLE} --no-gui --quiet --eval "run('${runner_path_escaped}')"
WORKING_DIRECTORY "${work_dir}"
)
endfunction()
endif()
set(_mwrap_enable_matlab_tests FALSE)
if(_mwrap_matlab_index GREATER -1 AND DEFINED Matlab_MAIN_PROGRAM AND Matlab_MAIN_PROGRAM)
set(_mwrap_enable_matlab_tests TRUE)
function(_mwrap_add_matlab_smoke_test target_name)
_mwrap_prepare_smoke_test_runner(${target_name} runner_file work_dir script_basename runner_path_escaped ${ARGN})
set(test_name "matlab-${script_basename}")
add_test(
NAME ${test_name}
COMMAND "${Matlab_MAIN_PROGRAM}" -batch "run('${runner_path_escaped}')"
WORKING_DIRECTORY "${work_dir}"
)
endfunction()
endif()
if(_mwrap_enable_octave_tests OR _mwrap_enable_matlab_tests)
set(fem_workspace "${CMAKE_CURRENT_BINARY_DIR}/fem_workspace")
file(MAKE_DIRECTORY "${fem_workspace}/mwfem")
macro(_mwrap_register_example_smoke_tests add_func)
cmake_language(CALL "${add_func}" eventq_plain
SCRIPT "${example_source_dir}/eventq/testq_plain.m"
EXTRA_PATHS "${example_source_dir}/eventq"
)
cmake_language(CALL "${add_func}" eventq_handle
SCRIPT "${example_source_dir}/eventq/testq_handle.m"
EXTRA_PATHS "${example_source_dir}/eventq"
)
cmake_language(CALL "${add_func}" eventq_class
SCRIPT "${example_source_dir}/eventq/testq_class.m"
EXTRA_PATHS "${example_source_dir}/eventq"
)
cmake_language(CALL "${add_func}" eventq2
SCRIPT "${example_source_dir}/eventq2/testq2.m"
EXTRA_PATHS "${example_source_dir}/eventq2"
)
cmake_language(CALL "${add_func}" zlib
SCRIPT "${example_source_dir}/zlib/testgz.m"
EXTRA_PATHS "${example_source_dir}/zlib"
)
cmake_language(CALL "${add_func}" fem_interface
SCRIPT "${example_source_dir}/fem/test_simple.m"
WORKSPACE "${fem_workspace}"
EXTRA_PATHS "${example_source_dir}/fem" "${fem_workspace}/mwfem"
)
cmake_language(CALL "${add_func}" fem_interface
SCRIPT "${example_source_dir}/fem/test_patch.m"
WORKSPACE "${fem_workspace}"
EXTRA_PATHS "${example_source_dir}/fem" "${fem_workspace}/mwfem"
)
cmake_language(CALL "${add_func}" fem_interface
SCRIPT "${example_source_dir}/fem/test_assembler.m"
WORKSPACE "${fem_workspace}"
EXTRA_PATHS "${example_source_dir}/fem" "${fem_workspace}/mwfem"
)
endmacro()
endif()
if(_mwrap_enable_octave_tests)
_mwrap_register_example_smoke_tests(_mwrap_add_octave_smoke_test)
endif()
if(_mwrap_enable_matlab_tests)
_mwrap_register_example_smoke_tests(_mwrap_add_matlab_smoke_test)
endif()
endif()
|