1VERSION := @PROJECT_VERSION@
2# Let's discover something about where we run
3ifeq ($(OS),Windows_NT)
4OS = Windows
5endif
6ifeq ($(OS),Windows)
7SYSTEM = win
8else
9SYSTEM = unix
10endif
11
12.SECONDARY:
13
14# Useful directories.
15INC_DIR = include
16EX_DIR = examples
17CPP_EX_DIR = examples/cpp
18CPP_EX_PATH = $(subst /,$S,$(CPP_EX_DIR))
19JAVA_EX_DIR = examples/java
20JAVA_EX_PATH = $(subst /,$S,$(JAVA_EX_DIR))
21DOTNET_EX_DIR = examples/dotnet
22DOTNET_EX_PATH = $(subst /,$S,$(DOTNET_EX_DIR))
23OBJ_DIR = objs
24CLASS_DIR = classes
25LIB_DIR = lib
26BIN_DIR = bin
27
28# Unix specific part.
29ifeq ($(SYSTEM),unix)
30  OS = $(shell uname -s)
31  TOUCH = touch
32# C++
33  ifeq ($(OS),Linux)
34    CXX = g++
35    LDFLAGS = \
36-Wl,-rpath,"\$$ORIGIN" \
37-Wl,-rpath,"\$$ORIGIN/../lib64" \
38-Wl,-rpath,"\$$ORIGIN/../lib" \
39-lz -lrt -lpthread
40    LBITS = $(shell getconf LONG_BIT)
41    ifeq ($(LBITS),64)
42      PORT = Linux64
43      ARCH = -DARCH_K8
44      NETPLATFORM = anycpu
45    else
46      PORT = Linux32
47      ARCH =
48      NETPLATFORM = x86
49    endif
50    MONO = LD_LIBRARY_PATH=$(LIB_DIR):$(LD_LIBRARY_PATH) mono
51    L = .so
52  endif # ifeq($(OS),Linux)
53  ifeq ($(OS),Darwin) # Assume Mac Os X
54    CXX = clang++
55    LDFLAGS = \
56-Wl,-rpath,@loader_path \
57-Wl,-rpath,@loader_path/../lib \
58-lz -framework CoreFoundation
59    PORT = MacOsX64
60    ARCH = -DARCH_K8
61    NETPLATFORM = x64
62    MONO = DYLD_FALLBACK_LIBRARY_PATH=$(LIB_DIR):$(DYLD_LIBRARY_PATH) mono
63    L = .dylib
64  endif # ifeq($(OS),Darwin)
65  CXX_BIN := $(shell command -v $(CXX) 2> /dev/null)
66  DEBUG = -O4 -DNDEBUG
67  CXXFLAGS = -fPIC -std=c++17 $(DEBUG) \
68 -I$(INC_DIR) -I. $(ARCH) -Wno-deprecated \
69 -DUSE_BOP -DUSE_GLOP \
70 -DUSE_CBC -DUSE_CLP \
71 -DUSE_SCIP
72  LIB_PREFIX = lib
73  PRE_LIB = -Llib -Llib64
74  OR_TOOLS_LNK = $(PRE_LIB) -lortools
75  OBJ_OUT = -o #
76  EXE_OUT = -o #
77  O = .o
78  J = .jar
79  D = .dll
80  E =
81# Java
82ifneq ($(JAVA_HOME),)
83  JAVAC_BIN := $(shell command -v $(JAVA_HOME)/bin/javac 2> /dev/null)
84  JAR_BIN := $(shell command -v $(JAVA_HOME)/bin/jar 2> /dev/null)
85  JAVA_BIN := $(shell command -v $(JAVA_HOME)/bin/java 2> /dev/null)
86else
87  JAVAC_BIN := $(shell command -v javac 2> /dev/null)
88  JAR_BIN := $(shell command -v jar 2> /dev/null)
89  JAVA_BIN := $(shell command -v java 2> /dev/null)
90endif
91  MVN_BIN := $(shell command -v mvn 2> /dev/null)
92  JAVAFLAGS = -Djava.library.path=$(LIB_DIR)
93  CPSEP = :
94# .Net
95  DOTNET = dotnet
96  DOTNET_BIN := $(shell command -v $(DOTNET) 2> /dev/null)
97# Makefile
98  S = /
99  DEL = rm -f
100  DEL_REC = rm -rf
101  MKDIR = mkdir
102endif # SYSTEM == unix
103
104# Windows specific part.
105ifeq ($(SYSTEM),win)
106  WHICH = tools\\win\\which.exe
107  TOUCH = tools\\win\\touch.exe
108  ifeq ("$(Platform)","X64")
109    PLATFORM = Win64
110  endif
111  ifeq ("$(Platform)","x64")
112    PLATFORM = Win64
113  endif
114  ifeq ("$(PLATFORM)","Win64")
115    PORT = VisualStudio$(VISUAL_STUDIO)-64b
116    NETPLATFORM = x64
117  else
118    PORT = VisualStudio$(VISUAL_STUDIO)-32b
119    NETPLATFORM = x86
120  endif
121  CXX = cl
122  # We can't use `where` since it's return all matching pathnames
123  # so we ship which.exe and use it
124  CXX_BIN := $(shell $(WHICH) $(CXX) 2> NUL)
125  DEBUG = /O2 -DNDEBUG
126  CXXFLAGS = /std:c++17 /EHsc /MD /nologo /D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS -nologo $(DEBUG) \
127    /DPSAPI_VERSION=1 /D__WIN32__ /DNOMINMAX /DWIN32_LEAN_AND_MEAN=1 /D_CRT_SECURE_NO_WARNINGS \
128    /DGOOGLE_GLOG_DLL_DECL= \
129    /I$(INC_DIR)\\src\\windows /I$(INC_DIR) /I. \
130    /DUSE_BOP /DUSE_GLOP \
131    /DUSE_CBC /DUSE_CLP \
132    /DUSE_SCIP
133  LDFLAGS = psapi.lib ws2_32.lib
134  LIB_PREFIX =
135  OR_TOOLS_LNK = lib\\ortools.lib
136  OBJ_OUT = /Fo
137  EXE_OUT = /Fe
138  O = .obj
139  L = .lib
140  J = .jar
141  D = .dll
142  E = .exe
143# Java
144  JAVAC_BIN := $(shell $(WHICH) javac 2> NUL)
145  JAR_BIN := $(shell $(WHICH) jar 2> NUL)
146  JAVA_BIN := $(shell $(WHICH) java 2> NUL)
147  MVN_BIN := $(shell $(WHICH) mvn.cmd 2> NUL)
148  JAVAFLAGS = -Djava.library.path=$(LIB_DIR)
149  CPSEP = ;
150# .Net
151  DOTNET = dotnet
152  DOTNET_BIN := $(shell $(WHICH) $(DOTNET) 2> NUL)
153# Makefile
154  S = \\
155  DEL = del
156  DEL_REC = rd /S /Q
157  MKDIR = md
158endif # SYSTEM == win
159
160OR_TOOLS_LIBS = $(LIB_DIR)/$(LIB_PREFIX)ortools$L
161
162.PHONY: all
163all: detect cc java dotnet test
164
165.PHONY: detect
166detect: detect_port detect_cc detect_java detect_dotnet
167	@echo SOURCE = $(SOURCE)
168	@echo SOURCE_PATH = $(SOURCE_PATH)
169	@echo SOURCE_NAME = $(SOURCE_NAME)
170	@echo SOURCE_SUFFIX = $(SOURCE_SUFFIX)
171ifeq ($(SYSTEM),win)
172	@echo off & echo(
173else
174	@echo
175endif
176
177.PHONY: test
178test: test_cc test_java test_dotnet
179
180.PHONY: clean
181clean:
182	-$(DEL) $(EXE)
183	-$(DEL_REC) $(OBJ_DIR)
184	-$(DEL_REC) $(CLASS_DIR)
185
186.PHONY: detect_port
187detect_port:
188	@echo VERSION = $(VERSION)
189	@echo SHELL = $(SHELL)
190	@echo SYSTEM = $(SYSTEM)
191	@echo PORT = $(PORT)
192	@echo OS = $(OS)
193ifeq ($(SYSTEM),win)
194	@echo off & echo(
195else
196	@echo
197endif
198
199##############
200##  SOURCE  ##
201##############
202# Check SOURCE argument
203SOURCE_SUFFIX = $(suffix $(SOURCE))
204# will contain “/any/path/foo.cc” on unix and “\\any\\path\\foo.cc” on windows
205SOURCE_PATH = $(subst /,$S,$(SOURCE))
206SOURCE_NAME = $(basename $(notdir $(SOURCE)))
207ifeq ($(SOURCE),) # Those rules will be used if SOURCE is empty
208.PHONY: build run
209build run:
210	$(error no source file provided, the "$@" target must be used like so: \
211 make $@ SOURCE=relative/path/to/filename.extension)
212else
213ifeq (,$(wildcard $(SOURCE)))
214$(error File "$(SOURCE)" does not exist !)
215endif
216endif
217
218###########
219##  C++  ##
220###########
221EXE = \
222$(BIN_DIR)/simple_ls_program$E \
223$(BIN_DIR)/rabbits_and_pheasants_cp$E \
224$(BIN_DIR)/nurses_cp$E \
225$(BIN_DIR)/minimal_jobshop_cp$E \
226\
227$(BIN_DIR)/constraint_programming_cp$E \
228$(BIN_DIR)/costas_array_sat$E \
229$(BIN_DIR)/cvrp_disjoint_tw$E \
230$(BIN_DIR)/cvrptw$E \
231$(BIN_DIR)/cvrptw_with_breaks$E \
232$(BIN_DIR)/cvrptw_with_refueling$E \
233$(BIN_DIR)/cvrptw_with_resources$E \
234$(BIN_DIR)/cvrptw_with_stop_times_and_resources$E \
235$(BIN_DIR)/dimacs_assignment$E \
236$(BIN_DIR)/dobble_ls$E \
237$(BIN_DIR)/flow_api$E \
238$(BIN_DIR)/frequency_assignment_problem$E \
239$(BIN_DIR)/golomb_sat$E \
240$(BIN_DIR)/integer_programming$E \
241$(BIN_DIR)/jobshop_sat$E \
242$(BIN_DIR)/knapsack$E \
243$(BIN_DIR)/linear_assignment_api$E \
244$(BIN_DIR)/linear_programming$E \
245$(BIN_DIR)/linear_solver_protocol_buffers$E \
246$(BIN_DIR)/magic_square_sat$E \
247$(BIN_DIR)/max_flow$E \
248$(BIN_DIR)/min_cost_flow$E \
249$(BIN_DIR)/mps_driver$E \
250$(BIN_DIR)/network_routing_sat$E \
251$(BIN_DIR)/nqueens$E \
252$(BIN_DIR)/random_tsp$E \
253$(BIN_DIR)/pdptw$E \
254$(BIN_DIR)/shift_minimization_sat$E \
255$(BIN_DIR)/solve$E \
256$(BIN_DIR)/sports_scheduling_sat$E \
257$(BIN_DIR)/strawberry_fields_with_column_generation$E \
258$(BIN_DIR)/tsp$E \
259$(BIN_DIR)/vrp$E \
260$(BIN_DIR)/weighted_tardiness_sat$E
261
262.PHONY: cc test_cc
263ifndef CXX_BIN
264cc test_cc:
265	@echo the $(CXX) command was not found in your PATH
266	exit 127
267else
268cc: $(EXE)
269test_cc: detect_cc
270	$(MAKE) run SOURCE=examples/cpp/simple_knapsack_program.cc
271	$(MAKE) run SOURCE=examples/cpp/simple_max_flow_program.cc
272	$(MAKE) run SOURCE=examples/cpp/simple_min_cost_flow_program.cc
273	$(MAKE) run SOURCE=examples/cpp/simple_lp_program.cc
274	$(MAKE) run SOURCE=examples/cpp/simple_mip_program.cc
275	$(MAKE) run SOURCE=examples/cpp/simple_sat_program.cc
276	$(MAKE) run SOURCE=examples/cpp/simple_ls_program.cc
277	$(MAKE) run SOURCE=examples/cpp/tsp.cc
278	$(MAKE) run SOURCE=examples/cpp/vrp.cc
279	$(MAKE) run SOURCE=examples/cpp/nurses_cp.cc
280	$(MAKE) run SOURCE=examples/cpp/minimal_jobshop_cp.cc
281	$(MAKE) run SOURCE=examples/cpp/linear_programming.cc
282	$(MAKE) run SOURCE=examples/cpp/integer_programming.cc
283
284##################
285##  C++ SOURCE  ##
286##################
287IS_CPP =
288ifeq ($(SOURCE_SUFFIX),.cc)
289    IS_CPP = true
290endif
291ifeq ($(SOURCE_SUFFIX),.cpp)
292    IS_CPP = true
293endif
294ifdef IS_CPP # Those rules will be used if SOURCE contain a .cc or .cpp file
295$(OBJ_DIR)/$(SOURCE_NAME).$O: $(SOURCE) | $(OBJ_DIR)
296	$(CXX) $(CXXFLAGS) \
297 -c $(SOURCE_PATH) \
298 $(OBJ_OUT)$(OBJ_DIR)$S$(SOURCE_NAME).$O
299
300$(BIN_DIR)/$(SOURCE_NAME)$E: $(OBJ_DIR)/$(SOURCE_NAME).$O | $(BIN_DIR)
301	$(CXX) $(CXXFLAGS) \
302 $(OBJ_DIR)$S$(SOURCE_NAME).$O \
303 $(OR_TOOLS_LNK) $(LDFLAGS) \
304 $(EXE_OUT)$(BIN_DIR)$S$(SOURCE_NAME)$E
305
306.PHONY: build # Build a C++ program.
307build: $(BIN_DIR)/$(SOURCE_NAME)$E
308
309.PHONY: run # Run a C++ program.
310run: build
311	$(BIN_DIR)$S$(SOURCE_NAME)$E $(ARGS)
312endif # ifeq IS_CPP
313endif # ifndef CXX_BIN
314
315$(OBJ_DIR):
316	-$(MKDIR) $(OBJ_DIR)
317
318$(OBJ_DIR)/%$O: $(CPP_EX_DIR)/%.cc | $(OBJ_DIR)
319	$(CXX) $(CXXFLAGS) -c $(CPP_EX_PATH)$S$*.cc $(OBJ_OUT)$(OBJ_DIR)$S$*$O
320
321$(BIN_DIR)/%$E: $(OBJ_DIR)/%$O
322	$(CXX) $(CXXFLAGS) $(OBJ_DIR)$S$*$O $(OR_TOOLS_LNK) $(LDFLAGS) $(EXE_OUT)$(BIN_DIR)$S$*$E
323
324.PHONY: detect_cc
325detect_cc:
326	@echo CXX = $(CXX)
327	@echo CXX_BIN = $(CXX_BIN)
328	@echo CXXFLAGS = $(CXXFLAGS)
329	@echo LDFLAGS = $(LDFLAGS)
330	@echo OR_TOOLS_LNK = $(OR_TOOLS_LNK)
331ifeq ($(SYSTEM),win)
332	@echo off & echo(
333else
334	@echo
335endif
336
337############
338##  JAVA  ##
339############
340HAS_JAVA = true
341ifndef JAVAC_BIN
342HAS_JAVA =
343endif
344ifndef JAR_BIN
345HAS_JAVA =
346endif
347ifndef JAVA_BIN
348HAS_JAVA =
349endif
350ifndef MVN_BIN
351HAS_JAVA =
352endif
353
354.PHONY: java test_java
355ifndef HAS_JAVA
356java test_java:
357	@echo the command 'java', 'javac', 'jar' or 'mvn' was not found in your PATH
358	exit 127
359else
360java:
361	$(MAKE) run SOURCE=examples/java/LinearProgramming/src/main/java/com/google/ortools/LinearProgramming.java
362	$(MAKE) run SOURCE=examples/java/IntegerProgramming/src/main/java/com/google/ortools/IntegerProgramming.java
363	$(MAKE) run SOURCE=examples/java/RabbitsPheasants/src/main/java/com/google/ortools/RabbitsPheasants.java
364	$(MAKE) run SOURCE=examples/java/Tsp/src/main/java/com/google/ortools/Tsp.java
365	$(MAKE) run SOURCE=examples/java/Vrp/src/main/java/com/google/ortools/Vrp.java
366	$(MAKE) run SOURCE=examples/java/Knapsack/src/main/java/com/google/ortools/Knapsack.java
367	$(MAKE) run SOURCE=examples/java/AllDifferentExcept0/src/main/java/com/google/ortools/AllDifferentExcept0.java
368	$(MAKE) run SOURCE=examples/java/AllInterval/src/main/java/com/google/ortools/AllInterval.java
369	$(MAKE) run SOURCE=examples/java/CapacitatedVehicleRoutingProblemWithTimeWindows/src/main/java/com/google/ortools/CapacitatedVehicleRoutingProblemWithTimeWindows.java
370	$(MAKE) run SOURCE=examples/java/Circuit/src/main/java/com/google/ortools/Circuit.java
371	$(MAKE) run SOURCE=examples/java/CoinsGrid/src/main/java/com/google/ortools/CoinsGrid.java
372	$(MAKE) run SOURCE=examples/java/CoinsGridMIP/src/main/java/com/google/ortools/CoinsGridMIP.java
373	$(MAKE) run SOURCE=examples/java/ColoringMIP/src/main/java/com/google/ortools/ColoringMIP.java
374	$(MAKE) run SOURCE=examples/java/CoveringOpl/src/main/java/com/google/ortools/CoveringOpl.java
375	$(MAKE) run SOURCE=examples/java/Crossword/src/main/java/com/google/ortools/Crossword.java
376	$(MAKE) run SOURCE=examples/java/DeBruijn/src/main/java/com/google/ortools/DeBruijn.java
377	$(MAKE) run SOURCE=examples/java/Diet/src/main/java/com/google/ortools/Diet.java
378	$(MAKE) run SOURCE=examples/java/DietMIP/src/main/java/com/google/ortools/DietMIP.java
379	$(MAKE) run SOURCE=examples/java/DivisibleBy9Through1/src/main/java/com/google/ortools/DivisibleBy9Through1.java
380	$(MAKE) run SOURCE=examples/java/FlowExample/src/main/java/com/google/ortools/FlowExample.java
381	$(MAKE) run SOURCE=examples/java/GolombRuler/src/main/java/com/google/ortools/GolombRuler.java
382	$(MAKE) run SOURCE=examples/java/Issue173/src/main/java/com/google/ortools/Issue173.java
383	$(MAKE) run SOURCE=examples/java/KnapsackMIP/src/main/java/com/google/ortools/KnapsackMIP.java
384	$(MAKE) run SOURCE=examples/java/LeastDiff/src/main/java/com/google/ortools/LeastDiff.java
385	$(MAKE) run SOURCE=examples/java/LinearAssignmentAPI/src/main/java/com/google/ortools/LinearAssignmentAPI.java
386	$(MAKE) run SOURCE=examples/java/MagicSquare/src/main/java/com/google/ortools/MagicSquare.java
387	$(MAKE) run SOURCE=examples/java/Map2/src/main/java/com/google/ortools/Map2.java
388	$(MAKE) run SOURCE=examples/java/Map/src/main/java/com/google/ortools/Map.java
389	$(MAKE) run SOURCE=examples/java/Minesweeper/src/main/java/com/google/ortools/Minesweeper.java
390	$(MAKE) run SOURCE=examples/java/MultiThreadTest/src/main/java/com/google/ortools/MultiThreadTest.java
391	$(MAKE) run SOURCE=examples/java/NQueens2/src/main/java/com/google/ortools/NQueens2.java
392	$(MAKE) run SOURCE=examples/java/NQueens/src/main/java/com/google/ortools/NQueens.java
393	$(MAKE) run SOURCE=examples/java/Partition/src/main/java/com/google/ortools/Partition.java
394	$(MAKE) run SOURCE=examples/java/QuasigroupCompletion/src/main/java/com/google/ortools/QuasigroupCompletion.java
395	$(MAKE) run SOURCE=examples/java/SendMoreMoney2/src/main/java/com/google/ortools/SendMoreMoney2.java
396	$(MAKE) run SOURCE=examples/java/SendMoreMoney/src/main/java/com/google/ortools/SendMoreMoney.java
397	$(MAKE) run SOURCE=examples/java/SendMostMoney/src/main/java/com/google/ortools/SendMostMoney.java
398	$(MAKE) run SOURCE=examples/java/Seseman/src/main/java/com/google/ortools/Seseman.java
399	$(MAKE) run SOURCE=examples/java/SetCovering2/src/main/java/com/google/ortools/SetCovering2.java
400	$(MAKE) run SOURCE=examples/java/SetCovering3/src/main/java/com/google/ortools/SetCovering3.java
401	$(MAKE) run SOURCE=examples/java/SetCovering4/src/main/java/com/google/ortools/SetCovering4.java
402	$(MAKE) run SOURCE=examples/java/SetCoveringDeployment/src/main/java/com/google/ortools/SetCoveringDeployment.java
403	$(MAKE) run SOURCE=examples/java/SetCovering/src/main/java/com/google/ortools/SetCovering.java
404	$(MAKE) run SOURCE=examples/java/SimpleRoutingTest/src/main/java/com/google/ortools/SimpleRoutingTest.java
405	$(MAKE) run SOURCE=examples/java/StableMarriage/src/main/java/com/google/ortools/StableMarriage.java
406	$(MAKE) run SOURCE=examples/java/StiglerMIP/src/main/java/com/google/ortools/StiglerMIP.java
407	$(MAKE) run SOURCE=examples/java/Strimko2/src/main/java/com/google/ortools/Strimko2.java
408	$(MAKE) run SOURCE=examples/java/Sudoku/src/main/java/com/google/ortools/Sudoku.java
409	$(MAKE) run SOURCE=examples/java/SurvoPuzzle/src/main/java/com/google/ortools/SurvoPuzzle.java
410	$(MAKE) run SOURCE=examples/java/ToNum/src/main/java/com/google/ortools/ToNum.java
411	$(MAKE) run SOURCE=examples/java/WhoKilledAgatha/src/main/java/com/google/ortools/WhoKilledAgatha.java
412	$(MAKE) run SOURCE=examples/java/Xkcd/src/main/java/com/google/ortools/Xkcd.java
413	$(MAKE) run SOURCE=examples/java/YoungTableaux/src/main/java/com/google/ortools/YoungTableaux.java
414
415test_java: detect_java
416	$(MAKE) run SOURCE=examples/java/SimpleLpProgram/src/main/java/com/google/ortools/SimpleLpProgram.java
417	$(MAKE) run SOURCE=examples/java/SimpleMipProgram/src/main/java/com/google/ortools/SimpleMipProgram.java
418	$(MAKE) run SOURCE=examples/java/SimpleSatProgram/src/main/java/com/google/ortools/SimpleSatProgram.java
419	$(MAKE) run SOURCE=examples/java/Tsp/src/main/java/com/google/ortools/Tsp.java
420	$(MAKE) run SOURCE=examples/java/Vrp/src/main/java/com/google/ortools/Vrp.java
421	$(MAKE) run SOURCE=examples/java/Knapsack/src/main/java/com/google/ortools/Knapsack.java
422
423###################
424##  Java SOURCE  ##
425###################
426ifeq ($(SOURCE_SUFFIX),.java) # Those rules will be used if SOURCE contain a .java file
427.PHONY: build # Build a Java program.
428build: $(SOURCE) examples/java/$(SOURCE_NAME)/pom.xml | java.log
429	cd examples$Sjava$S$(SOURCE_NAME) && "$(MVN_BIN)" compile
430
431.PHONY: run # Run a Java program.
432run: build
433	cd examples$Sjava$S$(SOURCE_NAME) && "$(MVN_BIN)" exec:java $(ARGS)
434endif # ifeq ($(SOURCE_SUFFIX),.java)
435
436endif # ifndef HAS_JAVA
437
438ifeq ($(OS),Windows)
439JAVA_NATIVE_IDENTIFIER=win32-x86-64
440else
441  ifeq ($(OS),Linux)
442  JAVA_NATIVE_IDENTIFIER=linux-x86-64
443  else
444    ifeq ($(OS),Darwin)
445    JAVA_NATIVE_IDENTIFIER=darwin-x86-64
446    else
447    $(error OS unknown !)
448    endif
449  endif
450endif
451
452JAVA_NATIVE_PROJECT := ortools-$(JAVA_NATIVE_IDENTIFIER)-@PROJECT_VERSION@.jar
453JAVA_PROJECT := ortools-java-@PROJECT_VERSION@.jar
454
455java.log: \
456 $(JAVA_NATIVE_PROJECT) pom-runtime.xml \
457 $(JAVA_PROJECT) pom-local.xml
458	"$(MVN_BIN)" org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
459-Dfile=$(JAVA_NATIVE_PROJECT)
460	"$(MVN_BIN)" org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
461-Dfile=$(JAVA_PROJECT)
462	@$(TOUCH) $@
463
464.PHONY: detect_java
465detect_java:
466	@echo JAVA_HOME = $(JAVA_HOME)
467	@echo JAVAC_BIN = $(JAVAC_BIN)
468	@echo CLASS_DIR = $(CLASS_DIR)
469	@echo JAR_BIN = $(JAR_BIN)
470	@echo JAVA_BIN = $(JAVA_BIN)
471	@echo JAVAFLAGS = $(JAVAFLAGS)
472	@echo MVN_BIN = $(MVN_BIN)
473ifeq ($(SYSTEM),win)
474	@echo off & echo(
475else
476	@echo
477endif
478
479##############
480##  DOTNET  ##
481##############
482.PHONY: dotnet test_dotnet
483ifndef DOTNET_BIN
484dotnet test_dotnet:
485	@echo the command 'dotnet' was not found in your PATH
486	exit 127
487else
488dotnet:
489	$(MAKE) run SOURCE=examples/dotnet/3_jugs_regular/3_jugs_regular.cs
490# Linear Solver
491	$(MAKE) run SOURCE=examples/dotnet/SimpleLpProgram/SimpleLpProgram.cs
492	$(MAKE) run SOURCE=examples/dotnet/SimpleMipProgram/SimpleMipProgram.cs
493# Constraint Solver
494	$(MAKE) run SOURCE=examples/dotnet/Tsp/Tsp.cs
495	$(MAKE) run SOURCE=examples/dotnet/Vrp/Vrp.cs
496# Sat
497	$(MAKE) run SOURCE=examples/dotnet/NursesSat/NursesSat.cs
498	$(MAKE) run SOURCE=examples/dotnet/JobshopSat/JobshopSat.cs
499	$(MAKE) run SOURCE=examples/dotnet/JobshopFt06Sat/JobshopFt06Sat.cs
500	$(MAKE) run SOURCE=examples/dotnet/GateSchedulingSat/GateSchedulingSat.cs
501	$(MAKE) run SOURCE=examples/dotnet/TaskSchedulingSat/TaskSchedulingSat.cs
502# Misc
503	$(MAKE) run SOURCE=examples/dotnet/cslinearprogramming/cslinearprogramming.cs
504	$(MAKE) run SOURCE=examples/dotnet/csintegerprogramming/csintegerprogramming.cs
505	$(MAKE) run SOURCE=examples/dotnet/assignment/assignment.cs
506	$(MAKE) run SOURCE=examples/dotnet/alldifferent_except_0/alldifferent_except_0.cs
507	$(MAKE) run SOURCE=examples/dotnet/all_interval/all_interval.cs
508	$(MAKE) run SOURCE=examples/dotnet/a_puzzle/a_puzzle.cs
509	$(MAKE) run SOURCE=examples/dotnet/a_round_of_golf/a_round_of_golf.cs
510	$(MAKE) run SOURCE=examples/dotnet/broken_weights/broken_weights.cs
511	$(MAKE) run SOURCE=examples/dotnet/bus_schedule/bus_schedule.cs
512	$(MAKE) run SOURCE=examples/dotnet/circuit2/circuit2.cs
513	$(MAKE) run SOURCE=examples/dotnet/circuit/circuit.cs
514	$(MAKE) run SOURCE=examples/dotnet/coins3/coins3.cs
515	$(MAKE) run SOURCE=examples/dotnet/coins_grid/coins_grid.cs ARGS="5 2"
516	$(MAKE) run SOURCE=examples/dotnet/combinatorial_auction2/combinatorial_auction2.cs
517	$(MAKE) run SOURCE=examples/dotnet/contiguity_regular/contiguity_regular.cs
518	$(MAKE) run SOURCE=examples/dotnet/contiguity_transition/contiguity_transition.cs
519	$(MAKE) run SOURCE=examples/dotnet/costas_array/costas_array.cs
520	$(MAKE) run SOURCE=examples/dotnet/covering_opl/covering_opl.cs
521	$(MAKE) run SOURCE=examples/dotnet/crew/crew.cs
522	$(MAKE) run SOURCE=examples/dotnet/crossword/crossword.cs
523	$(MAKE) run SOURCE=examples/dotnet/crypta/crypta.cs
524	$(MAKE) run SOURCE=examples/dotnet/crypto/crypto.cs
525	$(MAKE) run SOURCE=examples/dotnet/cscvrptw/cscvrptw.cs
526	$(MAKE) run SOURCE=examples/dotnet/csflow/csflow.cs
527	$(MAKE) run SOURCE=examples/dotnet/csknapsack/csknapsack.cs
528	$(MAKE) run SOURCE=examples/dotnet/csls_api/csls_api.cs
529	$(MAKE) run SOURCE=examples/dotnet/csrabbitspheasants/csrabbitspheasants.cs
530	$(MAKE) run SOURCE=examples/dotnet/cstsp/cstsp.cs
531	$(MAKE) run SOURCE=examples/dotnet/curious_set_of_integers/curious_set_of_integers.cs
532	$(MAKE) run SOURCE=examples/dotnet/debruijn/debruijn.cs
533	$(MAKE) run SOURCE=examples/dotnet/csdiet/csdiet.cs
534	$(MAKE) run SOURCE=examples/dotnet/discrete_tomography/discrete_tomography.cs
535	$(MAKE) run SOURCE=examples/dotnet/divisible_by_9_through_1/divisible_by_9_through_1.cs
536	$(MAKE) run SOURCE=examples/dotnet/dudeney/dudeney.cs
537	$(MAKE) run SOURCE=examples/dotnet/einav_puzzle2/einav_puzzle2.cs
538	$(MAKE) run SOURCE=examples/dotnet/eq10/eq10.cs
539	$(MAKE) run SOURCE=examples/dotnet/eq20/eq20.cs
540	$(MAKE) run SOURCE=examples/dotnet/fill_a_pix/fill_a_pix.cs
541	$(MAKE) run SOURCE=examples/dotnet/furniture_moving/furniture_moving.cs
542	$(MAKE) run SOURCE=examples/dotnet/furniture_moving_intervals/furniture_moving_intervals.cs
543	$(MAKE) run SOURCE=examples/dotnet/futoshiki/futoshiki.cs
544	$(MAKE) run SOURCE=examples/dotnet/golomb_ruler/golomb_ruler.cs
545	$(MAKE) run SOURCE=examples/dotnet/grocery/grocery.cs
546	$(MAKE) run SOURCE=examples/dotnet/hidato_table/hidato_table.cs
547	$(MAKE) run SOURCE=examples/dotnet/just_forgotten/just_forgotten.cs
548	$(MAKE) run SOURCE=examples/dotnet/kakuro/kakuro.cs
549	$(MAKE) run SOURCE=examples/dotnet/kenken2/kenken2.cs
550	$(MAKE) run SOURCE=examples/dotnet/killer_sudoku/killer_sudoku.cs
551	$(MAKE) run SOURCE=examples/dotnet/labeled_dice/labeled_dice.cs
552	$(MAKE) run SOURCE=examples/dotnet/langford/langford.cs
553	$(MAKE) run SOURCE=examples/dotnet/least_diff/least_diff.cs
554	$(MAKE) run SOURCE=examples/dotnet/lectures/lectures.cs
555	$(MAKE) run SOURCE=examples/dotnet/magic_sequence/magic_sequence.cs
556	$(MAKE) run SOURCE=examples/dotnet/magic_square_and_cards/magic_square_and_cards.cs
557	$(MAKE) run SOURCE=examples/dotnet/magic_square/magic_square.cs
558	$(MAKE) run SOURCE=examples/dotnet/map2/map2.cs
559	$(MAKE) run SOURCE=examples/dotnet/map/map.cs
560	$(MAKE) run SOURCE=examples/dotnet/marathon2/marathon2.cs
561	$(MAKE) run SOURCE=examples/dotnet/max_flow_taha/max_flow_taha.cs
562	$(MAKE) run SOURCE=examples/dotnet/max_flow_winston1/max_flow_winston1.cs
563	$(MAKE) run SOURCE=examples/dotnet/minesweeper/minesweeper.cs
564	$(MAKE) run SOURCE=examples/dotnet/mr_smith/mr_smith.cs
565#	$(MAKE) run SOURCE=examples/dotnet/nontransitive_dice/nontransitive_dice.cs # too long
566	$(MAKE) run SOURCE=examples/dotnet/nqueens/nqueens.cs
567	$(MAKE) run SOURCE=examples/dotnet/nurse_rostering_regular/nurse_rostering_regular.cs
568	$(MAKE) run SOURCE=examples/dotnet/nurse_rostering_transition/nurse_rostering_transition.cs
569	$(MAKE) run SOURCE=examples/dotnet/olympic/olympic.cs
570	$(MAKE) run SOURCE=examples/dotnet/organize_day/organize_day.cs
571	$(MAKE) run SOURCE=examples/dotnet/organize_day_intervals/organize_day_intervals.cs
572	$(MAKE) run SOURCE=examples/dotnet/pandigital_numbers/pandigital_numbers.cs
573#	$(MAKE) run SOURCE=examples/dotnet/partition/partition.cs # too long
574	$(MAKE) run SOURCE=examples/dotnet/perfect_square_sequence/perfect_square_sequence.cs
575	$(MAKE) run SOURCE=examples/dotnet/photo_problem/photo_problem.cs
576	$(MAKE) run SOURCE=examples/dotnet/place_number_puzzle/place_number_puzzle.cs
577	$(MAKE) run SOURCE=examples/dotnet/p_median/p_median.cs
578	$(MAKE) run SOURCE=examples/dotnet/post_office_problem2/post_office_problem2.cs
579	$(MAKE) run SOURCE=examples/dotnet/quasigroup_completion/quasigroup_completion.cs
580	$(MAKE) run SOURCE=examples/dotnet/regex/regex.cs
581	$(MAKE) run SOURCE=examples/dotnet/rogo2/rogo2.cs
582	$(MAKE) run SOURCE=examples/dotnet/scheduling_speakers/scheduling_speakers.cs
583	$(MAKE) run SOURCE=examples/dotnet/secret_santa2/secret_santa2.cs
584#	$(MAKE) run SOURCE=examples/dotnet/secret_santa/secret_santa.cs # too long
585	$(MAKE) run SOURCE=examples/dotnet/send_more_money2/send_more_money2.cs
586	$(MAKE) run SOURCE=examples/dotnet/send_more_money/send_more_money.cs
587	$(MAKE) run SOURCE=examples/dotnet/send_most_money/send_most_money.cs
588	$(MAKE) run SOURCE=examples/dotnet/seseman/seseman.cs
589	$(MAKE) run SOURCE=examples/dotnet/set_covering2/set_covering2.cs
590	$(MAKE) run SOURCE=examples/dotnet/set_covering3/set_covering3.cs
591	$(MAKE) run SOURCE=examples/dotnet/set_covering4/set_covering4.cs
592	$(MAKE) run SOURCE=examples/dotnet/set_covering/set_covering.cs
593	$(MAKE) run SOURCE=examples/dotnet/set_covering_deployment/set_covering_deployment.cs
594	$(MAKE) run SOURCE=examples/dotnet/set_covering_skiena/set_covering_skiena.cs
595	$(MAKE) run SOURCE=examples/dotnet/set_partition/set_partition.cs
596	$(MAKE) run SOURCE=examples/dotnet/sicherman_dice/sicherman_dice.cs
597	$(MAKE) run SOURCE=examples/dotnet/ski_assignment/ski_assignment.cs
598	$(MAKE) run SOURCE=examples/dotnet/stable_marriage/stable_marriage.cs
599	$(MAKE) run SOURCE=examples/dotnet/strimko2/strimko2.cs
600	$(MAKE) run SOURCE=examples/dotnet/subset_sum/subset_sum.cs
601	$(MAKE) run SOURCE=examples/dotnet/sudoku/sudoku.cs
602	$(MAKE) run SOURCE=examples/dotnet/survo_puzzle/survo_puzzle.cs
603	$(MAKE) run SOURCE=examples/dotnet/to_num/to_num.cs
604	$(MAKE) run SOURCE=examples/dotnet/traffic_lights/traffic_lights.cs
605	$(MAKE) run SOURCE=examples/dotnet/volsay/volsay.cs
606	$(MAKE) run SOURCE=examples/dotnet/volsay2/volsay2.cs
607	$(MAKE) run SOURCE=examples/dotnet/volsay3/volsay3.cs
608	$(MAKE) run SOURCE=examples/dotnet/wedding_optimal_chart/wedding_optimal_chart.cs
609	$(MAKE) run SOURCE=examples/dotnet/who_killed_agatha/who_killed_agatha.cs
610	$(MAKE) run SOURCE=examples/dotnet/xkcd/xkcd.cs
611	$(MAKE) run SOURCE=examples/dotnet/young_tableaux/young_tableaux.cs
612	$(MAKE) run SOURCE=examples/dotnet/zebra/zebra.cs
613	$(MAKE) run SOURCE=examples/dotnet/fsintegerprogramming/fsintegerprogramming.fs
614	$(MAKE) run SOURCE=examples/dotnet/fslinearprogramming/fslinearprogramming.fs
615	$(MAKE) run SOURCE=examples/dotnet/fsdiet/fsdiet.fs
616	$(MAKE) run SOURCE=examples/dotnet/fsequality/fsequality.fs
617	$(MAKE) run SOURCE=examples/dotnet/fsequality-inequality/fsequality-inequality.fs
618	$(MAKE) run SOURCE=examples/dotnet/fsinteger-linear-program/fsinteger-linear-program.fs
619	$(MAKE) run SOURCE=examples/dotnet/fsknapsack/fsknapsack.fs
620	$(MAKE) run SOURCE=examples/dotnet/fsnetwork-max-flow/fsnetwork-max-flow.fs
621	$(MAKE) run SOURCE=examples/dotnet/fsnetwork-max-flow-lpSolve/fsnetwork-max-flow-lpSolve.fs
622	$(MAKE) run SOURCE=examples/dotnet/fsnetwork-min-cost-flow/fsnetwork-min-cost-flow.fs
623	$(MAKE) run SOURCE=examples/dotnet/fsProgram/fsProgram.fs
624	$(MAKE) run SOURCE=examples/dotnet/fsrabbit-pheasant/fsrabbit-pheasant.fs
625	$(MAKE) run SOURCE=examples/dotnet/fsvolsay3/fsvolsay3.fs
626	$(MAKE) run SOURCE=examples/dotnet/fsvolsay3-lpSolve/fsvolsay3-lpSolve.fs
627	$(MAKE) run SOURCE=examples/dotnet/fsvolsay/fsvolsay.fs
628#	$(MAKE) run SOURCE=examples/dotnet/word_square/word_square.cs # depends on /usr/share/dict/words
629
630test_dotnet: detect_dotnet
631	$(MAKE) run SOURCE=examples/dotnet/SimpleLpProgram/SimpleLpProgram.cs
632	$(MAKE) run SOURCE=examples/dotnet/SimpleMipProgram/SimpleMipProgram.cs
633	$(MAKE) run SOURCE=examples/dotnet/Tsp/Tsp.cs
634	$(MAKE) run SOURCE=examples/dotnet/Vrp/Vrp.cs
635	$(MAKE) run SOURCE=examples/dotnet/JobshopSat/JobshopSat.cs
636	$(MAKE) run SOURCE=examples/dotnet/NursesSat/NursesSat.cs
637	$(MAKE) run SOURCE=examples/dotnet/fsProgram/fsProgram.fs
638
639###################
640##  .NET SOURCE  ##
641###################
642# .Net C#
643ifeq ($(SOURCE_SUFFIX),.cs) # Those rules will be used if SOURCE contain a .cs file
644ifeq (,$(wildcard $(SOURCE)proj))
645$(error File "$(SOURCE)proj" does not exist !)
646endif
647
648.PHONY: build # Build a .Net C# program.
649build: $(SOURCE) $(SOURCE)proj
650	"$(DOTNET_BIN)" build $(SOURCE_PATH)proj
651
652.PHONY: run # Run a .Net C# program.
653run: build
654	"$(DOTNET_BIN)" run --no-build --framework net6.0 --project $(SOURCE_PATH)proj -- $(ARGS)
655endif # ifeq ($(SOURCE_SUFFIX),.cs)
656
657# .Net F#
658ifeq ($(SOURCE_SUFFIX),.fs) # Those rules will be used if SOURCE contain a .cs file
659ifeq (,$(wildcard $(SOURCE)proj))
660$(error File "$(SOURCE)proj" does not exist !)
661endif
662
663.PHONY: build # Build a .Net F# program.
664build: $(SOURCE) $(SOURCE)proj
665	"$(DOTNET_BIN)" build $(SOURCE_PATH)proj
666
667.PHONY: run # Run a .Net F# program.
668run: build
669	"$(DOTNET_BIN)" run --no-build --framework net6.0 --project $(SOURCE_PATH)proj -- $(ARGS)
670endif # ifeq ($(SOURCE_SUFFIX),.fs)
671
672endif # ifndef DOTNET_BIN
673
674.PHONY: detect_dotnet
675detect_dotnet:
676	@echo DOTNET_BIN = $(DOTNET_BIN)
677ifeq ($(SYSTEM),win)
678	@echo off & echo(
679else
680	@echo
681endif
682
683############
684##  MISC  ##
685############
686# Include user makefile
687-include Makefile.user
688
689print-%	: ; @echo $* = $($*)
690