Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 93 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,38 @@ if(HAVE_FORCE_INLINE)
set(forceinline "__forceinline")
endif()

include(CheckCXXSourceCompiles)
check_cxx_source_compiles("#include <spawn.h>
#ifndef POSIX_SPAWN_CLOEXEC_DEFAULT
#error POSIX_SPAWN_CLOEXEC_DEFAULT is unavailable
#endif
int main() {
posix_spawn_file_actions_t actions;
return posix_spawn_file_actions_addinherit_np(&actions, 2);
}" HAVE_POSIX_SPAWN_CLOEXEC_DEFAULT_AND_ADDINHERIT_NP)
if(HAVE_POSIX_SPAWN_CLOEXEC_DEFAULT_AND_ADDINHERIT_NP)
set(GECODE_HAS_POSIX_SPAWN_CLOEXEC_DEFAULT 1)
set(GECODE_HAS_POSIX_SPAWN_ADDINHERIT_NP 1)
endif()

check_cxx_source_compiles("#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <spawn.h>
int main() {
posix_spawn_file_actions_t actions;
return posix_spawn_file_actions_addclosefrom_np(&actions, 3);
}" HAVE_POSIX_SPAWN_ADDCLOSEFROM_NP)
if(HAVE_POSIX_SPAWN_ADDCLOSEFROM_NP)
set(GECODE_HAS_POSIX_SPAWN_ADDCLOSEFROM_NP 1)
endif()

if((GECODE_HAS_POSIX_SPAWN_CLOEXEC_DEFAULT AND
GECODE_HAS_POSIX_SPAWN_ADDINHERIT_NP) OR
GECODE_HAS_POSIX_SPAWN_ADDCLOSEFROM_NP)
set(GECODE_HAS_POSIX_BLACKBOX_EXEC 1)
endif()

check_c_source_compiles("int main() { return __builtin_ffsll(0); }" HAVE_BUILTIN_FFSLL)
if(HAVE_BUILTIN_FFSLL)
set(GECODE_HAS_BUILTIN_FFSLL "/**/")
Expand Down Expand Up @@ -1285,6 +1317,13 @@ if(GECODE_ENABLE_FLATZINC)
endif()
endforeach()
endif()
if(CMAKE_DL_LIBS)
foreach(kind shared static)
if(TARGET gecodeflatzinc_${kind})
target_link_libraries(gecodeflatzinc_${kind} PUBLIC ${CMAKE_DL_LIBS})
endif()
endforeach()
endif()
endif()

# Compatibility aggregate target for downstream projects expecting Gecode::gecode.
Expand Down Expand Up @@ -1332,6 +1371,16 @@ if(BUILD_TESTING)
set(GECODE_CAN_BUILD_TESTS FALSE)
endif()

if(GECODE_ENABLE_FLATZINC)
add_executable(gecode-test-blackbox-exec
${GECODE_TEST_BLACKBOX_EXEC_SOURCE})
target_compile_features(gecode-test-blackbox-exec PRIVATE cxx_std_17)

add_library(gecode-test-blackbox-dll SHARED
${GECODE_TEST_BLACKBOX_DLL_SOURCE})
target_compile_features(gecode-test-blackbox-dll PRIVATE cxx_std_17)
endif()

set(GECODE_TEST_SOURCES_SELECTED ${GECODE_TEST_SOURCES})
if(NOT GECODE_ENABLE_SET_VARS)
list(FILTER GECODE_TEST_SOURCES_SELECTED EXCLUDE REGEX "^test/set(/|\\.cpp)")
Expand All @@ -1355,6 +1404,18 @@ if(BUILD_TESTING)
${GECODE_FAULT_TEST_SOURCES})
target_link_libraries(gecode-fault-test PRIVATE ${GECODE_TEST_LINK_LIBS})
endif()
if(GECODE_ENABLE_FLATZINC)
add_dependencies(gecode-test
gecode-test-blackbox-exec
gecode-test-blackbox-dll)
set(GECODE_TEST_BLACKBOX_LOG
"${CMAKE_CURRENT_BINARY_DIR}/gecode-test-blackbox")
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES
"${GECODE_TEST_BLACKBOX_LOG}.exec_parallel"
"${GECODE_TEST_BLACKBOX_LOG}.exec_descendant"
"${GECODE_TEST_BLACKBOX_LOG}.dll_model"
"${GECODE_TEST_BLACKBOX_LOG}.dll_parallel")
endif()

