1# ---------- Python support using SWIG ---------- 2.PHONY: help_python # Generate list of Python targets with descriptions. 3help_python: 4 @echo Use one of the following Python targets: 5ifeq ($(SYSTEM),win) 6 @$(GREP) "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.python.mk | $(SED) "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/" 7 @echo off & echo( 8else 9 @$(GREP) "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.python.mk | $(SED) "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/" | expand -t24 10 @echo 11endif 12 13OR_TOOLS_PYTHONPATH = $(OR_ROOT_FULL)$(CPSEP)$(OR_ROOT_FULL)$Sdependencies$Ssources$Sprotobuf-$(PROTOBUF_TAG)$Spython 14 15# Check for required build tools 16ifeq ($(SYSTEM),win) 17PYTHON_COMPILER ?= python.exe 18ifneq ($(WINDOWS_PATH_TO_PYTHON),) 19PYTHON_EXECUTABLE := $(WINDOWS_PATH_TO_PYTHON)\$(PYTHON_COMPILER) 20else 21PYTHON_EXECUTABLE := $(shell $(WHICH) $(PYTHON_COMPILER) 2>nul) 22endif 23TWINE_EXECUTABLE := $(shell $(WHICH) twine.exe 2>nul) 24SET_PYTHONPATH = set PYTHONPATH=$(OR_TOOLS_PYTHONPATH) && 25GEN_MYPY := $(shell $(WHICH) protoc-gen-mypy 2> NUL) 26else # UNIX 27PYTHON_COMPILER ?= python$(UNIX_PYTHON_VER) 28PYTHON_EXECUTABLE := $(shell which $(PYTHON_COMPILER)) 29TWINE_EXECUTABLE := $(shell command -v twine 2> /dev/null) 30SET_PYTHONPATH = PYTHONPATH=$(OR_TOOLS_PYTHONPATH) 31GEN_MYPY := $(shell command -v protoc-gen-mypy 2> /dev/null) 32endif 33 34ifneq ($(GEN_MYPY),) 35MYPY_OUT=--mypy_out=$(GEN_PATH) 36endif 37 38# Detect python3 39PYTHON3 := true 40SWIG_PYTHON3_FLAG := -py3 -DPY3 41PYTHON3_CFLAGS := -DPY3 42 43# All libraries and dependecies 44PYINIT_LIBS = $(LIB_DIR)/_pywrapinit.$(SWIG_PYTHON_LIB_SUFFIX) 45PYALGORITHMS_LIBS = $(LIB_DIR)/_pywrapknapsack_solver.$(SWIG_PYTHON_LIB_SUFFIX) 46PYGRAPH_LIBS = $(LIB_DIR)/_pywrapgraph.$(SWIG_PYTHON_LIB_SUFFIX) 47PYCP_LIBS = $(LIB_DIR)/_pywrapcp.$(SWIG_PYTHON_LIB_SUFFIX) 48PYLP_LIBS = $(LIB_DIR)/_pywraplp.$(SWIG_PYTHON_LIB_SUFFIX) 49PYSAT_LIBS = $(LIB_DIR)/_pywrapsat.$(SWIG_PYTHON_LIB_SUFFIX) 50PYPACKING_LIBS = $(GEN_DIR)/ortools/packing/vector_bin_packing_pb2.py 51PYSCHEDULING_LIBS = $(LIB_DIR)/_pywraprcpsp.$(SWIG_PYTHON_LIB_SUFFIX) 52PYSORTED_INTERVAL_LIST_LIBS = $(LIB_DIR)/_sorted_interval_list.$(SWIG_PYTHON_LIB_SUFFIX) 53PYTHON_OR_TOOLS_LIBS = \ 54 $(GEN_DIR)/ortools/__init__.py \ 55 $(PYINIT_LIBS) \ 56 $(PYALGORITHMS_LIBS) \ 57 $(PYGRAPH_LIBS) \ 58 $(PYCP_LIBS) \ 59 $(PYLP_LIBS) \ 60 $(PYSAT_LIBS) \ 61 $(PYPACKING_LIBS) \ 62 $(PYSCHEDULING_LIBS) \ 63 $(PYSORTED_INTERVAL_LIST_LIBS) 64 65# Main target 66.PHONY: python # Build Python OR-Tools. 67.PHONY: check_python # Quick check only running Python OR-Tools samples. 68.PHONY: test_python # Run all Python OR-Tools test targets. 69.PHONY: package_python # Create Python ortools wheel package. 70.PHONY: publish_python # Publish Python OR-Tools wheel package to Pypi.org. 71ifneq ($(PYTHON_EXECUTABLE),) 72python: $(PYTHON_OR_TOOLS_LIBS) 73check_python: check_python_pimpl 74test_python: test_python_pimpl 75publish_python: publish_python_pimpl 76BUILT_LANGUAGES +=, Python$(PYTHON_VERSION) 77else 78python: 79 @echo PYTHON_EXECUTABLE = "${PYTHON_EXECUTABLE}" 80 $(warning Cannot find '$(PYTHON_COMPILER)' command which is needed for build. Please make sure it is installed and in system path.) 81check_python: python 82test_python: python 83package_python: python 84publish_python: python 85endif 86 87PROTOBUF_PYTHON_DESC = dependencies/sources/protobuf-$(PROTOBUF_TAG)/python/google/protobuf/descriptor_pb2.py 88$(PROTOBUF_PYTHON_DESC): \ 89dependencies/sources/protobuf-$(PROTOBUF_TAG)/python/setup.py 90ifeq ($(SYSTEM),win) 91 copy dependencies$Sinstall$Sbin$Sprotoc.exe dependencies$Ssources$Sprotobuf-$(PROTOBUF_TAG)$Ssrc 92 cd dependencies$Ssources$Sprotobuf-$(PROTOBUF_TAG)$Spython && \ 93 "$(PYTHON_EXECUTABLE)" setup.py build 94endif 95ifeq ($(PLATFORM),LINUX) 96 cd dependencies$Ssources$Sprotobuf-$(PROTOBUF_TAG)$Spython && \ 97 LD_LIBRARY_PATH="$(UNIX_PROTOBUF_DIR)/lib64":"$(UNIX_PROTOBUF_DIR)/lib":$(LD_LIBRARY_PATH) \ 98 PROTOC=$(PROTOC_BINARY) \ 99 "$(PYTHON_EXECUTABLE)" setup.py build 100endif 101ifeq ($(PLATFORM),MACOSX) 102 cd dependencies$Ssources$Sprotobuf-$(PROTOBUF_TAG)$Spython && \ 103 DYLD_LIBRARY_PATH="$(UNIX_PROTOBUF_DIR)/lib":$(DYLD_LIBRARY_PATH) \ 104 PROTOC=$(PROTOC_BINARY) \ 105 "$(PYTHON_EXECUTABLE)" setup.py build 106endif 107 108$(GEN_DIR)/ortools/__init__.py: | $(GEN_DIR)/ortools 109 $(COPY) ortools$S__init__.py $(GEN_PATH)$Sortools$S__init__.py 110 111####################### 112## Python Wrappers ## 113####################### 114# init 115ifeq ($(PLATFORM),MACOSX) 116PYINIT_LDFLAGS = -install_name @rpath/_pywrapinit.$(SWIG_PYTHON_LIB_SUFFIX) # 117endif 118 119$(GEN_DIR)/ortools/init/pywrapinit.py: \ 120 $(SRC_DIR)/ortools/init/init.h \ 121 $(SRC_DIR)/ortools/base/base.i \ 122 $(SRC_DIR)/ortools/util/python/vector.i \ 123 $(SRC_DIR)/ortools/init/python/init.i \ 124 $(INIT_DEPS) \ 125 | $(GEN_DIR)/ortools/init 126 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_DOXYGEN) $(SWIG_PYTHON3_FLAG) \ 127 -o $(GEN_PATH)$Sortools$Sinit$Sinit_python_wrap.cc \ 128 -module pywrapinit \ 129 ortools$Sinit$Spython$Sinit.i 130 131$(GEN_DIR)/ortools/init/init_python_wrap.cc: \ 132 $(GEN_DIR)/ortools/init/pywrapinit.py 133 134$(OBJ_DIR)/swig/init_python_wrap.$O: \ 135 $(GEN_DIR)/ortools/init/init_python_wrap.cc \ 136 $(INIT_DEPS) \ 137 | $(OBJ_DIR)/swig 138 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 139 -c $(GEN_PATH)$Sortools$Sinit$Sinit_python_wrap.cc \ 140 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sinit_python_wrap.$O 141 142$(PYINIT_LIBS): $(OBJ_DIR)/swig/init_python_wrap.$O $(OR_TOOLS_LIBS) 143 $(DYNAMIC_LD) \ 144 $(PYINIT_LDFLAGS) \ 145 $(LD_OUT)$(LIB_DIR)$S_pywrapinit.$(SWIG_PYTHON_LIB_SUFFIX) \ 146 $(OBJ_DIR)$Sswig$Sinit_python_wrap.$O \ 147 $(OR_TOOLS_LNK) \ 148 $(SYS_LNK) \ 149 $(PYTHON_LNK) \ 150 $(PYTHON_LDFLAGS) 151ifeq ($(SYSTEM),win) 152 copy $(LIB_DIR)$S_pywrapinit.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\init\\_pywrapinit.pyd 153else 154 cp $(PYINIT_LIBS) $(GEN_PATH)/ortools/init 155endif 156 157# pywrapknapsack_solver 158ifeq ($(PLATFORM),MACOSX) 159PYALGORITHMS_LDFLAGS = -install_name @rpath/_pywrapknapsack_solver.$(SWIG_PYTHON_LIB_SUFFIX) # 160endif 161 162$(GEN_DIR)/ortools/algorithms/pywrapknapsack_solver.py: \ 163 $(SRC_DIR)/ortools/base/base.i \ 164 $(SRC_DIR)/ortools/util/python/vector.i \ 165 $(SRC_DIR)/ortools/algorithms/python/knapsack_solver.i \ 166 $(SRC_DIR)/ortools/algorithms/knapsack_solver.h \ 167 $(PROTOBUF_PYTHON_DESC) \ 168 | $(GEN_DIR)/ortools/algorithms 169 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_PYTHON3_FLAG) $(SWIG_DOXYGEN) \ 170 -o $(GEN_PATH)$Sortools$Salgorithms$Sknapsack_solver_python_wrap.cc \ 171 -module pywrapknapsack_solver \ 172 ortools$Salgorithms$Spython$Sknapsack_solver.i 173 174$(GEN_DIR)/ortools/algorithms/knapsack_solver_python_wrap.cc: \ 175 $(GEN_DIR)/ortools/algorithms/pywrapknapsack_solver.py 176 177$(OBJ_DIR)/swig/knapsack_solver_python_wrap.$O: \ 178 $(GEN_DIR)/ortools/algorithms/knapsack_solver_python_wrap.cc \ 179 $(ALGORITHMS_DEPS) \ 180 | $(OBJ_DIR)/swig 181 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 182 -c $(GEN_PATH)$Sortools$Salgorithms$Sknapsack_solver_python_wrap.cc \ 183 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sknapsack_solver_python_wrap.$O 184 185$(PYALGORITHMS_LIBS): $(OBJ_DIR)/swig/knapsack_solver_python_wrap.$O $(OR_TOOLS_LIBS) 186 $(DYNAMIC_LD) \ 187 $(PYALGORITHMS_LDFLAGS) \ 188 $(LD_OUT)$(LIB_DIR)$S_pywrapknapsack_solver.$(SWIG_PYTHON_LIB_SUFFIX) \ 189 $(OBJ_DIR)$Sswig$Sknapsack_solver_python_wrap.$O \ 190 $(OR_TOOLS_LNK) \ 191 $(SYS_LNK) \ 192 $(PYTHON_LNK) \ 193 $(PYTHON_LDFLAGS) 194ifeq ($(SYSTEM),win) 195 copy $(LIB_DIR)$S_pywrapknapsack_solver.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\algorithms\\_pywrapknapsack_solver.pyd 196else 197 cp $(PYALGORITHMS_LIBS) $(GEN_PATH)/ortools/algorithms 198endif 199 200# pywrapgraph 201ifeq ($(PLATFORM),MACOSX) 202PYGRAPH_LDFLAGS = -install_name @rpath/_pywrapgraph.$(SWIG_PYTHON_LIB_SUFFIX) # 203endif 204 205$(GEN_DIR)/ortools/graph/pywrapgraph.py: \ 206 $(SRC_DIR)/ortools/base/base.i \ 207 $(SRC_DIR)/ortools/util/python/vector.i \ 208 $(SRC_DIR)/ortools/graph/python/graph.i \ 209 $(SRC_DIR)/ortools/graph/min_cost_flow.h \ 210 $(SRC_DIR)/ortools/graph/max_flow.h \ 211 $(SRC_DIR)/ortools/graph/ebert_graph.h \ 212 $(SRC_DIR)/ortools/graph/shortestpaths.h \ 213 $(PROTOBUF_PYTHON_DESC) \ 214 | $(GEN_DIR)/ortools/graph 215 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_PYTHON3_FLAG) \ 216 -o $(GEN_PATH)$Sortools$Sgraph$Sgraph_python_wrap.cc \ 217 -module pywrapgraph \ 218 ortools$Sgraph$Spython$Sgraph.i 219 220$(GEN_DIR)/ortools/graph/graph_python_wrap.cc: \ 221 $(GEN_DIR)/ortools/graph/pywrapgraph.py 222 223$(OBJ_DIR)/swig/graph_python_wrap.$O: \ 224 $(GEN_DIR)/ortools/graph/graph_python_wrap.cc \ 225 $(GRAPH_DEPS) \ 226 | $(OBJ_DIR)/swig 227 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 228 -c $(GEN_PATH)/ortools/graph/graph_python_wrap.cc \ 229 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sgraph_python_wrap.$O 230 231$(PYGRAPH_LIBS): $(OBJ_DIR)/swig/graph_python_wrap.$O $(OR_TOOLS_LIBS) 232 $(DYNAMIC_LD) \ 233 $(PYGRAPH_LDFLAGS) \ 234 $(LD_OUT)$(LIB_DIR)$S_pywrapgraph.$(SWIG_PYTHON_LIB_SUFFIX) \ 235 $(OBJ_DIR)$Sswig$Sgraph_python_wrap.$O \ 236 $(OR_TOOLS_LNK) \ 237 $(SYS_LNK) \ 238 $(PYTHON_LNK) \ 239 $(PYTHON_LDFLAGS) 240ifeq ($(SYSTEM),win) 241 copy $(LIB_DIR)$S_pywrapgraph.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\graph\\_pywrapgraph.pyd 242else 243 cp $(PYGRAPH_LIBS) $(GEN_PATH)/ortools/graph 244endif 245 246# pywrapcp 247ifeq ($(PLATFORM),MACOSX) 248PYCP_LDFLAGS = -install_name @rpath/_pywrapcp.$(SWIG_PYTHON_LIB_SUFFIX) # 249endif 250 251$(GEN_DIR)/ortools/constraint_solver/search_limit_pb2.py: \ 252 $(SRC_DIR)/ortools/constraint_solver/search_limit.proto \ 253 $(PROTOBUF_PYTHON_DESC) \ 254 | $(GEN_DIR)/ortools/constraint_solver 255 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 256 $(SRC_DIR)$Sortools$Sconstraint_solver$Ssearch_limit.proto 257 258$(GEN_DIR)/ortools/constraint_solver/assignment_pb2.py: \ 259 $(SRC_DIR)/ortools/constraint_solver/assignment.proto \ 260 $(PROTOBUF_PYTHON_DESC) \ 261 | $(GEN_DIR)/ortools/constraint_solver 262 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 263 $(SRC_DIR)$Sortools$Sconstraint_solver$Sassignment.proto 264 265$(GEN_DIR)/ortools/constraint_solver/solver_parameters_pb2.py: \ 266 $(SRC_DIR)/ortools/constraint_solver/solver_parameters.proto \ 267 $(PROTOBUF_PYTHON_DESC) \ 268 | $(GEN_DIR)/ortools/constraint_solver 269 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 270 $(SRC_DIR)$Sortools$Sconstraint_solver$Ssolver_parameters.proto 271 272$(GEN_DIR)/ortools/constraint_solver/routing_enums_pb2.py: \ 273 $(SRC_DIR)/ortools/constraint_solver/routing_enums.proto \ 274 $(PROTOBUF_PYTHON_DESC) \ 275 | $(GEN_DIR)/ortools/constraint_solver 276 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 277 $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_enums.proto 278 279$(GEN_DIR)/ortools/constraint_solver/routing_parameters_pb2.py: \ 280 $(SRC_DIR)/ortools/constraint_solver/routing_parameters.proto \ 281 $(GEN_DIR)/ortools/constraint_solver/solver_parameters_pb2.py \ 282 $(GEN_DIR)/ortools/constraint_solver/routing_enums_pb2.py \ 283 $(PROTOBUF_PYTHON_DESC) \ 284 | $(GEN_DIR)/ortools/constraint_solver 285 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 286 $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_parameters.proto 287 288$(GEN_DIR)/ortools/constraint_solver/pywrapcp.py: \ 289 $(SRC_DIR)/ortools/base/base.i \ 290 $(SRC_DIR)/ortools/util/python/vector.i \ 291 $(SRC_DIR)/ortools/constraint_solver/python/constraint_solver.i \ 292 $(SRC_DIR)/ortools/constraint_solver/python/routing.i \ 293 $(SRC_DIR)/ortools/constraint_solver/constraint_solver.h \ 294 $(SRC_DIR)/ortools/constraint_solver/constraint_solveri.h \ 295 $(GEN_DIR)/ortools/constraint_solver/assignment_pb2.py \ 296 $(GEN_DIR)/ortools/constraint_solver/routing_enums_pb2.py \ 297 $(GEN_DIR)/ortools/constraint_solver/routing_parameters_pb2.py \ 298 $(GEN_DIR)/ortools/constraint_solver/search_limit_pb2.py \ 299 $(GEN_DIR)/ortools/constraint_solver/solver_parameters_pb2.py \ 300 $(GEN_DIR)/ortools/constraint_solver/assignment.pb.h \ 301 $(GEN_DIR)/ortools/constraint_solver/search_limit.pb.h \ 302 $(CP_LIB_OBJS) \ 303 $(PROTOBUF_PYTHON_DESC) \ 304 | $(GEN_DIR)/ortools/constraint_solver 305 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python -nofastunpack $(SWIG_PYTHON3_FLAG) $(SWIG_DOXYGEN) \ 306 -o $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_python_wrap.cc \ 307 -module pywrapcp \ 308 $(SRC_DIR)/ortools/constraint_solver$Spython$Srouting.i 309 310$(GEN_DIR)/ortools/constraint_solver/constraint_solver_python_wrap.cc: \ 311 $(GEN_DIR)/ortools/constraint_solver/pywrapcp.py 312 313$(OBJ_DIR)/swig/constraint_solver_python_wrap.$O: \ 314 $(GEN_DIR)/ortools/constraint_solver/constraint_solver_python_wrap.cc \ 315 $(CP_DEPS) \ 316 | $(OBJ_DIR)/swig 317 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 318 -c $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_python_wrap.cc \ 319 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sconstraint_solver_python_wrap.$O 320 321$(PYCP_LIBS): $(OBJ_DIR)/swig/constraint_solver_python_wrap.$O $(OR_TOOLS_LIBS) 322 $(DYNAMIC_LD) \ 323 $(PYCP_LDFLAGS) \ 324 $(LD_OUT)$(LIB_DIR)$S_pywrapcp.$(SWIG_PYTHON_LIB_SUFFIX) \ 325 $(OBJ_DIR)$Sswig$Sconstraint_solver_python_wrap.$O \ 326 $(OR_TOOLS_LNK) \ 327 $(SYS_LNK) \ 328 $(PYTHON_LNK) \ 329 $(PYTHON_LDFLAGS) 330ifeq ($(SYSTEM),win) 331 copy $(LIB_DIR)$S_pywrapcp.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\constraint_solver\\_pywrapcp.pyd 332else 333 cp $(PYCP_LIBS) $(GEN_PATH)/ortools/constraint_solver 334endif 335 336# pywraplp 337ifeq ($(PLATFORM),MACOSX) 338PYLP_LDFLAGS = -install_name @rpath/_pywraplp.$(SWIG_PYTHON_LIB_SUFFIX) # 339endif 340 341$(GEN_DIR)/ortools/util/optional_boolean_pb2.py: \ 342 $(SRC_DIR)/ortools/util/optional_boolean.proto \ 343 $(PROTOBUF_PYTHON_DESC) \ 344 | $(GEN_DIR)/ortools/util 345 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 346 $(SRC_DIR)/ortools/util/optional_boolean.proto 347 348$(GEN_DIR)/ortools/linear_solver/linear_solver_pb2.py: \ 349 $(SRC_DIR)/ortools/linear_solver/linear_solver.proto \ 350 $(GEN_DIR)/ortools/util/optional_boolean_pb2.py \ 351 $(PROTOBUF_PYTHON_DESC) \ 352 | $(GEN_DIR)/ortools/linear_solver 353 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 354 $(SRC_DIR)/ortools/linear_solver/linear_solver.proto 355 356$(GEN_DIR)/ortools/linear_solver/pywraplp.py: \ 357 $(SRC_DIR)/ortools/base/base.i \ 358 $(SRC_DIR)/ortools/util/python/vector.i \ 359 $(SRC_DIR)/ortools/linear_solver/python/linear_solver.i \ 360 $(SRC_DIR)/ortools/linear_solver/linear_solver.h \ 361 $(GEN_DIR)/ortools/linear_solver/linear_solver.pb.h \ 362 $(GEN_DIR)/ortools/linear_solver/linear_solver_pb2.py \ 363 $(PROTOBUF_PYTHON_DESC) \ 364 | $(GEN_DIR)/ortools/linear_solver 365 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_PYTHON3_FLAG) $(SWIG_DOXYGEN) \ 366 -o $(GEN_PATH)$Sortools$Slinear_solver$Slinear_solver_python_wrap.cc \ 367 -module pywraplp \ 368 $(SRC_DIR)/ortools/linear_solver$Spython$Slinear_solver.i 369 370$(GEN_DIR)/ortools/linear_solver/linear_solver_python_wrap.cc: \ 371 $(GEN_DIR)/ortools/linear_solver/pywraplp.py 372 373$(OBJ_DIR)/swig/linear_solver_python_wrap.$O: \ 374 $(GEN_DIR)/ortools/linear_solver/linear_solver_python_wrap.cc \ 375 $(LP_DEPS) \ 376 | $(OBJ_DIR)/swig 377 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 378 -c $(GEN_PATH)$Sortools$Slinear_solver$Slinear_solver_python_wrap.cc \ 379 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Slinear_solver_python_wrap.$O 380 381$(PYLP_LIBS): $(OBJ_DIR)/swig/linear_solver_python_wrap.$O $(OR_TOOLS_LIBS) 382 $(DYNAMIC_LD) \ 383 $(PYLP_LDFLAGS) \ 384 $(LD_OUT)$(LIB_DIR)$S_pywraplp.$(SWIG_PYTHON_LIB_SUFFIX) \ 385 $(OBJ_DIR)$Sswig$Slinear_solver_python_wrap.$O \ 386 $(OR_TOOLS_LNK) \ 387 $(SYS_LNK) \ 388 $(PYTHON_LNK) \ 389 $(PYTHON_LDFLAGS) 390ifeq ($(SYSTEM),win) 391 copy $(LIB_DIR)$S_pywraplp.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\linear_solver\\_pywraplp.pyd 392else 393 cp $(PYLP_LIBS) $(GEN_PATH)/ortools/linear_solver 394endif 395 396# pywrapsat 397ifeq ($(PLATFORM),MACOSX) 398PYSAT_LDFLAGS = -install_name @rpath/_pywrapsat.$(SWIG_PYTHON_LIB_SUFFIX) # 399endif 400 401$(GEN_DIR)/ortools/sat/cp_model_pb2.py: \ 402 $(SRC_DIR)/ortools/sat/cp_model.proto \ 403 $(PROTOBUF_PYTHON_DESC) \ 404 | $(GEN_DIR)/ortools/sat 405 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 406 $(SRC_DIR)/ortools/sat/cp_model.proto 407 408$(GEN_DIR)/ortools/sat/sat_parameters_pb2.py: \ 409 $(SRC_DIR)/ortools/sat/sat_parameters.proto \ 410 $(PROTOBUF_PYTHON_DESC) \ 411 | $(GEN_DIR)/ortools/sat 412 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 413 $(SRC_DIR)/ortools/sat/sat_parameters.proto 414 415$(GEN_DIR)/ortools/sat/pywrapsat.py: \ 416 $(SRC_DIR)/ortools/base/base.i \ 417 $(SRC_DIR)/ortools/util/python/vector.i \ 418 $(SRC_DIR)/ortools/sat/python/sat.i \ 419 $(GEN_DIR)/ortools/sat/cp_model_pb2.py \ 420 $(GEN_DIR)/ortools/sat/sat_parameters_pb2.py \ 421 $(SAT_DEPS) \ 422 $(PROTOBUF_PYTHON_DESC) \ 423 | $(GEN_DIR)/ortools/sat 424 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_PYTHON3_FLAG) \ 425 -o $(GEN_PATH)$Sortools$Ssat$Ssat_python_wrap.cc \ 426 -module pywrapsat \ 427 $(SRC_DIR)/ortools/sat$Spython$Ssat.i 428 429$(GEN_DIR)/ortools/sat/sat_python_wrap.cc: \ 430 $(GEN_DIR)/ortools/sat/pywrapsat.py 431 432$(OBJ_DIR)/swig/sat_python_wrap.$O: \ 433 $(GEN_DIR)/ortools/sat/sat_python_wrap.cc \ 434 $(SAT_DEPS) \ 435 | $(OBJ_DIR)/swig 436 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 437 -c $(GEN_PATH)$Sortools$Ssat$Ssat_python_wrap.cc \ 438 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssat_python_wrap.$O 439 440$(PYSAT_LIBS): $(OBJ_DIR)/swig/sat_python_wrap.$O $(OR_TOOLS_LIBS) 441 $(DYNAMIC_LD) \ 442 $(PYSAT_LDFLAGS) \ 443 $(LD_OUT)$(LIB_DIR)$S_pywrapsat.$(SWIG_PYTHON_LIB_SUFFIX) \ 444 $(OBJ_DIR)$Sswig$Ssat_python_wrap.$O \ 445 $(OR_TOOLS_LNK) \ 446 $(SYS_LNK) \ 447 $(PYTHON_LNK) \ 448 $(PYTHON_LDFLAGS) 449ifeq ($(SYSTEM),win) 450 copy $(LIB_DIR)$S_pywrapsat.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\sat\\_pywrapsat.pyd 451else 452 cp $(PYSAT_LIBS) $(GEN_PATH)/ortools/sat 453endif 454 455# packing 456$(GEN_DIR)/ortools/packing/vector_bin_packing_pb2.py: \ 457 $(SRC_DIR)/ortools/packing/vector_bin_packing.proto \ 458 $(PROTOBUF_PYTHON_DESC) \ 459 | $(GEN_DIR)/ortools/packing 460 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 461 $(SRC_DIR)/ortools/packing/vector_bin_packing.proto 462 463# pywraprcpsp 464ifeq ($(PLATFORM),MACOSX) 465PYRCPSP_LDFLAGS = -install_name @rpath/_pywraprcpsp.$(SWIG_PYTHON_LIB_SUFFIX) # 466endif 467 468$(GEN_DIR)/ortools/scheduling/rcpsp_pb2.py: \ 469 $(SRC_DIR)/ortools/scheduling/rcpsp.proto \ 470 $(PROTOBUF_PYTHON_DESC) \ 471 | $(GEN_DIR)/ortools/scheduling 472 $(PROTOC) --proto_path=$(INC_DIR) --python_out=$(GEN_PATH) $(MYPY_OUT) \ 473 $(SRC_DIR)/ortools/scheduling/rcpsp.proto 474 475$(GEN_DIR)/ortools/scheduling/pywraprcpsp.py: \ 476 $(SRC_DIR)/ortools/scheduling/rcpsp_parser.h \ 477 $(SRC_DIR)/ortools/base/base.i \ 478 $(SRC_DIR)/ortools/scheduling/python/rcpsp.i \ 479 $(GEN_DIR)/ortools/scheduling/rcpsp_pb2.py \ 480 $(DATA_DEPS) \ 481 $(PROTOBUF_PYTHON_DESC) \ 482 | $(GEN_DIR)/ortools/scheduling 483 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_PYTHON3_FLAG) \ 484 -o $(GEN_PATH)$Sortools$Sscheduling$Srcpsp_python_wrap.cc \ 485 -module pywraprcpsp \ 486 $(SRC_DIR)/ortools/scheduling$Spython$Srcpsp.i 487 488$(GEN_DIR)/ortools/scheduling/rcpsp_python_wrap.cc: \ 489 $(GEN_DIR)/ortools/scheduling/pywraprcpsp.py 490 491$(OBJ_DIR)/swig/rcpsp_python_wrap.$O: \ 492 $(GEN_DIR)/ortools/scheduling/rcpsp_python_wrap.cc \ 493 $(DATA_DEPS) \ 494 | $(OBJ_DIR)/swig 495 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 496 -c $(GEN_PATH)$Sortools$Sscheduling$Srcpsp_python_wrap.cc \ 497 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Srcpsp_python_wrap.$O 498 499$(PYSCHEDULING_LIBS): $(OBJ_DIR)/swig/rcpsp_python_wrap.$O $(OR_TOOLS_LIBS) 500 $(DYNAMIC_LD) \ 501 $(PYRCPSP_LDFLAGS) \ 502 $(LD_OUT)$(LIB_DIR)$S_pywraprcpsp.$(SWIG_PYTHON_LIB_SUFFIX) \ 503 $(OBJ_DIR)$Sswig$Srcpsp_python_wrap.$O \ 504 $(OR_TOOLS_LNK) \ 505 $(SYS_LNK) \ 506 $(PYTHON_LNK) \ 507 $(PYTHON_LDFLAGS) 508ifeq ($(SYSTEM),win) 509 copy $(LIB_DIR)$S_pywraprcpsp.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\scheduling\\_pywraprcpsp.pyd 510else 511 cp $(PYSCHEDULING_LIBS) $(GEN_PATH)/ortools/scheduling 512endif 513 514# sorted_interval_list 515ifeq ($(PLATFORM),MACOSX) 516PYSORTED_INTERVAL_LIST_LDFLAGS = -install_name @rpath/_sorted_interval_list.$(SWIG_PYTHON_LIB_SUFFIX) # 517endif 518 519$(GEN_DIR)/ortools/util/sorted_interval_list.py: \ 520 $(SRC_DIR)/ortools/util/sorted_interval_list.h \ 521 $(SRC_DIR)/ortools/base/base.i \ 522 $(SRC_DIR)/ortools/util/python/vector.i \ 523 $(SRC_DIR)/ortools/util/python/sorted_interval_list.i \ 524 $(UTIL_DEPS) \ 525 | $(GEN_DIR)/ortools/util 526 $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_DOXYGEN) $(SWIG_PYTHON3_FLAG) \ 527 -o $(GEN_PATH)$Sortools$Sutil$Ssorted_interval_list_python_wrap.cc \ 528 -module sorted_interval_list \ 529 $(SRC_DIR)$Sortools$Sutil$Spython$Ssorted_interval_list.i 530 531$(GEN_DIR)/ortools/util/sorted_interval_list_python_wrap.cc: \ 532 $(GEN_DIR)/ortools/util/sorted_interval_list.py 533 534$(OBJ_DIR)/swig/sorted_interval_list_python_wrap.$O: \ 535 $(GEN_DIR)/ortools/util/sorted_interval_list_python_wrap.cc \ 536 $(UTIL_DEPS) \ 537 | $(OBJ_DIR)/swig 538 $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ 539 -c $(GEN_PATH)$Sortools$Sutil$Ssorted_interval_list_python_wrap.cc \ 540 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssorted_interval_list_python_wrap.$O 541 542$(PYSORTED_INTERVAL_LIST_LIBS): $(OBJ_DIR)/swig/sorted_interval_list_python_wrap.$O $(OR_TOOLS_LIBS) 543 $(DYNAMIC_LD) \ 544 $(PYSORTED_INTERVAL_LIST_LDFLAGS) \ 545 $(LD_OUT)$(LIB_DIR)$S_sorted_interval_list.$(SWIG_PYTHON_LIB_SUFFIX) \ 546 $(OBJ_DIR)$Sswig$Ssorted_interval_list_python_wrap.$O \ 547 $(OR_TOOLS_LNK) \ 548 $(SYS_LNK) \ 549 $(PYTHON_LNK) \ 550 $(PYTHON_LDFLAGS) 551ifeq ($(SYSTEM),win) 552 copy $(LIB_DIR)$S_sorted_interval_list.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\util\\_sorted_interval_list.pyd 553else 554 cp $(PYSORTED_INTERVAL_LIST_LIBS) $(GEN_PATH)/ortools/util 555endif 556 557####################### 558## Python SOURCE ## 559####################### 560ifeq ($(SOURCE_SUFFIX),.py) # Those rules will be used if SOURCE contains a .py file 561.PHONY: build # Build a Python program. 562build: $(SOURCE) $(PYTHON_OR_TOOLS_LIBS) ; 563 564EXTRA_PYTHON_PATH=:$(shell dirname "$(SOURCE)") 565 566.PHONY: run # Run a Python program. 567run: build 568 $(SET_PYTHONPATH)$(EXTRA_PYTHON_PATH) "$(PYTHON_EXECUTABLE)" $(SOURCE_PATH) $(ARGS) 569endif 570 571############################### 572## Python Examples/Samples ## 573############################### 574rpy_%: $(TEST_DIR)/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 575 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" $(TEST_PATH)$S$*.py $(ARGS) 576 577rpy_%: $(PYTHON_EX_DIR)/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 578 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" $(PYTHON_EX_PATH)$S$*.py $(ARGS) 579 580rpy_%: $(CONTRIB_EX_DIR)/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 581 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" $(CONTRIB_EX_PATH)$S$*.py $(ARGS) 582 583rpy_%: ortools/algorithms/samples/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 584 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" ortools$Salgorithms$Ssamples$S$*.py $(ARGS) 585 586rpy_%: ortools/constraint_solver/samples/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 587 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" ortools$Sconstraint_solver$Ssamples$S$*.py $(ARGS) 588 589rpy_%: ortools/graph/samples/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 590 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" ortools$Sgraph$Ssamples$S$*.py $(ARGS) 591 592rpy_%: ortools/linear_solver/samples/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 593 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" ortools$Slinear_solver$Ssamples$S$*.py $(ARGS) 594 595rpy_%: ortools/sat/samples/%.py $(PYTHON_OR_TOOLS_LIBS) FORCE 596 $(SET_PYTHONPATH) "$(PYTHON_EXECUTABLE)" ortools$Ssat$Ssamples$S$*.py $(ARGS) 597 598.PHONY: test_python_algorithms_samples # Run all Python Algorithms Samples (located in ortools/algorithms/samples) 599test_python_algorithms_samples: \ 600 rpy_knapsack \ 601 rpy_simple_knapsack_program 602 603.PHONY: test_python_constraint_solver_samples # Run all Python CP Samples (located in ortools/constraint_solver/samples) 604test_python_constraint_solver_samples: \ 605 rpy_nqueens_cp \ 606 rpy_simple_cp_program \ 607 rpy_simple_routing_program \ 608 rpy_tsp \ 609 rpy_tsp_cities \ 610 rpy_tsp_circuit_board \ 611 rpy_tsp_distance_matrix \ 612 rpy_vrp \ 613 rpy_vrp_breaks \ 614 rpy_vrp_breaks_from_start \ 615 rpy_vrp_capacity \ 616 rpy_vrp_drop_nodes \ 617 rpy_vrp_global_span \ 618 rpy_vrp_initial_routes \ 619 rpy_vrp_nodes_indices \ 620 rpy_vrp_pickup_delivery \ 621 rpy_vrp_pickup_delivery_fifo \ 622 rpy_vrp_pickup_delivery_lifo \ 623 rpy_vrp_resources \ 624 rpy_vrp_starts_ends \ 625 rpy_vrp_time_windows \ 626 rpy_vrp_tokens \ 627 rpy_vrp_with_time_limit \ 628 \ 629 rpy_vrpgs \ 630 rpy_cvrp \ 631 rpy_cvrp_reload \ 632 rpy_cvrptw \ 633 rpy_cvrptw_break 634 635.PHONY: test_python_graph_samples # Run all Python Graph Samples (located in ortools/graph/samples) 636test_python_graph_samples: \ 637 rpy_simple_max_flow_program \ 638 rpy_simple_min_cost_flow_program 639 640.PHONY: test_python_linear_solver_samples # Run all Python LP Samples (located in ortools/linear_solver/samples) 641test_python_linear_solver_samples: \ 642 rpy_assignment_mip \ 643 rpy_basic_example \ 644 rpy_bin_packing_mip \ 645 rpy_integer_programming_example \ 646 rpy_linear_programming_example \ 647 rpy_mip_var_array \ 648 rpy_multiple_knapsack_mip \ 649 rpy_simple_lp_program \ 650 rpy_simple_mip_program \ 651 rpy_stigler_diet 652 653.PHONY: test_python_sat_samples # Run all Python Sat Samples (located in ortools/sat/samples) 654test_python_sat_samples: \ 655 rpy_assignment_sat \ 656 rpy_assumptions_sample_sat \ 657 rpy_binpacking_problem_sat \ 658 rpy_bool_or_sample_sat \ 659 rpy_channeling_sample_sat \ 660 rpy_cp_is_fun_sat \ 661 rpy_earliness_tardiness_cost_sample_sat \ 662 rpy_interval_sample_sat \ 663 rpy_literal_sample_sat \ 664 rpy_minimal_jobshop_sat \ 665 rpy_no_overlap_sample_sat \ 666 rpy_nqueens_sat \ 667 rpy_nurses_sat \ 668 rpy_optional_interval_sample_sat \ 669 rpy_rabbits_and_pheasants_sat \ 670 rpy_ranking_sample_sat \ 671 rpy_reified_sample_sat \ 672 rpy_simple_sat_program \ 673 rpy_search_for_all_solutions_sample_sat \ 674 rpy_solve_and_print_intermediate_solutions_sample_sat \ 675 rpy_solve_with_time_limit_sample_sat \ 676 rpy_step_function_sample_sat \ 677 rpy_stop_after_n_solutions_sample_sat 678 679.PHONY: check_python_pimpl 680check_python_pimpl: \ 681 test_python_algorithms_samples \ 682 test_python_constraint_solver_samples \ 683 test_python_graph_samples \ 684 test_python_linear_solver_samples \ 685 test_python_sat_samples \ 686# rpy_rabbits_pheasants_cp \ 687# rpy_cryptarithmetic_cp \ 688# rpy_cryptarithmetic_sat \ 689# rpy_nqueens_cp \ 690# rpy_nqueens_sat \ 691# rpy_integer_programming \ 692# rpy_max_flow \ 693# rpy_min_cost_flow \ 694# rpy_assignment \ 695# rpy_nurses_cp \ 696# rpy_job_shop_cp \ 697 698.PHONY: test_python_tests # Run all Python Tests (located in examples/tests) 699test_python_tests: \ 700 rpy_lp_test \ 701 rpy_cp_model_test \ 702 rpy_sorted_interval_list_test \ 703 rpy_test_cp_api \ 704 rpy_test_routing_api \ 705 rpy_test_lp_api \ 706 rpy_pywrapcp_test \ 707 rpy_pywraplp_test \ 708 rpy_pywraprouting_test 709 710.PHONY: test_python_contrib # Run all Python Contrib (located in examples/python and examples/contrib) 711test_python_contrib: \ 712 rpy_3_jugs_mip \ 713 rpy_3_jugs_regular \ 714 rpy_alldifferent_except_0 \ 715 rpy_all_interval \ 716 rpy_alphametic \ 717 rpy_a_round_of_golf \ 718 rpy_assignment6_mip \ 719 rpy_assignment \ 720 rpy_bacp \ 721 rpy_blending \ 722 rpy_broken_weights \ 723 rpy_bus_schedule \ 724 rpy_car \ 725 rpy_check_dependencies \ 726 rpy_circuit \ 727 rpy_coins3 \ 728 rpy_coins_grid_mip \ 729 rpy_coloring_ip \ 730 rpy_combinatorial_auction2 \ 731 rpy_contiguity_regular \ 732 rpy_costas_array \ 733 rpy_covering_opl \ 734 rpy_crew \ 735 rpy_crossword2 \ 736 rpy_crypta \ 737 rpy_crypto \ 738 rpy_curious_set_of_integers \ 739 rpy_debruijn_binary \ 740 rpy_diet1_b \ 741 rpy_diet1_mip \ 742 rpy_diet1 \ 743 rpy_discrete_tomography \ 744 rpy_divisible_by_9_through_1 \ 745 rpy_dudeney \ 746 rpy_einav_puzzle2 \ 747 rpy_einav_puzzle \ 748 rpy_eq10 \ 749 rpy_eq20 \ 750 rpy_fill_a_pix \ 751 rpy_furniture_moving \ 752 rpy_futoshiki \ 753 rpy_game_theory_taha \ 754 rpy_grocery \ 755 rpy_just_forgotten \ 756 rpy_kakuro \ 757 rpy_kenken2 \ 758 rpy_killer_sudoku \ 759 rpy_knapsack_cp \ 760 rpy_knapsack_mip \ 761 rpy_labeled_dice \ 762 rpy_langford \ 763 rpy_least_diff \ 764 rpy_least_square \ 765 rpy_lectures \ 766 rpy_magic_sequence_sat \ 767 rpy_magic_square_and_cards \ 768 rpy_magic_square_mip \ 769 rpy_magic_square \ 770 rpy_map \ 771 rpy_marathon2 \ 772 rpy_max_flow_taha \ 773 rpy_max_flow_winston1 \ 774 rpy_minesweeper \ 775 rpy_mr_smith \ 776 rpy_nonogram_default_search \ 777 rpy_nonogram_regular \ 778 rpy_nonogram_table2 \ 779 rpy_nonogram_table \ 780 rpy_nqueens2 \ 781 rpy_nqueens3 \ 782 rpy_nqueens \ 783 rpy_nurse_rostering \ 784 rpy_nurses_cp \ 785 rpy_olympic \ 786 rpy_organize_day \ 787 rpy_pandigital_numbers \ 788 rpy_photo_problem \ 789 rpy_place_number_puzzle \ 790 rpy_p_median \ 791 rpy_post_office_problem2 \ 792 rpy_production \ 793 rpy_pyls_api \ 794 rpy_quasigroup_completion \ 795 rpy_regular \ 796 rpy_regular_table2 \ 797 rpy_regular_table \ 798 rpy_rogo2 \ 799 rpy_rostering_with_travel \ 800 rpy_safe_cracking \ 801 rpy_scheduling_speakers \ 802 rpy_secret_santa2 \ 803 rpy_send_more_money_any_base \ 804 rpy_send_most_money \ 805 rpy_seseman_b \ 806 rpy_seseman \ 807 rpy_set_covering2 \ 808 rpy_set_covering3 \ 809 rpy_set_covering4 \ 810 rpy_set_covering_deployment \ 811 rpy_set_covering \ 812 rpy_set_covering_skiena \ 813 rpy_set_partition \ 814 rpy_sicherman_dice \ 815 rpy_ski_assignment \ 816 rpy_slitherlink \ 817 rpy_stable_marriage \ 818 rpy_steel_lns \ 819 rpy_steel \ 820 rpy_stigler_contrib \ 821 rpy_strimko2 \ 822 rpy_subset_sum \ 823 rpy_survo_puzzle \ 824 rpy_toNum \ 825 rpy_traffic_lights \ 826 rpy_volsay2 \ 827 rpy_volsay3 \ 828 rpy_volsay \ 829 rpy_wedding_optimal_chart \ 830 rpy_who_killed_agatha \ 831 rpy_xkcd \ 832 rpy_young_tableaux 833 $(MAKE) run SOURCE=examples/contrib/coins_grid.py ARGS="5 2" 834 $(MAKE) run SOURCE=examples/contrib/hidato.py ARGS="3 3" 835# $(MAKE) rpy_cvrptw_plot # error: py3 failure, missing numpy. 836# $(MAKE) rpy_nontransitive_dice # error: too long 837# warning: nurse_sat take 18s 838# $(MAKE) rpy_school_scheduling_sat # error: too long 839# $(MAKE) rpy_secret_santa # error: too long 840# $(MAKE) rpy_word_square # Not working on window since it rely on /usr/share/dict/words 841 842.PHONY: test_python_python # Build and Run all Python Examples (located in ortools/examples/python) 843test_python_python: \ 844 rpy_appointments \ 845 rpy_assignment2_sat \ 846 rpy_assignment_with_constraints_sat \ 847 rpy_balance_group_sat \ 848 rpy_chemical_balance_lp \ 849 rpy_chemical_balance_sat \ 850 rpy_flexible_job_shop_sat \ 851 rpy_gate_scheduling_sat \ 852 rpy_golomb8 \ 853 rpy_hidato_sat \ 854 rpy_integer_programming \ 855 rpy_jobshop_ft06_distance_sat \ 856 rpy_jobshop_ft06_sat \ 857 rpy_jobshop_with_maintenance_sat \ 858 rpy_linear_assignment_api \ 859 rpy_linear_programming \ 860 rpy_magic_sequence_distribute \ 861 rpy_pyflow_example \ 862 rpy_reallocate_sat \ 863 rpy_rcpsp_sat \ 864 rpy_shift_scheduling_sat \ 865 rpy_single_machine_scheduling_with_setup_release_due_dates_sat \ 866 rpy_steel_mill_slab_sat \ 867 rpy_sudoku_sat \ 868 rpy_tasks_and_workers_assignment_sat \ 869 rpy_transit_time \ 870 rpy_vendor_scheduling_sat \ 871 rpy_wedding_optimal_chart_sat \ 872 rpy_worker_schedule_sat \ 873 rpy_zebra_sat 874 875.PHONY: test_python_pimpl 876test_python_pimpl: \ 877 check_python_pimpl \ 878 test_python_tests \ 879 test_python_contrib \ 880 test_python_python 881 882##################### 883## Pypi artifact ## 884##################### 885PYPI_ARCHIVE_TEMP_DIR = temp_python$(PYTHON_VERSION) 886 887# PEP 513 auditwheel repair overwrite rpath to $ORIGIN/<ortools_root>/.libs 888# We need to copy all dynamic libs here 889ifneq ($(SYSTEM),win) 890PYPI_ARCHIVE_LIBS = $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/.libs 891endif 892 893MISSING_PYPI_FILES = \ 894 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py \ 895 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/README.txt \ 896 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/LICENSE-2.0.txt \ 897 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/__init__.py \ 898 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/init \ 899 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/algorithms \ 900 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/graph \ 901 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/constraint_solver \ 902 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/linear_solver \ 903 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/packing \ 904 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/sat \ 905 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/scheduling \ 906 $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/util \ 907 $(PYPI_ARCHIVE_LIBS) 908 909$(PYPI_ARCHIVE_TEMP_DIR): 910 $(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR) 911 912$(PYPI_ARCHIVE_TEMP_DIR)/ortools: | $(PYPI_ARCHIVE_TEMP_DIR) 913 $(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools 914 915$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools: | $(PYPI_ARCHIVE_TEMP_DIR)/ortools 916 $(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools 917 918$(PYPI_ARCHIVE_TEMP_DIR)/ortools/README.txt: tools/README.pypi.txt | $(PYPI_ARCHIVE_TEMP_DIR)/ortools 919 $(COPY) tools$SREADME.pypi.txt $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$SREADME.txt 920 921$(PYPI_ARCHIVE_TEMP_DIR)/ortools/LICENSE-2.0.txt: LICENSE-2.0.txt | $(PYPI_ARCHIVE_TEMP_DIR)/ortools 922 $(COPY) LICENSE-2.0.txt $(PYPI_ARCHIVE_TEMP_DIR)$Sortools 923 924ifndef PRE_RELEASE 925OR_TOOLS_PYTHON_VERSION := $(OR_TOOLS_VERSION) 926else 927OR_TOOLS_PYTHON_VERSION := $(OR_TOOLS_MAJOR).$(OR_TOOLS_MINOR)b$(GIT_REVISION) 928endif 929 930 931$(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py: tools/setup.py.in | $(PYPI_ARCHIVE_TEMP_DIR)/ortools 932 $(COPY) tools$Ssetup.py.in $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Ssetup.py 933 $(SED) -i -e 's/ORTOOLS_PYTHON_VERSION/ortools$(PYPI_OS)/' $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Ssetup.py 934 $(SED) -i -e 's/VVVV/$(OR_TOOLS_PYTHON_VERSION)/' $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Ssetup.py 935 $(SED) -i -e 's/PROTOBUF_TAG/$(PROTOBUF_TAG)/' $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Ssetup.py 936ifeq ($(SYSTEM),win) 937 $(SED) -i -e 's/\.dll/\.pyd/' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 938 $(SED) -i -e '/DELETEWIN/d' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 939 $(SED) -i -e 's/DELETEUNIX //g' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 940 -del $(PYPI_ARCHIVE_TEMP_DIR)\ortools\setup.py-e 941else 942 $(SED) -i -e 's/\.dll/\.so/' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 943 $(SED) -i -e 's/DELETEWIN //g' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 944 $(SED) -i -e '/DELETEUNIX/d' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 945 $(SED) -i -e 's/DLL/$L/g' $(PYPI_ARCHIVE_TEMP_DIR)/ortools/setup.py 946endif 947 948$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/__init__.py: \ 949 $(GEN_DIR)/ortools/__init__.py | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 950 $(COPY) $(GEN_PATH)$Sortools$S__init__.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$S__init__.py 951ifeq ($(SYSTEM),win) 952 echo __version__ = "$(OR_TOOLS_PYTHON_VERSION)" >> \ 953 $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$S__init__.py 954else 955 echo "__version__ = \"$(OR_TOOLS_PYTHON_VERSION)\"" >> \ 956 $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$S__init__.py 957endif 958 959$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/init: $(PYINIT_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 960 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sinit 961 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sinit 962 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sinit$S__init__.py 963 $(COPY) $(GEN_PATH)$Sortools$Sinit$Spywrapinit.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sinit 964 $(COPY) $(GEN_PATH)$Sortools$Sinit$S_pywrapinit.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sinit 965 966$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/algorithms: $(PYALGORITHMS_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 967 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Salgorithms 968 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Salgorithms 969 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Salgorithms$S__init__.py 970 $(COPY) $(GEN_PATH)$Sortools$Salgorithms$Spywrapknapsack_solver.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Salgorithms 971 $(COPY) $(GEN_PATH)$Sortools$Salgorithms$S_pywrapknapsack_solver.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Salgorithms 972 973$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/graph: $(PYGRAPH_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 974 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sgraph 975 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sgraph 976 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sgraph$S__init__.py 977 $(COPY) $(GEN_PATH)$Sortools$Sgraph$Spywrapgraph.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sgraph 978 $(COPY) $(GEN_PATH)$Sortools$Sgraph$S_pywrapgraph.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sgraph 979 980$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/constraint_solver: $(PYCP_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 981 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sconstraint_solver 982 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sconstraint_solver 983 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sconstraint_solver$S__init__.py 984 $(COPY) $(GEN_PATH)$Sortools$Sconstraint_solver$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sconstraint_solver 985 $(COPY) $(GEN_PATH)$Sortools$Sconstraint_solver$S_pywrapcp.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sconstraint_solver 986 987$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/linear_solver: $(PYLP_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 988 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver 989 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver 990 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver$S__init__.py 991 $(COPY) ortools$Slinear_solver$S*.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver 992 $(COPY) $(GEN_PATH)$Sortools$Slinear_solver$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver 993 $(COPY) $(GEN_PATH)$Sortools$Slinear_solver$S_pywraplp.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Slinear_solver 994 995$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/sat: $(PYSAT_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 996 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 997 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 998 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat$S__init__.py 999 $(COPY) ortools$Ssat$Sdoc$S*.md $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 1000 $(COPY) ortools$Ssat$S*.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 1001 $(COPY) $(GEN_PATH)$Sortools$Ssat$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 1002 $(COPY) $(GEN_PATH)$Sortools$Ssat$S_pywrapsat.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat 1003 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat$Spython 1004 $(COPY) ortools$Ssat$Spython$S*.py $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Ssat$Spython 1005 1006$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/packing: $(PYPACKING_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 1007 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Spacking 1008 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Spacking 1009 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Spacking$S__init__.py 1010 $(COPY) $(GEN_PATH)$Sortools$Spacking$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Spacking 1011 1012$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/scheduling: $(PYSCHEDULING_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 1013 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sscheduling 1014 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sscheduling 1015 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sscheduling$S__init__.py 1016 $(COPY) $(GEN_PATH)$Sortools$Sscheduling$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sscheduling 1017 $(COPY) $(GEN_PATH)$Sortools$Sscheduling$S_pywraprcpsp.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sscheduling 1018 1019$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/util: $(PYSORTED_INTERVAL_LIST_LIBS) | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 1020 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sutil 1021 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sutil 1022 $(TOUCH) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sutil$S__init__.py 1023 $(COPY) $(GEN_PATH)$Sortools$Sutil$S*.py* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sutil 1024 $(COPY) $(GEN_PATH)$Sortools$Sutil$S_sorted_interval_list.* $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$Sutil 1025 1026$(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/.libs: | $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools 1027 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$S.libs 1028 -$(MKDIR) $(PYPI_ARCHIVE_TEMP_DIR)$Sortools$Sortools$S.libs 1029 1030ifneq ($(PYTHON_EXECUTABLE),) 1031.PHONY: pypi_archive 1032package_python pypi_archive: $(OR_TOOLS_LIBS) python $(MISSING_PYPI_FILES) 1033ifeq ($(SYSTEM),unix) 1034 cp $(OR_TOOLS_LIBS) $(PYPI_ARCHIVE_TEMP_DIR)/ortools/ortools/.libs 1035endif 1036 cd $(PYPI_ARCHIVE_TEMP_DIR)$Sortools && "$(PYTHON_EXECUTABLE)" setup.py bdist_wheel 1037 1038.PHONY: test_package_python # Test Python "ortools" wheel package 1039test_package_python: package_python 1040 -$(DELREC) $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1041 $(PYTHON_EXECUTABLE) -m venv --system-site-packages $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1042 $(COPY) test.py.in $(PYPI_ARCHIVE_TEMP_DIR)$Svenv$Stest.py 1043 $(COPY) ortools$Salgorithms$Ssamples$Ssimple_knapsack_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1044 $(COPY) ortools$Sgraph$Ssamples$Ssimple_max_flow_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1045 $(COPY) ortools$Sgraph$Ssamples$Ssimple_min_cost_flow_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1046 $(COPY) ortools$Slinear_solver$Ssamples$Ssimple_lp_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1047 $(COPY) ortools$Slinear_solver$Ssamples$Ssimple_mip_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1048 $(COPY) ortools$Ssat$Ssamples$Ssimple_sat_program.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1049 $(COPY) ortools$Sconstraint_solver$Ssamples$Stsp.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1050 $(COPY) ortools$Sconstraint_solver$Ssamples$Svrp.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1051 $(COPY) ortools$Sconstraint_solver$Ssamples$Scvrptw_break.py $(PYPI_ARCHIVE_TEMP_DIR)$Svenv 1052ifneq ($(SYSTEM),win) 1053 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python -m pip install $(PYPI_ARCHIVE_TEMP_DIR)/ortools/dist/*.whl 1054 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python -m pip install pandas matplotlib 1055 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/test.py 1056 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_knapsack_program.py 1057 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_max_flow_program.py 1058 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_min_cost_flow_program.py 1059 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_lp_program.py 1060 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_mip_program.py 1061 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/simple_sat_program.py 1062 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/tsp.py 1063 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/vrp.py 1064 $(PYPI_ARCHIVE_TEMP_DIR)/venv/bin/python $(PYPI_ARCHIVE_TEMP_DIR)/venv/cvrptw_break.py 1065else 1066# wildcar not working on windows: i.e. `pip install *.whl`: 1067# *.whl is not a valid wheel filename. 1068 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python -m pip install --find-links=$(PYPI_ARCHIVE_TEMP_DIR)\ortools\dist ortools 1069 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python -m pip install pandas matplotlib 1070 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\test.py 1071 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_knapsack_program.py 1072 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_max_flow_program.py 1073 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_min_cost_flow_program.py 1074 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_lp_program.py 1075 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_mip_program.py 1076 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\simple_sat_program.py 1077 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\tsp.py 1078 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\vrp.py 1079 $(PYPI_ARCHIVE_TEMP_DIR)\venv\Scripts\python $(PYPI_ARCHIVE_TEMP_DIR)\venv\cvrptw_break.py 1080endif 1081endif # ifneq ($(PYTHON_EXECUTABLE),) 1082 1083.PHONY: publish_python_pimpl 1084publish_python_pimpl: package_python 1085 cd $(PYPI_ARCHIVE_TEMP_DIR)$Sortools && "$(TWINE_EXECUTABLE)" upload "*.whl" 1086 1087.PHONY: install_python # Install Python OR-Tools on the host system 1088install_python: pypi_archive 1089 cd "$(PYPI_ARCHIVE_TEMP_DIR)$Sortools" && "$(PYTHON_EXECUTABLE)" setup.py install --user 1090 1091.PHONY: uninstall_python # Uninstall Python OR-Tools from the host system 1092uninstall_python: 1093 "$(PYTHON_EXECUTABLE)" -m pip uninstall ortools 1094 1095####################### 1096## EXAMPLE ARCHIVE ## 1097####################### 1098TEMP_PYTHON_DIR=temp_python 1099 1100$(TEMP_PYTHON_DIR): 1101 $(MKDIR) $(TEMP_PYTHON_DIR) 1102 1103$(TEMP_PYTHON_DIR)/ortools_examples: | $(TEMP_PYTHON_DIR) 1104 $(MKDIR) $(TEMP_PYTHON_DIR)$Sortools_examples 1105 1106$(TEMP_PYTHON_DIR)/ortools_examples/examples: | $(TEMP_PYTHON_DIR)/ortools_examples 1107 $(MKDIR) $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples 1108 1109$(TEMP_PYTHON_DIR)/ortools_examples/examples/python: | $(TEMP_PYTHON_DIR)/ortools_examples/examples 1110 $(MKDIR) $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1111 1112$(TEMP_PYTHON_DIR)/ortools_examples/examples/data: | $(TEMP_PYTHON_DIR)/ortools_examples/examples 1113 $(MKDIR) $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Sdata 1114 1115$(TEMP_PYTHON_DIR)/ortools_examples/examples/notebook: | $(TEMP_PYTHON_DIR)/ortools_examples/examples 1116 $(MKDIR) $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1117 1118.PHONY: python_examples_archive # Build stand-alone Python examples archive file for redistribution. 1119python_examples_archive: | \ 1120 $(TEMP_PYTHON_DIR)/ortools_examples/examples/python \ 1121 $(TEMP_PYTHON_DIR)/ortools_examples/examples/notebook \ 1122 $(TEMP_PYTHON_DIR)/ortools_examples/examples/data 1123 $(COPY) $(PYTHON_EX_PATH)$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1124 $(COPY) $(CONTRIB_EX_PATH)$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1125 $(COPY) ortools$Salgorithms$Ssamples$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1126 $(COPY) ortools$Sgraph$Ssamples$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1127 $(COPY) ortools$Slinear_solver$Ssamples$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1128 $(COPY) ortools$Sconstraint_solver$Ssamples$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1129 $(COPY) ortools$Ssat$Ssamples$S*.py $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Spython 1130 $(COPY) examples$Snotebook$Salgorithms$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1131 $(COPY) examples$Snotebook$Sconstraint_solver$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1132 $(COPY) examples$Snotebook$Scontrib$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1133 $(COPY) examples$Snotebook$Sexamples$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1134 $(COPY) examples$Snotebook$Sgraph$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1135 $(COPY) examples$Snotebook$Slinear_solver$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1136 $(COPY) examples$Snotebook$Ssat$S*.ipynb $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1137 $(COPY) examples$Snotebook$S*.md $(TEMP_PYTHON_DIR)$Sortools_examples$Sexamples$Snotebook 1138 $(COPY) tools$SREADME.python.md $(TEMP_PYTHON_DIR)$Sortools_examples$SREADME.md 1139 $(COPY) LICENSE-2.0.txt $(TEMP_PYTHON_DIR)$Sortools_examples 1140ifeq ($(SYSTEM),win) 1141 cd $(TEMP_PYTHON_DIR)\ortools_examples \ 1142 && ..\..\$(TAR) -C ..\.. -c -v \ 1143 --exclude *svn* --exclude *roadef* --exclude *vector_packing* \ 1144 examples\data | ..\..\$(TAR) xvm 1145 cd $(TEMP_PYTHON_DIR) \ 1146 && ..\$(ZIP) \ 1147 -r ..\or-tools_python_examples_v$(OR_TOOLS_VERSION).zip \ 1148 ortools_examples 1149else 1150 cd $(TEMP_PYTHON_DIR)/ortools_examples \ 1151 && tar -C ../.. -c -v \ 1152 --exclude *svn* --exclude *roadef* --exclude *vector_packing* \ 1153 examples/data | tar xvm 1154 cd $(TEMP_PYTHON_DIR) \ 1155 && tar -c -v -z --no-same-owner \ 1156 -f ../or-tools_python_examples$(PYPI_OS)_v$(OR_TOOLS_VERSION).tar.gz \ 1157 ortools_examples 1158endif 1159 -$(DELREC) $(TEMP_PYTHON_DIR)$Sortools_examples 1160 1161################ 1162## Cleaning ## 1163################ 1164.PHONY: clean_python # Clean Python output from previous build. 1165clean_python: 1166 -$(DEL) $(GEN_PATH)$Sortools$S__init__.py 1167 -$(DEL) ortools$S*.pyc 1168 -$(DELREC) ortools$S__pycache__ 1169 -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.py 1170 -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.pyc 1171 -$(DELREC) $(GEN_PATH)$Sortools$Sinit$S__pycache__ 1172 -$(DEL) ortools$Sinit$S*.pyc 1173 -$(DELREC) ortools$Sinit$S__pycache__ 1174 -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*_python_wrap.* 1175 -$(DEL) $(GEN_PATH)$Sortools$Sinit$S_pywrap* 1176 -$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S*.py 1177 -$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S*.pyc 1178 -$(DELREC) $(GEN_PATH)$Sortools$Salgorithms$S__pycache__ 1179 -$(DEL) ortools$Salgorithms$S*.pyc 1180 -$(DELREC) ortools$Salgorithms$S__pycache__ 1181 -$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S*_python_wrap.* 1182 -$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S_pywrap* 1183 -$(DEL) $(GEN_PATH)$Sortools$Sgraph$S*.py 1184 -$(DEL) $(GEN_PATH)$Sortools$Sgraph$S*.pyc 1185 -$(DELREC) $(GEN_PATH)$Sortools$Sgraph$S__pycache__ 1186 -$(DEL) ortools$Sgraph$S*.pyc 1187 -$(DELREC) ortools$Sgraph$S__pycache__ 1188 -$(DEL) $(GEN_PATH)$Sortools$Sgraph$S*_python_wrap.* 1189 -$(DEL) $(GEN_PATH)$Sortools$Sgraph$S_pywrap* 1190 -$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S*.py 1191 -$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S*.pyc 1192 -$(DELREC) $(GEN_PATH)$Sortools$Sconstraint_solver$S__pycache__ 1193 -$(DEL) ortools$Sconstraint_solver$S*.pyc 1194 -$(DELREC) ortools$Sconstraint_solver$S__pycache__ 1195 -$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S*_python_wrap.* 1196 -$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S_pywrap* 1197 -$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*.py 1198 -$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*.pyc 1199 -$(DELREC) $(GEN_PATH)$Sortools$Slinear_solver$S__pycache__ 1200 -$(DEL) ortools$Slinear_solver$S*.pyc 1201 -$(DELREC) ortools$Slinear_solver$S__pycache__ 1202 -$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*_python_wrap.* 1203 -$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S_pywrap* 1204 -$(DEL) $(GEN_PATH)$Sortools$Ssat$S*.py 1205 -$(DEL) $(GEN_PATH)$Sortools$Ssat$S*.pyc 1206 -$(DELREC) $(GEN_PATH)$Sortools$Ssat$S__pycache__ 1207 -$(DEL) ortools$Ssat$S*.pyc 1208 -$(DELREC) ortools$Ssat$S__pycache__ 1209 -$(DEL) ortools$Ssat$Spython$S*.pyc 1210 -$(DELREC) ortools$Ssat$Spython$S__pycache__ 1211 -$(DEL) $(GEN_PATH)$Sortools$Ssat$S*_python_wrap.* 1212 -$(DEL) $(GEN_PATH)$Sortools$Ssat$S_pywrap* 1213 -$(DEL) $(GEN_PATH)$Sortools$Sscheduling$S*.py 1214 -$(DEL) $(GEN_PATH)$Sortools$Sscheduling$S*.pyc 1215 -$(DELREC) $(GEN_PATH)$Sortools$Sscheduling$S__pycache__ 1216 -$(DEL) ortools$Spacking$S*.pyc 1217 -$(DELREC) ortools$Spacking$S__pycache__ 1218 -$(DEL) ortools$Sscheduling$S*.pyc 1219 -$(DELREC) ortools$Sscheduling$S__pycache__ 1220 -$(DEL) $(GEN_PATH)$Sortools$Sscheduling$S*_python_wrap.* 1221 -$(DEL) $(GEN_PATH)$Sortools$Sscheduling$S_pywrap* 1222 -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*.py 1223 -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*.pyc 1224 -$(DELREC) $(GEN_PATH)$Sortools$Sutil$S__pycache__ 1225 -$(DEL) ortools$Sutil$S*.pyc 1226 -$(DELREC) ortools$Sutil$S__pycache__ 1227 -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*_python_wrap.* 1228 -$(DEL) $(GEN_PATH)$Sortools$Sutil$S_* 1229 -$(DEL) $(LIB_DIR)$S_*.$(SWIG_PYTHON_LIB_SUFFIX) 1230 -$(DEL) $(OBJ_DIR)$Sswig$S*python_wrap.$O 1231 -$(DELREC) temp_python* 1232 1233############# 1234## DEBUG ## 1235############# 1236.PHONY: detect_python # Show variables used to build Python OR-Tools. 1237detect_python: 1238 @echo Relevant info for the Python build: 1239ifeq ($(SYSTEM),win) 1240 @echo WINDOWS_PATH_TO_PYTHON = "$(WINDOWS_PATH_TO_PYTHON)" 1241else 1242 @echo UNIX_PYTHON_VER = "$(UNIX_PYTHON_VER)" 1243endif 1244 @echo PYTHON_COMPILER = $(PYTHON_COMPILER) 1245 @echo PYTHON_EXECUTABLE = "$(PYTHON_EXECUTABLE)" 1246 @echo PYTHON_VERSION = $(PYTHON_VERSION) 1247 @echo PYTHON3 = $(PYTHON3) 1248 @echo PYTHON_INC = $(PYTHON_INC) 1249 @echo PYTHON_LNK = $(PYTHON_LNK) 1250 @echo PYTHON_LDFLAGS = $(PYTHON_LDFLAGS) 1251 @echo SWIG_BINARY = $(SWIG_BINARY) 1252 @echo SWIG_INC = $(SWIG_INC) 1253 @echo SWIG_PYTHON3_FLAG = $(SWIG_PYTHON3_FLAG) 1254 @echo SWIG_PYTHON_LIB_SUFFIX = $(SWIG_PYTHON_LIB_SUFFIX) 1255 @echo SET_PYTHONPATH = "$(SET_PYTHONPATH)" 1256 @echo MYPY_OUT = "$(MYPY_OUT)" 1257ifeq ($(SYSTEM),win) 1258 @echo off & echo( 1259else 1260 @echo 1261endif 1262