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