set(GECODE_CHECK_TESTS
Branch::Int::Dense::3
Expand All @@ -1370,7 +1431,9 @@ if(BUILD_TESTING)
NoGoods::Queens
Search::DFS::Sol::Binary::Nary::Binary::1::1::1)
if(GECODE_ENABLE_FLATZINC)
list(INSERT GECODE_CHECK_TESTS 1 FlatZinc::magic_square)
list(INSERT GECODE_CHECK_TESTS 1
FlatZinc::magic_square
FlatZinc::blackbox)
endif()
if(GECODE_ENABLE_SET_VARS)
list(APPEND GECODE_CHECK_TESTS
Expand Down Expand Up @@ -1427,6 +1490,14 @@ if(BUILD_TESTING)
add_test(NAME test COMMAND gecode-test ${GECODE_CHECK_ARGS})
set_tests_properties(test PROPERTIES
FIXTURES_REQUIRED gecode-test-built)
if(GECODE_ENABLE_FLATZINC)
set(GECODE_TEST_BLACKBOX_ENV
"GECODE_TEST_BLACKBOX_EXEC=$<TARGET_FILE:gecode-test-blackbox-exec>"
"GECODE_TEST_BLACKBOX_DLL=$<TARGET_FILE:gecode-test-blackbox-dll>"
"GECODE_TEST_BLACKBOX_LOG=${GECODE_TEST_BLACKBOX_LOG}")
set_tests_properties(test PROPERTIES
ENVIRONMENT "${GECODE_TEST_BLACKBOX_ENV}")
endif()
set(GECODE_CHECK_DEPENDS gecode-test)
if(GECODE_ENABLE_FLOAT_VARS)
add_custom_target(verify-gecode-check-tests
Expand All @@ -1438,10 +1509,24 @@ if(BUILD_TESTING)
VERBATIM)
list(APPEND GECODE_CHECK_DEPENDS verify-gecode-check-tests)
endif()
add_custom_target(check
COMMAND $<TARGET_FILE:gecode-test> ${GECODE_CHECK_ARGS}
DEPENDS ${GECODE_CHECK_DEPENDS}
USES_TERMINAL)
if(GECODE_ENABLE_FLATZINC)
list(APPEND GECODE_CHECK_DEPENDS
gecode-test-blackbox-exec
gecode-test-blackbox-dll)
add_custom_target(check
COMMAND ${CMAKE_COMMAND} -E env
GECODE_TEST_BLACKBOX_EXEC=$<TARGET_FILE:gecode-test-blackbox-exec>
GECODE_TEST_BLACKBOX_DLL=$<TARGET_FILE:gecode-test-blackbox-dll>
GECODE_TEST_BLACKBOX_LOG=${GECODE_TEST_BLACKBOX_LOG}
$<TARGET_FILE:gecode-test> ${GECODE_CHECK_ARGS}
DEPENDS ${GECODE_CHECK_DEPENDS}
USES_TERMINAL)
else()
add_custom_target(check
COMMAND $<TARGET_FILE:gecode-test> ${GECODE_CHECK_ARGS}
DEPENDS ${GECODE_CHECK_DEPENDS}
USES_TERMINAL)
endif()
if(GECODE_ENABLE_FAULT_INJECTION)
set(GECODE_FAULT_CHECK_ARGS -iter 1 -threads 1 -test "^Fault::")
add_test(NAME fault COMMAND gecode-fault-test ${GECODE_FAULT_CHECK_ARGS})
Expand Down Expand Up @@ -1544,6 +1629,9 @@ if(GECODE_INSTALL)
PATTERN "**.hpp"
PATTERN "LICENSE_1_0.txt"
PATTERN "mznlib" EXCLUDE
PATTERN "flatzinc/blackbox.hh" EXCLUDE
PATTERN "flatzinc/blackbox-backend.hh" EXCLUDE
PATTERN "flatzinc/blackbox-process.hh" EXCLUDE
PATTERN "exampleplugin" EXCLUDE
PATTERN "standalone-example" EXCLUDE
PATTERN "abi*" EXCLUDE)
Expand Down
81 changes: 73 additions & 8 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ export QT_CPPFLAGS = @QTDEFINES@ @QTINCLUDES@
export LINKQT = @QTLIBS@
export LINKCPPROFILER = @LINKCPPROFILER@
export LINKATOMIC = @LINKATOMIC@
export LINKDL = @GECODE_DL_LIBS@
export MPFR_CPPFLAGS = @GMP_CPPFLAGS@ @MPFR_CPPFLAGS@
ifeq "@enable_mpfr@" "yes"
export LINKMPFR = @MPFR_LIB_PATH@ @GMP_LIB_PATH@ @MPFR_LINK@ @GMP_LINK@
Expand Down Expand Up @@ -820,15 +821,20 @@ endif
# FLATZINC
#

