@@ -61,6 +61,8 @@ option(GECODE_REGENERATE_VARIMP "Regenerate checked-in var-imp headers during bu
6161set (GECODE_FREELIST32_SIZE_MAX "" CACHE STRING "Max freelist size on 32-bit platforms" )
6262set (GECODE_FREELIST64_SIZE_MAX "" CACHE STRING "Max freelist size on 64-bit platforms" )
6363set (GECODE_WITH_VIS "" CACHE STRING "Additional .vis files (comma-separated)" )
64+ set (GECODE_LIB_PREFIX "" CACHE STRING "User-defined prefix for generated library basenames" )
65+ set (GECODE_LIB_SUFFIX "" CACHE STRING "User-defined suffix for generated library basenames" )
6466
6567# Compatibility aliases (temporary)
6668if (GECODE_USED_ENABLE_THREADS_ALIAS)
@@ -181,57 +183,30 @@ string(REGEX MATCHALL "[^\n]*\n" CONFIG
181183#undef PACKAGE_VERSION
182184" )
183185
184- # Pull package info from configure.ac to keep one version source of truth.
185- file (READ configure.ac LINES )
186- string (REPLACE ";" "<semi>" LINES "${LINES} " )
187- string (REGEX MATCHALL "[^\n ]*\n " LINES "${LINES} " )
188- set (ah_command FALSE )
189- foreach (line "${EXTRA_CONFIG} " ${LINES} )
190- string (REPLACE ";" "" line "${line} " )
191- if (ah_command)
192- # keep collecting
193- elseif (line MATCHES "AC_INIT\\ (([^,]*), *([^,]*), *([^)]*)\\ )" )
194- set (PACKAGE ${CMAKE_MATCH_1} )
195- set (VERSION ${CMAKE_MATCH_2} )
196- set (PACKAGE_BUGREPORT ${CMAKE_MATCH_3} )
197- message (STATUS "Got VERSION=${VERSION} from configure.ac" )
198- elseif (line MATCHES "ac_gecode_soversion=(.*)\n " )
199- set (GECODE_SOVERSION "${CMAKE_MATCH_1} " )
200- elseif (line MATCHES "ac_gecode_flatzincversion=(.*)\n " )
201- set (GECODE_FLATZINC_VERSION "${CMAKE_MATCH_1} " )
202- elseif (line MATCHES "AH_BOTTOM\\ (\\ [(.*)" )
203- set (ah_command bottom)
204- set (line "${CMAKE_MATCH_1} " )
205- elseif (line MATCHES "AH_VERBATIM[^,]+,(.*)" )
206- set (ah_command verbatim)
207- set (line "${CMAKE_MATCH_1} " )
208- endif ()
186+ set (GECODE_VERSION_METADATA_FILE "${CMAKE_CURRENT_SOURCE_DIR } /gecode-version.m4" )
187+ if (NOT EXISTS "${GECODE_VERSION_METADATA_FILE} " )
188+ message (FATAL_ERROR "Missing version metadata file: ${GECODE_VERSION_METADATA_FILE} " )
189+ endif ()
190+ set_property (DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
191+ "${GECODE_VERSION_METADATA_FILE} " )
192+ file (READ "${GECODE_VERSION_METADATA_FILE} " GECODE_VERSION_METADATA )
209193
210- if (ah_command)
211- set (saved_ah_command ${ah_command} )
212- if (line MATCHES "^\\ [(.*)" )
213- set (line "${CMAKE_MATCH_1} " )
214- endif ()
215- if (line MATCHES "\\ ]\\ )" )
216- set (ah_command FALSE )
217- string (REPLACE "])" "" line "${line} " )
218- endif ()
219- string (REGEX MATCHALL "[^\n ]*\n " sublines "${line} " )
220- set (config_add "" )
221- foreach (subline ${sublines} )
222- set (config_add ${config_add} "${subline} " )
223- endforeach ()
224- if (saved_ah_command STREQUAL "verbatim" )
225- set (CONFIG ${config_add} ${CONFIG} )
226- else ()
227- set (CONFIG ${CONFIG} "\n " ${config_add} )
228- endif ()
194+ function (gecode_extract_version_metadata macro_name output_var )
195+ string (REGEX MATCH "m4_define\\ (\\ [${macro_name} \\ ], *\\ [([^]]+)\\ ]\\ )" _match
196+ "${GECODE_VERSION_METADATA} " )
197+ if (NOT _match)
198+ message (FATAL_ERROR
199+ "Could not parse ${macro_name} from ${GECODE_VERSION_METADATA_FILE} " )
229200 endif ()
230- endforeach ()
201+ set (${output_var} "${CMAKE_MATCH_1} " PARENT_SCOPE )
202+ endfunction ()
231203
232- if (NOT DEFINED GECODE_SOVERSION)
233- set (GECODE_SOVERSION 51)
234- endif ()
204+ gecode_extract_version_metadata ("GECODE_M4_VERSION" VERSION )
205+ gecode_extract_version_metadata ("GECODE_M4_SOVERSION" GECODE_SOVERSION )
206+ gecode_extract_version_metadata ("GECODE_M4_FLATZINC_VERSION" GECODE_FLATZINC_VERSION )
207+
208+ set (PACKAGE "GECODE" )
209+ set (PACKAGE_BUGREPORT "users@gecode.org" )
235210
236211set (PACKAGE_NAME ${PACKAGE} )
237212string (TOLOWER ${PACKAGE} PACKAGE_TARNAME)
@@ -246,8 +221,8 @@ if(VERSION MATCHES "(.*)\\.(.*)\\.(.*)")
246221 "${CMAKE_MATCH_1} * 100000 + ${CMAKE_MATCH_2} * 100 + ${CMAKE_MATCH_3} " )
247222endif ()
248223
249- set (GECODE_DLL_USERPREFIX "" )
250- set (GECODE_DLL_USERSUFFIX "" )
224+ set (GECODE_DLL_USERPREFIX "${GECODE_LIB_PREFIX} " )
225+ set (GECODE_DLL_USERSUFFIX "${GECODE_LIB_SUFFIX} " )
251226if (GECODE_ENABLE_INT_VARS)
252227 set (GECODE_HAS_INT_VARS "/**/" )
253228endif ()
@@ -484,6 +459,7 @@ endif()
484459function(add_gecode_component_library lib)
485460 string (TOUPPER ${lib} libupper)
486461 set(sources ${GECODE_${libupper} _SOURCES})
462+ set(component_output_name "${GECODE_LIB_PREFIX} gecode${lib}${GECODE_LIB_SUFFIX} " )
487463 if(lib STREQUAL "float" AND NOT (GECODE_ENABLE_MPFR AND MPFR_FOUND))
488464 # Keep in sync with Make behavior: skip empty MPFR-only source when MPFR is absent.
489465 list(REMOVE_ITEM sources "gecode/float/rounding.cpp" )
@@ -506,7 +482,7 @@ function(add_gecode_component_library lib)
506482 target_compile_options(gecode${lib} _shared PRIVATE ${GECODE_VISIBILITY_COMPILE_OPTION} )
507483 endif()
508484 set_target_properties(gecode${lib} _shared PROPERTIES
509- OUTPUT_NAME gecode ${lib}
485+ OUTPUT_NAME " ${component_output_name} "
510486 VERSION ${GECODE_PROJECT_VERSION}
511487 SOVERSION ${GECODE_SOVERSION} )
512488 add_dependencies(gecode${lib} _shared gecode-varimp-gen)
@@ -528,7 +504,8 @@ function(add_gecode_component_library lib)
528504 if(GECODE_VISIBILITY_COMPILE_OPTION)
529505 target_compile_options(gecode${lib} _static PRIVATE ${GECODE_VISIBILITY_COMPILE_OPTION} )
530506 endif()
531- set_target_properties(gecode${lib} _static PROPERTIES OUTPUT_NAME gecode${lib} )
507+ set_target_properties(gecode${lib} _static PROPERTIES
508+ OUTPUT_NAME "${component_output_name} " )
532509 add_dependencies(gecode${lib} _static gecode-varimp-gen)
533510 list(APPEND GECODE_INSTALL_TARGETS gecode${lib} _static)
534511 list(APPEND GECODE_EXPORT_TARGETS gecode${lib} _static)
@@ -716,10 +693,18 @@ if(GECODE_CAN_BUILD_TESTS)
716693 endforeach()
717694
718695 add_test(NAME test COMMAND gecode-test ${GECODE_CHECK_ARGS} )
719- add_custom_target(check
720- COMMAND ${CMAKE_CTEST_COMMAND } --output-on -failure -R "^test$"
721- DEPENDS gecode-test
722- USES_TERMINAL)
696+ get_property(GECODE_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
697+ if(GECODE_IS_MULTI_CONFIG)
698+ add_custom_target(check
699+ COMMAND ${CMAKE_CTEST_COMMAND } --output-on -failure -R "^test$" -C $<CONFIG >
700+ DEPENDS gecode-test
701+ USES_TERMINAL)
702+ else()
703+ add_custom_target(check
704+ COMMAND ${CMAKE_CTEST_COMMAND } --output-on -failure -R "^test$"
705+ DEPENDS gecode-test
706+ USES_TERMINAL)
707+ endif()
723708else()
724709 message(WARNING "Skipping gecode-test/check targets because required modules are disabled" )
725710 add_custom_target(check
0 commit comments