FLATZINCSRC0 = flatzinc.cpp registry.cpp branch.cpp
FLATZINCSRC0 = flatzinc.cpp registry.cpp branch.cpp blackbox-backend.cpp \
blackbox-process-none.cpp blackbox-process-posix.cpp \
blackbox-process-windows.cpp blackbox-propagator.cpp
FLATZINC_GENSRC0 = parser.tab.cpp lexer.yy.cpp
FLATZINCHDR0 = ast.hh conexpr.hh option.hh parser.hh \
plugin.hh registry.hh symboltable.hh varspec.hh \
branch.hh branch.hpp lastval.hh complete.hh
FLATZINCPRIVATEHDR0 = blackbox.hh blackbox-backend.hh blackbox-process.hh

FLATZINCSRC = $(FLATZINCSRC0:%=gecode/flatzinc/%)
FLATZINC_GENSRC = $(FLATZINC_GENSRC0:%=gecode/flatzinc/%)
FLATZINCHDR = $(FLATZINCHDR0:%=gecode/flatzinc/%) gecode/flatzinc.hh
FLATZINCPRIVATEHDR = $(FLATZINCPRIVATEHDR0:%=gecode/flatzinc/%)
FLATZINCALLHDR = $(FLATZINCHDR) $(FLATZINCPRIVATEHDR)

FLATZINCOBJ = \
$(FLATZINCSRC:%.cpp=%$(OBJSUFFIX)) \
Expand Down Expand Up @@ -1168,6 +1174,7 @@ FLATZINCTESTSRC0 = \
test/flatzinc/battleships5.cpp \
test/flatzinc/battleships7.cpp \
test/flatzinc/battleships9.cpp \
test/flatzinc/blackbox.cpp \
test/flatzinc/blocksworld_instance_1.cpp \
test/flatzinc/blocksworld_instance_2.cpp \
test/flatzinc/cumulatives.cpp \
Expand Down Expand Up @@ -1249,14 +1256,18 @@ SEARCHTESTSRC0 = \
ARRAYTESTSRC0 = \
test/array.cpp

BLACKBOXEXECSRC = test/flatzinc/blackbox-exec.cpp
BLACKBOXDLLSRC = test/flatzinc/blackbox-dll.cpp
BLACKBOXSRC = $(BLACKBOXEXECSRC) $(BLACKBOXDLLSRC)

TESTSRC0 = test/test.cpp test/afc.cpp test/ldsb.cpp test/region.cpp \
test/groups.cpp
# FailPoint is CMake-only; keep the Autoconf test executable fault-free.

TESTSRC = \
$(TESTSRC0) $(INTTESTSRC0) $(SETTESTSRC0) $(FLOATTESTSRC0) \
$(BRANCHTESTSRC0) $(SEARCHTESTSRC0) \
$(ARRAYTESTSRC0) $(FLATZINCTESTSRC0)
$(ARRAYTESTSRC0) $(FLATZINCTESTSRC0) $(BLACKBOXSRC)

TESTHDR0 = \
test.hh test.hpp int.hh int.hpp set.hh set.hpp float.hh float.hpp \
Expand All @@ -1270,6 +1281,18 @@ TESTOBJ = $(INTTESTOBJ) $(SETTESTOBJ) $(FLOATTESTOBJ) \
$(TESTSRC0:%.cpp=%$(OBJSUFFIX))
TESTSBJ = $(TESTOBJ:%$(OBJSUFFIX)=%$(SBJSUFFIX))
TESTEXE = test/test$(EXESUFFIX)
BLACKBOXEXECOBJ = $(BLACKBOXEXECSRC:%.cpp=%$(OBJSUFFIX))
BLACKBOXDLLOBJ = $(BLACKBOXDLLSRC:%.cpp=%$(OBJSUFFIX))
BLACKBOXEXEC = test/flatzinc/blackbox-exec$(EXESUFFIX)
BLACKBOXDLL = test/flatzinc/blackbox-dll$(DLLSUFFIX)
BLACKBOXDLLLIB = $(BLACKBOXDLL:%$(DLLSUFFIX)=%$(LIBSUFFIX))
BLACKBOXLOG = $(abspath test/flatzinc/blackbox)
ifeq "@enable_flatzinc@" "yes"
BLACKBOXFIXTURES = $(BLACKBOXEXEC) $(BLACKBOXDLL)
else
BLACKBOXFIXTURES =
endif

TESTBUILDDIRS = \
test test/int test/set test/float \
test/branch test/assign \
Expand Down Expand Up @@ -1302,7 +1325,7 @@ compilelib: mkcompiledirs

compileexamples: $(EXAMPLEEXE)

test: mkcompiledirs
test: mkcompiledirs $(BLACKBOXFIXTURES)
@$(MAKE) $(VARIMP) $(TESTEXE)

CHECKTESTS = Branch::Int::Dense::3 \
Expand All @@ -1323,6 +1346,14 @@ CHECKTESTS = Branch::Int::Dense::3 \
Set::Sequence::SeqU1 \
Set::Wait

ifeq "@enable_flatzinc@" "yes"
CHECKTESTS += FlatZinc::blackbox
BLACKBOXCHECKENV = \
GECODE_TEST_BLACKBOX_EXEC=$(abspath $(BLACKBOXEXEC)) \
GECODE_TEST_BLACKBOX_DLL=$(abspath $(BLACKBOXDLL)) \
GECODE_TEST_BLACKBOX_LOG=$(BLACKBOXLOG)
endif

ifeq "@enable_float_vars@" "yes"
FLOATCHECKTESTS = Float::Arithmetic::PositiveNRootBounds \
Float::Arithmetic::PowConsistency \
Expand Down Expand Up @@ -1350,7 +1381,8 @@ check: test
exit 1; \
fi; \
done
$(RUNENVIRONMENT) $(TESTEXE) -iter 2 -threads 0 -fixprob 1 \
$(BLACKBOXCHECKENV) $(RUNENVIRONMENT) \
$(TESTEXE) -iter 2 -threads 0 -fixprob 1 \
$(CHECKTESTS:%=-test %)

.PHONY: regenerate
Expand Down Expand Up @@ -1395,6 +1427,8 @@ gecode/kernel/var-type.hpp: $(VISDEP)
gecode/kernel/var-imp.hpp: $(VISDEP)
$(UVRUN) $(top_srcdir)/misc/genvarimp.py -header $(VIS) > $@

$(ALLOBJ) $(ALLSBJ) $(TESTOBJ) $(TESTSBJ): $(VARIMP)

#
# Object targets
#
Expand Down Expand Up @@ -1566,7 +1600,7 @@ else
export LINKALL = \
$(LINKFLATZINC) $(LINKDRIVER) $(LINKGIST) \
$(LINKSEARCH) $(LINKMM) $(LINKSET) $(LINKFLOAT) $(LINKMPFR) $(LINKINT) \
$(LINKKERNEL) $(LINKSUPPORT) $(LINKATOMIC)
$(LINKKERNEL) $(LINKSUPPORT) $(LINKATOMIC) $(LINKDL)
endif

$(SUPPORTDLL): $(SUPPORTOBJ)
Expand Down Expand Up @@ -1627,7 +1661,7 @@ $(FLATZINCDLL): $(FLATZINCOBJ) $(SUPPORTDLL) $(KERNELDLL) $(SEARCHDLL) \
$(CXX) $(DLLFLAGS) $(FLATZINCOBJ) $(FLATZINCSONAME) \
@DLLPATH@ $(LINKSUPPORT) $(LINKKERNEL) $(LINKSEARCH) $(LINKINT) \
$(LINKSET) $(LINKFLOAT) $(LINKMM) $(LINKGIST) $(LINKDRIVER) $(LINKQT) \
@LINKOUTPUT@$(FLATZINCDLL)
$(LINKDL) @LINKOUTPUT@$(FLATZINCDLL)
$(CREATELINK) $@ $(@:%$(DLLSUFFIX)=%$(SOLINKSUFFIX))
$(CREATELINK) $@ $(@:%$(DLLSUFFIX)=%$(SOSUFFIX))
else
Expand Down Expand Up @@ -1729,13 +1763,13 @@ $(GISTDLL) $(GISTLIB): $(GISTOBJ) $(GISTRES) \
-outputresource:$(GISTDLL)\;2
ifeq "@enable_resource@" "yes"
$(FLATZINCRC):
$(RCGEN) $(FLATZINCDLL) $(FLATZINCHDR) $(FLATZINCSRC) > $@
$(RCGEN) $(FLATZINCDLL) $(FLATZINCALLHDR) $(FLATZINCSRC) > $@
endif
$(FLATZINCDLL) $(FLATZINCLIB): $(FLATZINCOBJ) $(FLATZINCRES) \
$(SUPPORTDLL) $(KERNELDLL) $(SEARCHDLL) $(INTDLL) \
$(SETDLL) $(FLOATDLL) $(GISTDLL) $(MMDLL) $(DRIVERDLL)
$(CXX) $(DLLFLAGS) $(FLATZINCOBJ) $(FLATZINCRES) \
@DLLPATH@ @LINKOUTPUT@$(FLATZINCDLL) $(GLDFLAGS) $(LINKQT)
@DLLPATH@ @LINKOUTPUT@$(FLATZINCDLL) $(GLDFLAGS) $(LINKQT) $(LINKDL)
$(FIXMANIFEST) $(FLATZINCDLL).manifest
$(MANIFEST) -manifest $(FLATZINCDLL).manifest \
-outputresource:$(FLATZINCDLL)\;2
Expand Down Expand Up @@ -1842,6 +1876,22 @@ $(TESTEXE): $(TESTOBJ) $(TESTRES) $(ALLLIB)
$(FIXMANIFEST) $@.manifest $(DLLSUFFIX)
$(MANIFEST) -manifest $@.manifest -outputresource:$@\;1

$(BLACKBOXEXECOBJ) $(BLACKBOXDLLOBJ): | mkcompiledirs

$(BLACKBOXEXEC): $(BLACKBOXEXECOBJ)
$(CXX) @EXEOUTPUT@$@ $(BLACKBOXEXECOBJ) $(CXXFLAGS)

ifeq "$(DLLSUFFIX)" "$(LIBSUFFIX)"
$(BLACKBOXDLL): $(BLACKBOXDLLOBJ)
$(CXX) $(DLLFLAGS) $(BLACKBOXDLLOBJ) @LINKOUTPUT@$@
else
$(BLACKBOXDLL) $(BLACKBOXDLLLIB): $(BLACKBOXDLLOBJ)
$(CXX) $(DLLFLAGS) $(BLACKBOXDLLOBJ) @LINKOUTPUT@$(BLACKBOXDLL) $(GLDFLAGS)
$(FIXMANIFEST) $(BLACKBOXDLL).manifest
$(MANIFEST) -manifest $(BLACKBOXDLL).manifest \
-outputresource:$(BLACKBOXDLL)\;2
endif

.PHONY: flatzinc
ifeq "@enable_flatzinc@" "yes"
flatzinc: $(FLATZINCEXE)
Expand Down Expand Up @@ -2091,6 +2141,13 @@ clean:
changelog.hh doxygen.hh license.hh header.html
$(RMF) $(ALLOBJ) $(ALLSBJ) $(ALLOBJ:%$(OBJSUFFIX)=%.pdb)
$(RMF) $(TESTOBJ) $(TESTSBJ) $(TESTOBJ:%$(OBJSUFFIX)=%.pdb)
$(RMF) $(BLACKBOXEXECOBJ) $(BLACKBOXDLLOBJ) \
$(BLACKBOXEXECOBJ:%$(OBJSUFFIX)=%.pdb) \
$(BLACKBOXDLLOBJ:%$(OBJSUFFIX)=%.pdb)
$(RMF) $(BLACKBOXEXECOBJ:%$(OBJSUFFIX)=%.gcno) \
$(BLACKBOXDLLOBJ:%$(OBJSUFFIX)=%.gcno)
$(RMF) $(BLACKBOXEXECOBJ:%$(OBJSUFFIX)=%.gcda) \
$(BLACKBOXDLLOBJ:%$(OBJSUFFIX)=%.gcda)
$(RMF) $(GISTMOCSRC)
$(RMF) $(LIBTARGETS:%$(DLLSUFFIX)=%$(MANIFESTSUFFIX)) \
$(LIBTARGETS:%$(DLLSUFFIX)=%$(RCSUFFIX)) \
Expand All @@ -2100,6 +2157,13 @@ clean:
$(EXAMPLEEXE:%=%.rc) $(EXAMPLEEXE:%=%.res)
$(RMF) $(TESTEXE:%.exe=%.pdb) $(TESTEXE:%=%.manifest) \
$(TESTEXE:%=%.rc) $(TESTEXE:%=%.res)
$(RMF) $(BLACKBOXEXEC:%.exe=%.pdb) $(BLACKBOXEXEC:%=%.manifest) \
$(BLACKBOXDLL:%$(DLLSUFFIX)=%$(LIBSUFFIX)) \
$(BLACKBOXDLL:%$(DLLSUFFIX)=%$(PDBSUFFIX)) \
$(BLACKBOXDLL:%$(DLLSUFFIX)=%$(EXPSUFFIX)) \
$(BLACKBOXDLL:%$(DLLSUFFIX)=%$(MANIFESTSUFFIX))
$(RMF) $(BLACKBOXLOG).exec_parallel $(BLACKBOXLOG).exec_descendant \
$(BLACKBOXLOG).dll_model $(BLACKBOXLOG).dll_parallel
$(RMF) $(FLATZINCEXE:%.exe=%.pdb) $(FLATZINCEXE:%=%.manifest) \
$(FLATZINCEXE:%=%.rc) $(FLATZINCEXE:%=%.res)

Expand All @@ -2111,6 +2175,7 @@ veryclean: clean
$(LIBTARGETS:%$(DLLSUFFIX)=%$(SOSUFFIX))
$(RMF) $(EXAMPLEEXE)
$(RMF) $(TESTEXE)
$(RMF) $(BLACKBOXFIXTURES)
$(RMF) $(FLATZINCEXE)
$(RMF) doc ChangeLog
$(RMF) $(ALLOBJ:%$(OBJSUFFIX)=%.gcno) $(TESTOBJ:%$(OBJSUFFIX)=%.gcno)
Expand Down
15 changes: 15 additions & 0 deletions changelog.in
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,21 @@ This release modernizes the Gecode build infrastructure, adds a
first-class CMake package for downstream consumers, refreshes the
autoconf build path, and updates CI coverage for current platforms.

[ENTRY]
Module: flatzinc
What: new
Rank: minor
Thanks: Jip J. Dekker
[DESCRIPTION]
Add support for the experimental MiniZinc black-box propagator interface,
contributed by Jip J. Dekker.
[MORE]
FlatZinc models can implement custom value and bounds propagation in a shared
library or persistent subprocess. The blackbox_dll and blackbox_exec annotations
select the backend and pass its arguments. Bounds callbacks return enclosing
intervals together with the dependencies that determine when the callback must
run again.

[ENTRY]
Module: minimodel
What: bug
Expand Down
Loading
Loading