1# ---------- dotnet support using SWIG ----------
2.PHONY: help_dotnet # Generate list of dotnet targets with descriptions.
3help_dotnet:
4	@echo Use one of the following dotnet targets:
5ifeq ($(SYSTEM),win)
6	@$(GREP) "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.dotnet.mk | $(SED) "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/"
7	@echo off & echo(
8else
9	@$(GREP) "^.PHONY: .* #" $(CURDIR)/makefiles/Makefile.dotnet.mk | $(SED) "s/\.PHONY: \(.*\) # \(.*\)/\1\t\2/" | expand -t20
10	@echo
11endif
12
13# Check for required build tools
14DOTNET = dotnet
15ifeq ($(SYSTEM),win)
16DOTNET_BIN := $(shell $(WHICH) $(DOTNET) 2> NUL)
17else # UNIX
18DOTNET_BIN := $(shell command -v $(DOTNET) 2> /dev/null)
19endif
20NUGET_BIN = "$(DOTNET_BIN)" nuget
21
22HAS_DOTNET = true
23ifndef DOTNET_BIN
24HAS_DOTNET =
25endif
26
27# Main target
28.PHONY: dotnet # Build all .NET OrTools packages
29.PHONY: test_dotnet # Run all test_dotnet_* targets
30.PHONY: package_dotnet # Build all .NET OrTools packages
31ifndef HAS_DOTNET
32dotnet:
33	@echo DOTNET_BIN = $(DOTNET_BIN)
34	$(warning Cannot find '$@' command which is needed for build. Please make sure it is installed and in system path.)
35check_dotnet: dotnet
36test_dotnet: dotnet
37package_dotnet: dotnet
38else
39dotnet: dotnet_csharp dotnet_fsharp
40check_dotnet: check_dotnet_pimpl
41test_dotnet: test_dotnet_pimpl
42package_dotnet: dotnet
43BUILT_LANGUAGES +=, dotnet \(net6.0\)
44endif
45
46# Detect RuntimeIDentifier
47ifeq ($(OS),Windows)
48DOTNET_RUNTIME_IDENTIFIER=win-x64
49else
50  ifeq ($(OS),Linux)
51  DOTNET_RUNTIME_IDENTIFIER=linux-x64
52  else
53    ifeq ($(OS),Darwin)
54    DOTNET_RUNTIME_IDENTIFIER=osx-x64
55    else
56    $(error OS unknown !)
57    endif
58  endif
59endif
60
61# All libraries and dependencies
62TEMP_DOTNET_DIR = temp_dotnet
63DOTNET_PACKAGE_DIR = temp_dotnet/packages
64DOTNET_PACKAGE_PATH = $(subst /,$S,$(DOTNET_PACKAGE_DIR))
65DOTNET_ORTOOLS_SNK := $(TEMP_DOTNET_DIR)/or-tools.snk
66DOTNET_ORTOOLS_SNK_PATH := $(subst /,$S,$(DOTNET_ORTOOLS_SNK))
67DOTNET_ORTOOLS_ASSEMBLY_NAME := Google.OrTools
68DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME := $(DOTNET_ORTOOLS_ASSEMBLY_NAME).runtime.$(DOTNET_RUNTIME_IDENTIFIER)
69DOTNET_ORTOOLS_NATIVE := google-ortools-native
70DOTNET_ORTOOLS_NUPKG := $(DOTNET_PACKAGE_DIR)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME).$(OR_TOOLS_VERSION).nupkg
71DOTNET_ORTOOLS_RUNTIME_NUPKG := $(DOTNET_PACKAGE_DIR)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).$(OR_TOOLS_VERSION).nupkg
72FSHARP_ORTOOLS_ASSEMBLY_NAME := $(DOTNET_ORTOOLS_ASSEMBLY_NAME).FSharp
73FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME := $(DOTNET_ORTOOLS_ASSEMBLY_NAME).FSharp.Tests
74FSHARP_ORTOOLS_NUPKG := $(DOTNET_PACKAGE_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME).$(OR_TOOLS_VERSION).nupkg
75NUGET_PACK_ARGS := -c Release
76DOTNET_BUILD_ARGS := -c Release /p:Platform=x64
77
78$(DOTNET_PACKAGE_DIR): | $(TEMP_DOTNET_DIR)
79	$(MKDIR_P) $(DOTNET_PACKAGE_PATH)
80
81######################
82##  RUNTIME CSHARP  ##
83######################
84.PHONY: dotnet_runtime # Build C# runtime OR-Tools
85dotnet_runtime: $(DOTNET_ORTOOLS_RUNTIME_NUPKG)
86
87###################################################################
88# Protobuf: generate C# cs files from proto specification files. ##
89###################################################################
90$(GEN_DIR)/ortools/constraint_solver/SearchLimit.pb.cs: \
91 $(SRC_DIR)/ortools/constraint_solver/search_limit.proto \
92 | $(GEN_DIR)/ortools/constraint_solver
93	$(PROTOC) --proto_path=$(SRC_DIR) \
94 --csharp_out=$(GEN_PATH)$Sortools$Sconstraint_solver \
95 --csharp_opt=file_extension=.pb.cs \
96 $(SRC_DIR)$Sortools$Sconstraint_solver$Ssearch_limit.proto
97
98$(GEN_DIR)/ortools/constraint_solver/SolverParameters.pb.cs: \
99 $(SRC_DIR)/ortools/constraint_solver/solver_parameters.proto \
100 | $(GEN_DIR)/ortools/constraint_solver
101	$(PROTOC) --proto_path=$(SRC_DIR) \
102 --csharp_out=$(GEN_PATH)$Sortools$Sconstraint_solver \
103 --csharp_opt=file_extension=.pb.cs \
104 $(SRC_DIR)$Sortools$Sconstraint_solver$Ssolver_parameters.proto
105
106$(GEN_DIR)/ortools/constraint_solver/RoutingParameters.pb.cs: \
107 $(SRC_DIR)/ortools/constraint_solver/routing_parameters.proto \
108 | $(GEN_DIR)/ortools/constraint_solver
109	$(PROTOC) --proto_path=$(SRC_DIR) \
110 --csharp_out=$(GEN_PATH)$Sortools$Sconstraint_solver \
111 --csharp_opt=file_extension=.pb.cs \
112 $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_parameters.proto
113
114$(GEN_DIR)/ortools/constraint_solver/RoutingEnums.pb.cs: \
115 $(SRC_DIR)/ortools/constraint_solver/routing_enums.proto \
116 | $(GEN_DIR)/ortools/constraint_solver
117	$(PROTOC) --proto_path=$(SRC_DIR) \
118 --csharp_out=$(GEN_PATH)$Sortools$Sconstraint_solver \
119 --csharp_opt=file_extension=.pb.cs \
120 $(SRC_DIR)$Sortools$Sconstraint_solver$Srouting_enums.proto
121
122$(GEN_DIR)/ortools/sat/CpModel.pb.cs: \
123 $(SRC_DIR)/ortools/sat/cp_model.proto \
124 | $(GEN_DIR)/ortools/sat
125	$(PROTOC) --proto_path=$(SRC_DIR) \
126 --csharp_out=$(GEN_PATH)$Sortools$Ssat \
127 --csharp_opt=file_extension=.pb.cs \
128 $(SRC_DIR)$Sortools$Ssat$Scp_model.proto
129
130$(GEN_DIR)/ortools/sat/SatParameters.pb.cs: \
131 $(SRC_DIR)/ortools/sat/sat_parameters.proto \
132 | $(GEN_DIR)/ortools/sat
133	$(PROTOC) --proto_path=$(SRC_DIR) \
134 --csharp_out=$(GEN_PATH)$Sortools$Ssat \
135 --csharp_opt=file_extension=.pb.cs \
136 $(SRC_DIR)$Sortools$Ssat$Ssat_parameters.proto
137
138$(GEN_DIR)/ortools/util/OptionalBoolean.pb.cs: \
139 $(SRC_DIR)/ortools/util/optional_boolean.proto \
140 | $(GEN_DIR)/ortools/util
141	$(PROTOC) --proto_path=$(SRC_DIR) \
142 --csharp_out=$(GEN_PATH)$Sortools$Sutil \
143 --csharp_opt=file_extension=.pb.cs \
144 $(SRC_DIR)$Sortools$Sutil$Soptional_boolean.proto
145
146#############################################################################################
147# Swig: Generate C# wrapper cs files from swig specification files and C wrapper .c files. ##
148#############################################################################################
149$(GEN_DIR)/ortools/linear_solver/linear_solver_csharp_wrap.cc: \
150 $(SRC_DIR)/ortools/linear_solver/csharp/linear_solver.i \
151 $(SRC_DIR)/ortools/base/base.i \
152 $(SRC_DIR)/ortools/util/csharp/proto.i \
153 $(GLOP_DEPS) \
154 $(LP_DEPS) \
155 | $(GEN_DIR)/ortools/linear_solver
156	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
157 -o $(GEN_PATH)$Sortools$Slinear_solver$Slinear_solver_csharp_wrap.cc \
158 -module operations_research_linear_solver \
159 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).LinearSolver \
160 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
161 -outdir $(GEN_PATH)$Sortools$Slinear_solver \
162 $(SRC_DIR)$Sortools$Slinear_solver$Scsharp$Slinear_solver.i
163
164$(OBJ_DIR)/swig/linear_solver_csharp_wrap.$O: \
165 $(GEN_DIR)/ortools/linear_solver/linear_solver_csharp_wrap.cc \
166 | $(OBJ_DIR)/swig
167	$(CCC) $(CFLAGS) \
168 -c $(GEN_PATH)$Sortools$Slinear_solver$Slinear_solver_csharp_wrap.cc \
169 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Slinear_solver_csharp_wrap.$O
170
171$(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.cc: \
172 $(SRC_DIR)/ortools/constraint_solver/csharp/routing.i \
173 $(SRC_DIR)/ortools/constraint_solver/csharp/constraint_solver.i \
174 $(SRC_DIR)/ortools/base/base.i \
175 $(SRC_DIR)/ortools/util/csharp/proto.i \
176 $(CP_DEPS) \
177 | $(GEN_DIR)/ortools/constraint_solver
178	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
179 -o $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.cc \
180 -module operations_research_constraint_solver \
181 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).ConstraintSolver \
182 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
183 -outdir $(GEN_PATH)$Sortools$Sconstraint_solver \
184 $(SRC_DIR)$Sortools$Sconstraint_solver$Scsharp$Srouting.i
185	$(SED) -i -e 's/CSharp_new_Solver/CSharp_new_CpSolver/g' \
186 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
187 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
188	$(SED) -i -e 's/CSharp_delete_Solver/CSharp_delete_CpSolver/g' \
189 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
190 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
191	$(SED) -i -e 's/CSharp_Solver/CSharp_CpSolver/g' \
192 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
193 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
194	$(SED) -i -e 's/CSharp_new_Constraint/CSharp_new_CpConstraint/g' \
195 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
196 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
197	$(SED) -i -e 's/CSharp_delete_Constraint/CSharp_delete_CpConstraint/g' \
198 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
199 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
200	$(SED) -i -e 's/CSharp_Constraint/CSharp_CpConstraint/g' \
201 $(GEN_PATH)$Sortools$Sconstraint_solver$S*cs \
202 $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.*
203
204
205$(OBJ_DIR)/swig/constraint_solver_csharp_wrap.$O: \
206 $(GEN_DIR)/ortools/constraint_solver/constraint_solver_csharp_wrap.cc \
207 | $(OBJ_DIR)/swig
208	$(CCC) $(CFLAGS) \
209 -c $(GEN_PATH)$Sortools$Sconstraint_solver$Sconstraint_solver_csharp_wrap.cc \
210 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sconstraint_solver_csharp_wrap.$O
211
212$(GEN_DIR)/ortools/algorithms/knapsack_solver_csharp_wrap.cc: \
213 $(SRC_DIR)/ortools/algorithms/csharp/knapsack_solver.i \
214 $(SRC_DIR)/ortools/base/base.i \
215 $(SRC_DIR)/ortools/util/csharp/proto.i \
216 $(SRC_DIR)/ortools/algorithms/knapsack_solver.h \
217 | $(GEN_DIR)/ortools/algorithms
218	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
219 -o $(GEN_PATH)$Sortools$Salgorithms$Sknapsack_solver_csharp_wrap.cc \
220 -module operations_research_algorithms \
221 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Algorithms \
222 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
223 -outdir $(GEN_PATH)$Sortools$Salgorithms \
224 $(SRC_DIR)$Sortools$Salgorithms$Scsharp$Sknapsack_solver.i
225
226
227$(OBJ_DIR)/swig/knapsack_solver_csharp_wrap.$O: \
228 $(GEN_DIR)/ortools/algorithms/knapsack_solver_csharp_wrap.cc \
229 | $(OBJ_DIR)/swig
230	$(CCC) $(CFLAGS) \
231 -c $(GEN_PATH)$Sortools$Salgorithms$Sknapsack_solver_csharp_wrap.cc \
232 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sknapsack_solver_csharp_wrap.$O
233
234$(GEN_DIR)/ortools/graph/graph_csharp_wrap.cc: \
235 $(SRC_DIR)/ortools/graph/csharp/graph.i \
236 $(SRC_DIR)/ortools/base/base.i \
237 $(SRC_DIR)/ortools/util/csharp/proto.i \
238 $(GRAPH_DEPS) \
239 | $(GEN_DIR)/ortools/graph $(GEN_DIR)/ortools/graph
240	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
241 -o $(GEN_PATH)$Sortools$Sgraph$Sgraph_csharp_wrap.cc \
242 -module operations_research_graph \
243 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Graph \
244 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
245 -outdir $(GEN_PATH)$Sortools$Sgraph \
246 $(SRC_DIR)$Sortools$Sgraph$Scsharp$Sgraph.i
247
248$(OBJ_DIR)/swig/graph_csharp_wrap.$O: \
249 $(GEN_DIR)/ortools/graph/graph_csharp_wrap.cc \
250 | $(OBJ_DIR)/swig
251	$(CCC) $(CFLAGS) \
252 -c $(GEN_PATH)$Sortools$Sgraph$Sgraph_csharp_wrap.cc \
253 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sgraph_csharp_wrap.$O
254
255$(GEN_DIR)/ortools/sat/sat_csharp_wrap.cc: \
256 $(SRC_DIR)/ortools/base/base.i \
257 $(SRC_DIR)/ortools/sat/csharp/sat.i \
258 $(SRC_DIR)/ortools/sat/swig_helper.h \
259 $(SAT_DEPS) \
260 | $(GEN_DIR)/ortools/sat $(GEN_DIR)/ortools/sat
261	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
262 -o $(GEN_PATH)$Sortools$Ssat$Ssat_csharp_wrap.cc \
263 -module operations_research_sat \
264 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Sat \
265 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
266 -outdir $(GEN_PATH)$Sortools$Ssat \
267 $(SRC_DIR)$Sortools$Ssat$Scsharp$Ssat.i
268
269$(OBJ_DIR)/swig/sat_csharp_wrap.$O: \
270 $(GEN_DIR)/ortools/sat/sat_csharp_wrap.cc \
271 | $(OBJ_DIR)/swig
272	$(CCC) $(CFLAGS) \
273 -c $(GEN_PATH)$Sortools$Ssat$Ssat_csharp_wrap.cc \
274 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssat_csharp_wrap.$O
275
276$(GEN_DIR)/ortools/init/init_csharp_wrap.cc: \
277 $(SRC_DIR)/ortools/base/base.i \
278 $(SRC_DIR)/ortools/init/csharp/init.i \
279 $(INIT_DEPS) \
280 |  $(GEN_DIR)/ortools/init
281	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
282 -o $(GEN_PATH)$Sortools$Sinit$Sinit_csharp_wrap.cc \
283 -module operations_research_init \
284 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Init \
285 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
286 -outdir $(GEN_PATH)$Sortools$Sinit \
287 $(SRC_DIR)$Sortools$Sinit$Scsharp$Sinit.i
288
289$(OBJ_DIR)/swig/init_csharp_wrap.$O: \
290 $(GEN_DIR)/ortools/init/init_csharp_wrap.cc \
291 | $(OBJ_DIR)/swig
292	$(CCC) $(CFLAGS) \
293 -c $(GEN_PATH)$Sortools$Sinit$Sinit_csharp_wrap.cc \
294 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sinit_csharp_wrap.$O
295
296$(GEN_DIR)/ortools/util/sorted_interval_list_csharp_wrap.cc: \
297 $(SRC_DIR)/ortools/base/base.i \
298 $(SRC_DIR)/ortools/util/csharp/sorted_interval_list.i \
299 $(SRC_DIR)/ortools/util/csharp/proto.i \
300 $(UTIL_DEPS) \
301 |  $(GEN_DIR)/ortools/util
302	$(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \
303 -o $(GEN_PATH)$Sortools$Sutil$Ssorted_interval_list_csharp_wrap.cc \
304 -module operations_research_util \
305 -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Util \
306 -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \
307 -outdir $(GEN_PATH)$Sortools$Sutil \
308 $(SRC_DIR)$Sortools$Sutil$Scsharp$Ssorted_interval_list.i
309
310$(OBJ_DIR)/swig/sorted_interval_list_csharp_wrap.$O: \
311 $(GEN_DIR)/ortools/util/sorted_interval_list_csharp_wrap.cc \
312 | $(OBJ_DIR)/swig
313	$(CCC) $(CFLAGS) \
314 -c $(GEN_PATH)$Sortools$Sutil$Ssorted_interval_list_csharp_wrap.cc \
315 $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssorted_interval_list_csharp_wrap.$O
316
317###################
318##  .NET SOURCE  ##
319###################
320# .Net C#
321ifeq ($(SOURCE_SUFFIX),.cs) # Those rules will be used if SOURCE contain a .cs file
322
323SOURCE_PROJECT_DIR := $(SOURCE)
324SOURCE_PROJECT_DIR := $(subst /$(SOURCE_NAME).cs,, $(SOURCE_PROJECT_DIR))
325SOURCE_PROJECT_PATH = $(subst /,$S,$(SOURCE_PROJECT_DIR))
326
327.PHONY: build # Build a .Net C# program.
328build: $(SOURCE) $(SOURCE)proj $(DOTNET_ORTOOLS_NUPKG)
329	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" build -c Release $(ARGS)
330	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" pack -c Release
331
332.PHONY: run # Run a .Net C# program (using 'dotnet run').
333run: build
334	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" run --no-build -c Release $(ARGS)
335
336.PHONY: run_test # Run a .Net C# program (using 'dotnet test').
337run_test: build
338	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" test --no-build -c Release $(ARGS)
339endif
340
341# .Net F#
342ifeq ($(SOURCE_SUFFIX),.fs) # Those rules will be used if SOURCE contain a .cs file
343
344SOURCE_PROJECT_DIR := $(SOURCE)
345SOURCE_PROJECT_DIR := $(subst /$(SOURCE_NAME).fs,, $(SOURCE_PROJECT_DIR))
346SOURCE_PROJECT_PATH = $(subst /,$S,$(SOURCE_PROJECT_DIR))
347
348.PHONY: build # Build a .Net F# program (using 'dotnet test').
349build: $(SOURCE) $(SOURCE)proj $(FSHARP_ORTOOLS_NUPKG)
350	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" build -c Release
351	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" pack -c Release
352
353.PHONY: run # Run a .Net F# program (using 'dotnet test').
354run: build
355	cd $(SOURCE_PROJECT_PATH) && "$(DOTNET_BIN)" run --no-build -c Release $(ARGS)
356endif
357
358###################
359## Nuget package ##
360###################
361$(TEMP_DOTNET_DIR):
362	$(MKDIR) $(TEMP_DOTNET_DIR)
363
364############
365# Signing ##
366############
367ifneq ($(DOTNET_SNK),)
368$(DOTNET_ORTOOLS_SNK):
369	$(COPY) $(DOTNET_SNK) $(DOTNET_ORTOOLS_SNK_PATH)
370else
371$(DOTNET_ORTOOLS_SNK): ortools/dotnet/CreateSigningKey/CreateSigningKey.csproj
372	"$(DOTNET_BIN)" run --project ortools$Sdotnet$SCreateSigningKey$SCreateSigningKey.csproj $S$(DOTNET_ORTOOLS_SNK_PATH)
373endif
374
375#########################
376# .Net Runtime Package ##
377#########################
378$(LIB_DIR)/$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX): \
379 $(OR_TOOLS_LIBS) \
380 $(OBJ_DIR)/swig/init_csharp_wrap.$O \
381 $(OBJ_DIR)/swig/linear_solver_csharp_wrap.$O \
382 $(OBJ_DIR)/swig/sat_csharp_wrap.$O \
383 $(OBJ_DIR)/swig/constraint_solver_csharp_wrap.$O \
384 $(OBJ_DIR)/swig/knapsack_solver_csharp_wrap.$O \
385 $(OBJ_DIR)/swig/graph_csharp_wrap.$O \
386 $(OBJ_DIR)/swig/sorted_interval_list_csharp_wrap.$O \
387 | $(LIB_DIR)
388	$(DYNAMIC_LD) \
389 $(LD_OUT)$(LIB_DIR)$S$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX) \
390 $(OBJ_DIR)$Sswig$Sinit_csharp_wrap.$O \
391 $(OBJ_DIR)$Sswig$Sknapsack_solver_csharp_wrap.$O \
392 $(OBJ_DIR)$Sswig$Sgraph_csharp_wrap.$O \
393 $(OBJ_DIR)$Sswig$Slinear_solver_csharp_wrap.$O \
394 $(OBJ_DIR)$Sswig$Ssat_csharp_wrap.$O \
395 $(OBJ_DIR)$Sswig$Sconstraint_solver_csharp_wrap.$O \
396 $(OBJ_DIR)$Sswig$Ssorted_interval_list_csharp_wrap.$O \
397 $(OR_TOOLS_LNK) \
398 $(OR_TOOLS_LDFLAGS)
399
400$(TEMP_DOTNET_DIR)/orLogo.png: $(SRC_DIR)/tools/doc/orLogo.png | $(TEMP_DOTNET_DIR)
401	$(COPY) $(SRC_DIR)$Stools$Sdoc$SorLogo.png $(TEMP_DOTNET_DIR)$SorLogo.png
402
403$(TEMP_DOTNET_DIR)/Directory.Build.props: \
404 $(SRC_DIR)/ortools/dotnet/Directory.Build.props.in | $(TEMP_DOTNET_DIR)
405	$(COPY) $(SRC_DIR)$Sortools$Sdotnet$SDirectory.Build.props.in $(TEMP_DOTNET_DIR)$SDirectory.Build.props
406	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/..\/packages/g' $(TEMP_DOTNET_DIR)$SDirectory.Build.props
407	$(SED) -i -e 's/@DOTNET_LOGO_DIR@/..\//g' $(TEMP_DOTNET_DIR)$SDirectory.Build.props
408
409$(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME): | $(TEMP_DOTNET_DIR)
410	$(MKDIR_P) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)
411
412$(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj: \
413 $(SRC_DIR)/ortools/dotnet/$(DOTNET_ORTOOLS_ASSEMBLY_NAME).runtime.csproj.in | $(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)
414	$(SED) -e "s/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/" ortools$Sdotnet$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).runtime.csproj.in > \
415 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
416	$(SED) -i -e 's/@RUNTIME_IDENTIFIER@/$(DOTNET_RUNTIME_IDENTIFIER)/' \
417 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
418	$(SED) -i -e 's/@DOTNET_NATIVE_PROJECT@/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)/' \
419 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
420	$(SED) -i -e 's/$$<TARGET_FILE:google-ortools-native>/..\/..\/lib\/$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX)/' \
421 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
422ifeq ($(SYSTEM),win)
423	$(SED) -i -e 's/$$<$$<STREQUAL.*@PROJECT_NAME@>>//' \
424 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
425else
426	$(SED) -i -e 's/$$<$$<STREQUAL.*@PROJECT_NAME@>>/;..\/..\/lib\/$(LIB_PREFIX)ortools.$L/' \
427 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
428endif
429
430
431$(DOTNET_ORTOOLS_RUNTIME_NUPKG): \
432 $(LIB_DIR)/$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX) \
433 $(TEMP_DOTNET_DIR)/Directory.Build.props \
434 $(TEMP_DOTNET_DIR)/orLogo.png \
435 $(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)/$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj \
436 $(SRC_DIR)/ortools/constraint_solver/csharp/IntVarArrayHelper.cs \
437 $(SRC_DIR)/ortools/constraint_solver/csharp/IntervalVarArrayHelper.cs \
438 $(SRC_DIR)/ortools/constraint_solver/csharp/IntArrayHelper.cs \
439 $(SRC_DIR)/ortools/constraint_solver/csharp/NetDecisionBuilder.cs \
440 $(SRC_DIR)/ortools/constraint_solver/csharp/SolverHelper.cs \
441 $(SRC_DIR)/ortools/constraint_solver/csharp/ValCstPair.cs \
442 $(SRC_DIR)/ortools/linear_solver/csharp/LinearExpr.cs \
443 $(SRC_DIR)/ortools/linear_solver/csharp/LinearConstraint.cs \
444 $(SRC_DIR)/ortools/linear_solver/csharp/SolverHelper.cs \
445 $(SRC_DIR)/ortools/linear_solver/csharp/VariableHelper.cs \
446 $(SRC_DIR)/ortools/sat/csharp/Constraints.cs \
447 $(SRC_DIR)/ortools/sat/csharp/CpModel.cs \
448 $(SRC_DIR)/ortools/sat/csharp/CpSolver.cs \
449 $(SRC_DIR)/ortools/sat/csharp/IntegerExpressions.cs \
450 $(SRC_DIR)/ortools/sat/csharp/IntervalVariables.cs \
451 $(SRC_DIR)/ortools/sat/csharp/SearchHelpers.cs \
452 $(SRC_DIR)/ortools/util/csharp/NestedArrayHelper.cs \
453 $(SRC_DIR)/ortools/util/csharp/ProtoHelper.cs \
454 $(GEN_DIR)/ortools/constraint_solver/SearchLimit.pb.cs \
455 $(GEN_DIR)/ortools/constraint_solver/SolverParameters.pb.cs \
456 $(GEN_DIR)/ortools/constraint_solver/RoutingParameters.pb.cs \
457 $(GEN_DIR)/ortools/constraint_solver/RoutingEnums.pb.cs \
458 $(GEN_DIR)/ortools/sat/CpModel.pb.cs \
459 $(GEN_DIR)/ortools/sat/SatParameters.pb.cs \
460 $(GEN_DIR)/ortools/util/OptionalBoolean.pb.cs \
461 | $(DOTNET_ORTOOLS_SNK) $(DOTNET_PACKAGE_DIR)
462	"$(DOTNET_BIN)" build $(DOTNET_BUILD_ARGS) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
463	"$(DOTNET_BIN)" pack $(NUGET_PACK_ARGS) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME).csproj
464
465####################
466##  .Net Package  ##
467####################
468.PHONY: dotnet_csharp # Build C# OR-Tools
469dotnet_csharp: $(DOTNET_ORTOOLS_NUPKG)
470
471$(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME): | $(TEMP_DOTNET_DIR)
472	$(MKDIR_P) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)
473
474#  create csproj for managed project
475$(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj: \
476 $(SRC_DIR)/ortools/dotnet/$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj.in | $(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME)
477	$(SED) -e "s/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/" \
478 ortools$Sdotnet$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj.in > \
479 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
480	$(SED) -i -e 's/@DOTNET_PROJECT@/$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
481 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
482	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/..\/packages/' \
483 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
484	$(SED) -i -e 's/@DOTNET_PROJECT_DIR@/..\/..\/ortools\/gen/' \
485 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
486	$(SED) -i -e 's/@PROJECT_SOURCE_DIR@/..\/../' \
487 $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
488
489# Pack managed project nuget
490$(DOTNET_ORTOOLS_NUPKG): \
491 $(DOTNET_ORTOOLS_RUNTIME_NUPKG) \
492 $(TEMP_DOTNET_DIR)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj \
493 | $(DOTNET_ORTOOLS_SNK) $(DOTNET_PACKAGE_DIR)
494	"$(DOTNET_BIN)" build $(DOTNET_BUILD_ARGS) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
495	"$(DOTNET_BIN)" pack $(NUGET_PACK_ARGS) $(TEMP_DOTNET_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
496
497##############
498##  FSHARP  ##
499##############
500.PHONY: dotnet_fsharp # Build F# OR-Tools
501dotnet_fsharp: $(FSHARP_ORTOOLS_NUPKG)
502
503$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME): | $(TEMP_DOTNET_DIR)
504	$(MKDIR_P) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)
505
506$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/OrTools.fs: \
507 $(SRC_DIR)/ortools/dotnet/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/OrTools.fs | $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)
508	$(COPY) $(SRC_DIR)$Sortools$Sdotnet$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$SOrTools.fs $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$SOrTools.fs
509
510# create fsproj
511$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj: \
512 $(SRC_DIR)/ortools/dotnet/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj.in | $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)
513	$(SED) -e "s/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/" \
514 ortools$Sdotnet$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj.in > \
515 $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj
516	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/..\/packages/' \
517 $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj
518
519# build and pack nuget
520$(FSHARP_ORTOOLS_NUPKG): \
521 $(DOTNET_ORTOOLS_NUPKG) \
522 $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj \
523 $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_ASSEMBLY_NAME)/OrTools.fs \
524 | $(DOTNET_ORTOOLS_SNK) $(DOTNET_PACKAGE_DIR)
525	"$(DOTNET_BIN)" build $(DOTNET_BUILD_ARGS) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj
526	"$(DOTNET_BIN)" pack $(NUGET_PACK_ARGS) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj
527
528# create test fsproj
529$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME): | $(TEMP_DOTNET_DIR)
530	$(MKDIR_P) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)
531
532$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/%.fs: \
533 $(SRC_DIR)/ortools/dotnet/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/%.fs | $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)
534	$(COPY) $(SRC_DIR)$Sortools$Sdotnet$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$*.fs $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$*.fs
535
536$(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj: \
537 ortools/dotnet/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj.in | $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)
538	$(SED) -e "s/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/" \
539 ortools$Sdotnet$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj.in > \
540 $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj
541	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/..\/packages/' \
542 $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj
543
544.PHONY: test_dotnet_fsharp # Run F# OrTools Tests
545test_dotnet_fsharp: $(FSHARP_ORTOOLS_NUPKG) \
546 $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj \
547 $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/Program.fs \
548 $(TEMP_DOTNET_DIR)/$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)/Tests.fs
549	"$(DOTNET_BIN)" build $(DOTNET_BUILD_ARGS) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME).fsproj
550	"$(DOTNET_BIN)" test $(DOTNET_BUILD_ARGS) $(TEMP_DOTNET_DIR)$S$(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)
551
552#############################
553##  .NET Examples/Samples  ##
554#############################
555DOTNET_SAMPLES := algorithms graph constraint_solver linear_solver sat
556
557define dotnet-sample-target =
558$$(TEMP_DOTNET_DIR)/$1: | $$(TEMP_DOTNET_DIR)
559	-$$(MKDIR) $$(TEMP_DOTNET_DIR)$$S$1
560
561$$(TEMP_DOTNET_DIR)/$1/%: \
562 $$(SRC_DIR)/ortools/$1/samples/%.cs \
563 | $$(TEMP_DOTNET_DIR)/$1
564	-$$(MKDIR) $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
565
566$$(TEMP_DOTNET_DIR)/$1/%/%.csproj: \
567 $${SRC_DIR}/ortools/dotnet/Sample.csproj.in \
568 | $$(TEMP_DOTNET_DIR)/$1/%
569	$$(SED) -e "s/@DOTNET_PACKAGES_DIR@/..\/..\/packages/" \
570 ortools$$Sdotnet$$SSample.csproj.in \
571 > $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
572	$$(SED) -i -e 's/@DOTNET_PROJECT@/$$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
573 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
574	$$(SED) -i -e 's/@SAMPLE_NAME@/$$*/' \
575 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
576	$$(SED) -i -e 's/@PROJECT_VERSION@/$$(OR_TOOLS_VERSION)/' \
577 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
578	$$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$$(OR_TOOLS_MAJOR)/' \
579 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
580	$$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$$(OR_TOOLS_MINOR)/' \
581 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
582	$$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$$(GIT_REVISION)/' \
583 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
584	$$(SED) -i -e 's/@FILE_NAME@/$$*.cs/' \
585 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
586
587$$(TEMP_DOTNET_DIR)/$1/%/%.cs: \
588 $$(SRC_DIR)/ortools/$1/samples/%.cs \
589 | $$(TEMP_DOTNET_DIR)/$1/%
590	$$(COPY) $$(SRC_DIR)$$Sortools$$S$1$$Ssamples$$S$$*.cs \
591 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
592
593rdotnet_%: \
594 $(DOTNET_ORTOOLS_NUPKG) \
595 $$(TEMP_DOTNET_DIR)/$1/%/%.csproj \
596 $$(TEMP_DOTNET_DIR)/$1/%/%.cs \
597 FORCE
598	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" build -c Release
599	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" run --no-build --framework net6.0 -c Release $$(ARGS)
600endef
601
602$(foreach sample,$(DOTNET_SAMPLES),$(eval $(call dotnet-sample-target,$(sample))))
603
604DOTNET_EXAMPLES := contrib dotnet
605
606define dotnet-example-target =
607$$(TEMP_DOTNET_DIR)/$1: | $$(TEMP_DOTNET_DIR)
608	-$$(MKDIR) $$(TEMP_DOTNET_DIR)$$S$1
609
610$$(TEMP_DOTNET_DIR)/$1/%: \
611 $$(SRC_DIR)/examples/$1/%.cs \
612 | $$(TEMP_DOTNET_DIR)/$1
613	-$$(MKDIR) $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
614
615$$(TEMP_DOTNET_DIR)/$1/%/%.csproj: \
616 $${SRC_DIR}/ortools/dotnet/Sample.csproj.in \
617 | $$(TEMP_DOTNET_DIR)/$1/%
618	$$(SED) -e "s/@DOTNET_PACKAGES_DIR@/..\/..\/packages/" \
619 ortools$$Sdotnet$$SSample.csproj.in \
620 > $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
621	$$(SED) -i -e 's/@DOTNET_PROJECT@/$$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
622 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
623	$$(SED) -i -e 's/@SAMPLE_NAME@/$$*/' \
624 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
625	$$(SED) -i -e 's/@PROJECT_VERSION@/$$(OR_TOOLS_VERSION)/' \
626 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
627	$$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$$(OR_TOOLS_MAJOR)/' \
628 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
629	$$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$$(OR_TOOLS_MINOR)/' \
630 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
631	$$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$$(GIT_REVISION)/' \
632 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
633	$$(SED) -i -e 's/@FILE_NAME@/$$*.cs/' \
634 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.csproj
635
636$$(TEMP_DOTNET_DIR)/$1/%/%.cs: \
637 $$(SRC_DIR)/examples/$1/%.cs \
638 | $$(TEMP_DOTNET_DIR)/$1/%
639	$$(COPY) $$(SRC_DIR)$$Sexamples$$S$1$$S$$*.cs \
640 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
641
642rdotnet_%: \
643 $(DOTNET_ORTOOLS_NUPKG) \
644 $$(TEMP_DOTNET_DIR)/$1/%/%.csproj \
645 $$(TEMP_DOTNET_DIR)/$1/%/%.cs \
646 FORCE
647	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" build -c Release
648	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" run --no-build --framework net6.0 -c Release $$(ARGS)
649endef
650
651$(foreach example,$(DOTNET_EXAMPLES),$(eval $(call dotnet-example-target,$(example))))
652
653DOTNET_TESTS := tests
654
655$(TEMP_DOTNET_DIR)/tests: | $(TEMP_DOTNET_DIR)
656	-$(MKDIR) $(TEMP_DOTNET_DIR)$Stests
657
658$(TEMP_DOTNET_DIR)/tests/%: \
659 $(SRC_DIR)/examples/tests/%.cs \
660 | $(TEMP_DOTNET_DIR)/tests
661	-$(MKDIR) $(TEMP_DOTNET_DIR)$Stests$S$*
662
663$(TEMP_DOTNET_DIR)/tests/%/%.csproj: \
664 ${SRC_DIR}/ortools/dotnet/Test.csproj.in \
665 | $(TEMP_DOTNET_DIR)/tests/%
666	$(SED) -e "s/@DOTNET_PACKAGES_DIR@/..\/..\/packages/" \
667 ortools$Sdotnet$STest.csproj.in \
668 > $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
669	$(SED) -i -e 's/@DOTNET_PROJECT@/$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
670 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
671	$(SED) -i -e 's/@TEST_NAME@/$*/' \
672 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
673	$(SED) -i -e 's/@PROJECT_VERSION@/$(OR_TOOLS_VERSION)/' \
674 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
675	$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$(OR_TOOLS_MAJOR)/' \
676 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
677	$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$(OR_TOOLS_MINOR)/' \
678 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
679	$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$(GIT_REVISION)/' \
680 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
681	$(SED) -i -e 's/@DOTNET_PROJECT@/$(DOTNET_ORTOOLS_PROJECT)/' \
682 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
683	$(SED) -i -e 's/@FILE_NAME@/$*.cs/' \
684 $(TEMP_DOTNET_DIR)$Stests$S$*$S$*.csproj
685
686$(TEMP_DOTNET_DIR)/tests/%/%.cs: \
687 $(SRC_DIR)/examples/tests/%.cs \
688 | $(TEMP_DOTNET_DIR)/tests/%
689	$(COPY) $(SRC_DIR)$Sexamples$Stests$S$*.cs \
690 $(TEMP_DOTNET_DIR)$Stests$S$*
691
692rdotnet_%: \
693 $(DOTNET_ORTOOLS_NUPKG) \
694 $(TEMP_DOTNET_DIR)/tests/%/%.cs \
695 $(TEMP_DOTNET_DIR)/tests/%/%.csproj \
696 FORCE
697	cd $(TEMP_DOTNET_DIR)$Stests$S$* && "$(DOTNET_BIN)" build -c Release
698	cd $(TEMP_DOTNET_DIR)$Stests$S$* && "$(DOTNET_BIN)" test --no-build -c Release $(ARGS)
699
700DOTNET_FS_EXAMPLES := contrib dotnet
701
702define dotnet-fs-example-target =
703$$(TEMP_DOTNET_DIR)/$1/%: \
704 $$(SRC_DIR)/examples/$1/%.fs \
705 | $$(TEMP_DOTNET_DIR)/$1
706	-$$(MKDIR) $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
707
708$$(TEMP_DOTNET_DIR)/$1/%/%.fsproj: \
709 $${SRC_DIR}/ortools/dotnet/Sample.fsproj.in \
710 | $$(TEMP_DOTNET_DIR)/$1/%
711	$$(SED) -e "s/@DOTNET_PACKAGES_DIR@/..\/..\/packages/" \
712 ortools$$Sdotnet$$SSample.fsproj.in \
713 > $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
714	$$(SED) -i -e 's/@DOTNET_PROJECT@/$$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
715 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
716	$$(SED) -i -e 's/@SAMPLE_NAME@/$$*/' \
717 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
718	$$(SED) -i -e 's/@PROJECT_VERSION@/$$(OR_TOOLS_VERSION)/' \
719 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
720	$$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$$(OR_TOOLS_MAJOR)/' \
721 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
722	$$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$$(OR_TOOLS_MINOR)/' \
723 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
724	$$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$$(GIT_REVISION)/' \
725 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
726	$$(SED) -i -e 's/@FILE_NAME@/$$*.fs/' \
727 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*$$S$$*.fsproj
728
729$$(TEMP_DOTNET_DIR)/$1/%/%.fs: \
730 $$(SRC_DIR)/examples/$1/%.fs \
731 | $$(TEMP_DOTNET_DIR)/$1/%
732	$$(COPY) $$(SRC_DIR)$$Sexamples$$S$1$$S$$*.fs \
733 $$(TEMP_DOTNET_DIR)$$S$1$$S$$*
734
735rdotnet_%: \
736 $(FSHARP_ORTOOLS_NUPKG) \
737 $$(TEMP_DOTNET_DIR)/$1/%/%.fsproj \
738 $$(TEMP_DOTNET_DIR)/$1/%/%.fs \
739 FORCE
740	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" build -c Release
741	cd $$(TEMP_DOTNET_DIR)$$S$1$$S$$* && "$$(DOTNET_BIN)" run --no-build --framework net6.0 -c Release $$(ARGS)
742endef
743
744$(foreach example,$(DOTNET_FS_EXAMPLES),$(eval $(call dotnet-fs-example-target,$(example))))
745
746#############################
747##  .NET Examples/Samples  ##
748#############################
749.PHONY: test_dotnet_algorithms_samples # Build and Run all .Net LP Samples (located in ortools/algorithms/samples)
750test_dotnet_algorithms_samples: \
751	rdotnet_Knapsack
752
753.PHONY: test_dotnet_constraint_solver_samples # Build and Run all .Net CP Samples (located in ortools/constraint_solver/samples)
754test_dotnet_constraint_solver_samples: \
755	rdotnet_SimpleCpProgram \
756	rdotnet_SimpleRoutingProgram \
757	rdotnet_Tsp \
758	rdotnet_TspCities \
759	rdotnet_TspCircuitBoard \
760	rdotnet_TspDistanceMatrix \
761	rdotnet_Vrp \
762	rdotnet_VrpBreaks \
763	rdotnet_VrpCapacity \
764	rdotnet_VrpDropNodes \
765	rdotnet_VrpGlobalSpan \
766	rdotnet_VrpInitialRoutes \
767	rdotnet_VrpPickupDelivery \
768	rdotnet_VrpPickupDeliveryFifo \
769	rdotnet_VrpPickupDeliveryLifo \
770	rdotnet_VrpResources \
771	rdotnet_VrpStartsEnds \
772	rdotnet_VrpTimeWindows \
773	rdotnet_VrpWithTimeLimit
774
775.PHONY: test_dotnet_graph_samples # Build and Run all .Net LP Samples (located in ortools/graph/samples)
776test_dotnet_graph_samples: \
777	rdotnet_SimpleMaxFlowProgram \
778	rdotnet_SimpleMinCostFlowProgram \
779
780.PHONY: test_dotnet_linear_solver_samples # Build and Run all .Net LP Samples (located in ortools/linear_solver/samples)
781test_dotnet_linear_solver_samples: \
782	rdotnet_AssignmentMip \
783	rdotnet_BasicExample \
784	rdotnet_BinPackingMip \
785	rdotnet_LinearProgrammingExample \
786	rdotnet_MipVarArray \
787	rdotnet_MultipleKnapsackMip \
788	rdotnet_SimpleLpProgram \
789	rdotnet_SimpleMipProgram \
790	rdotnet_StiglerDiet
791
792.PHONY: test_dotnet_sat_samples # Build and Run all .Net SAT Samples (located in ortools/sat/samples)
793test_dotnet_sat_samples: \
794	rdotnet_AssignmentSat \
795	rdotnet_AssumptionsSampleSat \
796	rdotnet_BinPackingProblemSat \
797	rdotnet_BoolOrSampleSat \
798	rdotnet_ChannelingSampleSat \
799	rdotnet_CpIsFunSat \
800	rdotnet_EarlinessTardinessCostSampleSat \
801	rdotnet_IntervalSampleSat \
802	rdotnet_LiteralSampleSat \
803	rdotnet_NoOverlapSampleSat \
804	rdotnet_OptionalIntervalSampleSat \
805	rdotnet_RabbitsAndPheasantsSat \
806	rdotnet_RankingSampleSat \
807	rdotnet_ReifiedSampleSat \
808	rdotnet_SearchForAllSolutionsSampleSat \
809	rdotnet_SimpleSatProgram \
810	rdotnet_SolutionHintingSampleSat \
811	rdotnet_SolveAndPrintIntermediateSolutionsSampleSat \
812	rdotnet_SolveWithTimeLimitSampleSat \
813	rdotnet_StepFunctionSampleSat \
814	rdotnet_StopAfterNSolutionsSampleSat
815
816.PHONY: check_dotnet_pimpl
817check_dotnet_pimpl: \
818 test_dotnet_algorithms_samples \
819 test_dotnet_constraint_solver_samples \
820 test_dotnet_graph_samples \
821 test_dotnet_linear_solver_samples \
822 test_dotnet_sat_samples \
823
824.PHONY: test_dotnet_tests # Build and Run all .Net Tests (located in examples/test)
825test_dotnet_tests: \
826	rdotnet_LinearSolverTests \
827	rdotnet_ConstraintSolverTests \
828	rdotnet_RoutingSolverTests \
829	rdotnet_SatSolverTests \
830	rdotnet_issue18 \
831	rdotnet_issue22 \
832	rdotnet_issue33
833
834.PHONY: test_dotnet_contrib # Build and Run all .Net Examples (located in examples/contrib)
835test_dotnet_contrib: \
836	rdotnet_3_jugs_regular \
837	rdotnet_a_puzzle \
838	rdotnet_a_round_of_golf \
839	rdotnet_all_interval \
840	rdotnet_alldifferent_except_0 \
841	rdotnet_assignment \
842	rdotnet_broken_weights \
843	rdotnet_bus_schedule \
844	rdotnet_circuit \
845	rdotnet_circuit2 \
846	rdotnet_coins3 \
847	rdotnet_combinatorial_auction2 \
848	rdotnet_contiguity_regular \
849	rdotnet_contiguity_transition \
850	rdotnet_costas_array \
851	rdotnet_covering_opl \
852	rdotnet_crew \
853	rdotnet_crossword \
854	rdotnet_crypta \
855	rdotnet_crypto \
856	rdotnet_csdiet \
857	rdotnet_curious_set_of_integers \
858	rdotnet_debruijn \
859	rdotnet_discrete_tomography \
860	rdotnet_divisible_by_9_through_1 \
861	rdotnet_dudeney \
862	rdotnet_einav_puzzle2 \
863	rdotnet_eq10 \
864	rdotnet_eq20 \
865	rdotnet_fill_a_pix \
866	rdotnet_furniture_moving \
867	rdotnet_futoshiki \
868	rdotnet_golomb_ruler \
869	rdotnet_grocery \
870	rdotnet_hidato_table \
871	rdotnet_just_forgotten \
872	rdotnet_kakuro \
873	rdotnet_kenken2 \
874	rdotnet_killer_sudoku \
875	rdotnet_labeled_dice \
876	rdotnet_langford \
877	rdotnet_least_diff \
878	rdotnet_lectures \
879	rdotnet_magic_sequence \
880	rdotnet_magic_square \
881	rdotnet_magic_square_and_cards \
882	rdotnet_map \
883	rdotnet_map2 \
884	rdotnet_marathon2 \
885	rdotnet_max_flow_taha \
886	rdotnet_max_flow_winston1 \
887	rdotnet_minesweeper \
888	rdotnet_mr_smith \
889	rdotnet_nqueens \
890	rdotnet_nurse_rostering_regular \
891	rdotnet_nurse_rostering_transition \
892	rdotnet_olympic \
893	rdotnet_organize_day \
894	rdotnet_p_median \
895	rdotnet_pandigital_numbers \
896	rdotnet_perfect_square_sequence \
897	rdotnet_photo_problem \
898	rdotnet_place_number_puzzle \
899	rdotnet_post_office_problem2 \
900	rdotnet_quasigroup_completion \
901	rdotnet_regex \
902	rdotnet_rogo2 \
903	rdotnet_scheduling_speakers \
904	rdotnet_secret_santa2 \
905	rdotnet_send_more_money \
906	rdotnet_send_more_money2 \
907	rdotnet_send_most_money \
908	rdotnet_seseman \
909	rdotnet_set_covering \
910	rdotnet_set_covering2 \
911	rdotnet_set_covering3 \
912	rdotnet_set_covering4 \
913	rdotnet_set_covering_deployment \
914	rdotnet_set_covering_skiena \
915	rdotnet_set_partition \
916	rdotnet_sicherman_dice \
917	rdotnet_ski_assignment \
918	rdotnet_stable_marriage \
919	rdotnet_strimko2 \
920	rdotnet_subset_sum \
921	rdotnet_sudoku \
922	rdotnet_survo_puzzle \
923	rdotnet_to_num \
924	rdotnet_traffic_lights \
925	rdotnet_volsay \
926	rdotnet_volsay2 \
927	rdotnet_volsay3 \
928	rdotnet_wedding_optimal_chart \
929	rdotnet_who_killed_agatha \
930	rdotnet_xkcd \
931	rdotnet_young_tableaux \
932	rdotnet_zebra \
933	rdotnet_fsdiet \
934	rdotnet_fsequality-inequality \
935	rdotnet_fsequality \
936	rdotnet_fsinteger-linear-program \
937	rdotnet_fsintegerprogramming \
938	rdotnet_fsknapsack \
939	rdotnet_fslinearprogramming \
940	rdotnet_fsnetwork-max-flow-lpSolve \
941	rdotnet_fsnetwork-max-flow \
942	rdotnet_fsnetwork-min-cost-flow \
943	rdotnet_fsProgram \
944	rdotnet_fsrabbit-pheasant \
945	rdotnet_fsvolsay \
946	rdotnet_fsvolsay3-lpSolve \
947	rdotnet_fsvolsay3 \
948	rdotnet_SimpleProgramFSharp
949#	rdotnet_coins_grid ARGS="5 2" \
950#	rdotnet_nontransitive_dice \ # too long
951#	rdotnet_partition \ # too long
952#	rdotnet_secret_santa \ # too long
953#	rdotnet_word_square \ # depends on /usr/share/dict/words
954
955.PHONY: test_dotnet_dotnet # Build and Run all .Net Examples (located in examples/dotnet)
956test_dotnet_dotnet: \
957	rdotnet_BalanceGroupSat \
958	rdotnet_cscvrptw \
959	rdotnet_csflow \
960	rdotnet_csintegerprogramming \
961	rdotnet_csknapsack \
962	rdotnet_cslinearprogramming \
963	rdotnet_csls_api \
964	rdotnet_csrabbitspheasants \
965	rdotnet_cstsp \
966	rdotnet_furniture_moving_intervals \
967	rdotnet_organize_day_intervals \
968	rdotnet_techtalk_scheduling \
969	rdotnet_GateSchedulingSat \
970	rdotnet_JobshopFt06Sat \
971	rdotnet_JobshopSat \
972	rdotnet_NursesSat \
973	rdotnet_ShiftSchedulingSat \
974	rdotnet_SpeakerSchedulingSat \
975	rdotnet_TaskSchedulingSat
976#	rdotnet_NetworkRoutingSat \
977 ARGS="--clients=10 --backbones=5 --demands=10 --trafficMin=5 --trafficMax=10 --minClientDegree=2 --maxClientDegree=5 --minBackboneDegree=3 --maxBackboneDegree=5 --maxCapacity=20 --fixedChargeCost=10" \
978
979.PHONY: test_dotnet_pimpl
980test_dotnet_pimpl: \
981 check_dotnet_pimpl \
982 test_dotnet_tests \
983 test_dotnet_contrib \
984 test_dotnet_dotnet
985
986#######################
987##  EXAMPLE ARCHIVE  ##
988#######################
989$(TEMP_DOTNET_DIR)/ortools_examples: | $(TEMP_DOTNET_DIR)
990	$(MKDIR) $(TEMP_DOTNET_DIR)$Sortools_examples
991
992$(TEMP_DOTNET_DIR)/ortools_examples/examples: | $(TEMP_DOTNET_DIR)/ortools_examples
993	$(MKDIR) $(TEMP_DOTNET_DIR)$Sortools_examples$Sexamples
994
995$(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet: | $(TEMP_DOTNET_DIR)/ortools_examples/examples
996	$(MKDIR) $(TEMP_DOTNET_DIR)$Sortools_examples$Sexamples$Sdotnet
997
998$(TEMP_DOTNET_DIR)/ortools_examples/examples/data: | $(TEMP_DOTNET_DIR)/ortools_examples/examples
999	$(MKDIR) $(TEMP_DOTNET_DIR)$Sortools_examples$Sexamples$Sdata
1000
1001define dotnet-sample-archive =
1002$$(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet/%.csproj: \
1003 ortools/$1/samples/%.cs \
1004 | $$(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet
1005	$$(COPY) $$(SRC_DIR)$$Sortools$$S$1$$Ssamples$$S$$*.cs \
1006 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet
1007	$$(COPY) ortools$$Sdotnet$$SSample.csproj.in \
1008 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1009	$(SED) -i -e 's/@PROJECT_VERSION@/$$(OR_TOOLS_VERSION)/' \
1010 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1011	$$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$$(OR_TOOLS_MAJOR)/' \
1012 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1013	$$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$$(OR_TOOLS_MINOR)/' \
1014 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1015	$$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$$(GIT_REVISION)/' \
1016 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1017	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/./' \
1018 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1019	$(SED) -i -e 's/@DOTNET_PROJECT@/$$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
1020 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1021	$(SED) -i -e 's/@SAMPLE_NAME@/$$*/' \
1022 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1023	$(SED) -i -e 's/@FILE_NAME@/$$*.cs/' \
1024 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1025endef
1026
1027DOTNET_SAMPLES := algorithms graph constraint_solver linear_solver sat
1028$(foreach sample,$(DOTNET_SAMPLES),$(eval $(call dotnet-sample-archive,$(sample))))
1029
1030define dotnet-example-archive =
1031$$(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet/%.csproj: \
1032 examples/$1/%.cs \
1033 | $$(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet
1034	$$(COPY) $$(SRC_DIR)$$Sexamples$$S$1$$S$$*.cs \
1035 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet
1036	$$(COPY) ortools$$Sdotnet$$SSample.csproj.in \
1037 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1038	$(SED) -i -e 's/@PROJECT_VERSION@/$$(OR_TOOLS_VERSION)/' \
1039 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1040	$$(SED) -i -e 's/@PROJECT_VERSION_MAJOR@/$$(OR_TOOLS_MAJOR)/' \
1041 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1042	$$(SED) -i -e 's/@PROJECT_VERSION_MINOR@/$$(OR_TOOLS_MINOR)/' \
1043 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1044	$$(SED) -i -e 's/@PROJECT_VERSION_PATCH@/$$(GIT_REVISION)/' \
1045 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1046	$(SED) -i -e 's/@DOTNET_PACKAGES_DIR@/./' \
1047 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1048	$(SED) -i -e 's/@DOTNET_PROJECT@/$$(DOTNET_ORTOOLS_ASSEMBLY_NAME)/' \
1049 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1050	$(SED) -i -e 's/@SAMPLE_NAME@/$$*/' \
1051 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1052	$(SED) -i -e 's/@FILE_NAME@/$$*.cs/' \
1053 $$(TEMP_DOTNET_DIR)$$Sortools_examples$$Sexamples$$Sdotnet$$S$$*.csproj
1054endef
1055
1056DOTNET_EXAMPLES := contrib dotnet
1057$(foreach example,$(DOTNET_EXAMPLES),$(eval $(call dotnet-example-archive,$(example))))
1058
1059SAMPLE_DOTNET_FILES = \
1060  $(addsuffix proj,$(addprefix $(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet/,$(notdir $(wildcard ortools/*/samples/*.cs))))
1061
1062EXAMPLE_DOTNET_FILES = \
1063  $(addsuffix proj,$(addprefix $(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet/,$(notdir $(wildcard examples/contrib/*.cs)))) \
1064  $(addsuffix proj,$(addprefix $(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet/,$(notdir $(wildcard examples/dotnet/*.cs))))
1065
1066.PHONY: dotnet_examples_archive # Build stand-alone C++ examples archive file for redistribution.
1067dotnet_examples_archive: \
1068 $(SAMPLE_DOTNET_FILES) \
1069 $(EXAMPLE_DOTNET_FILES) \
1070	| $(TEMP_DOTNET_DIR)/ortools_examples/examples/dotnet
1071	-$(COPY) tools$SREADME.dotnet.md $(TEMP_DOTNET_DIR)$Sortools_examples$SREADME.md
1072	$(COPY) LICENSE-2.0.txt $(TEMP_DOTNET_DIR)$Sortools_examples
1073ifeq ($(SYSTEM),win)
1074	cd $(TEMP_DOTNET_DIR) \
1075 && ..\$(ZIP) \
1076 -r ..\or-tools_dotnet_examples_v$(OR_TOOLS_VERSION).zip \
1077 ortools_examples
1078else
1079	cd $(TEMP_DOTNET_DIR) \
1080 && tar -c -v -z --no-same-owner \
1081 -f ../or-tools_dotnet_examples_v$(OR_TOOLS_VERSION).tar.gz \
1082 ortools_examples
1083endif
1084	-$(DELREC) $(TEMP_DOTNET_DIR)$Sortools_examples
1085
1086######################
1087##  Nuget artifact  ##
1088######################
1089.PHONY: nuget_archive # Build .Net "Google.OrTools" Nuget Package
1090nuget_archive: dotnet | $(TEMP_DOTNET_DIR)
1091	"$(DOTNET_BIN)" publish $(DOTNET_BUILD_ARGS) --no-build --no-dependencies --no-restore -f net6.0 \
1092 -o "..$S..$S..$S$(TEMP_DOTNET_DIR)" \
1093 ortools$Sdotnet$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).csproj
1094	"$(DOTNET_BIN)" publish $(DOTNET_BUILD_ARGS) --no-build --no-dependencies --no-restore -f net6.0 \
1095 -o "..$S..$S..$S$(TEMP_DOTNET_DIR)" \
1096 ortools$Sdotnet$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).fsproj
1097	"$(DOTNET_BIN)" pack -c Release $(NUGET_PACK_ARGS) --no-build \
1098 -o "..$S..$S..$S$(BIN_DIR)" \
1099 ortools$Sdotnet
1100
1101.PHONY: nuget_upload # Upload Nuget Package
1102nuget_upload: nuget_archive
1103	@echo Uploading Nuget package for "net6.0".
1104	$(warning Not Implemented)
1105
1106################
1107##  Cleaning  ##
1108################
1109.PHONY: clean_dotnet # Clean files
1110clean_dotnet:
1111	-$(DELREC) ortools$Sdotnet$SCreateSigningKey$Sbin
1112	-$(DELREC) ortools$Sdotnet$SCreateSigningKey$Sobj
1113	-$(DEL) $(DOTNET_ORTOOLS_SNK_PATH)
1114	-$(DELREC) $(TEMP_DOTNET_DIR)
1115	-$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S*.cs
1116	-$(DEL) $(GEN_PATH)$Sortools$Salgorithms$S*csharp_wrap*
1117	-$(DEL) $(GEN_PATH)$Sortools$Sgraph$S*.cs
1118	-$(DEL) $(GEN_PATH)$Sortools$Sgraph$S*csharp_wrap*
1119	-$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S*.cs
1120	-$(DEL) $(GEN_PATH)$Sortools$Sconstraint_solver$S*csharp_wrap*
1121	-$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*.cs
1122	-$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*csharp_wrap*
1123	-$(DEL) $(GEN_PATH)$Sortools$Ssat$S*.cs
1124	-$(DEL) $(GEN_PATH)$Sortools$Ssat$S*csharp_wrap*
1125	-$(DEL) $(GEN_PATH)$Sortools$Sutil$S*.cs
1126	-$(DEL) $(GEN_PATH)$Sortools$Sutil$S*csharp_wrap*
1127	-$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.cs
1128	-$(DEL) $(GEN_PATH)$Sortools$Sinit$S*csharp_wrap*
1129	-$(DEL) $(OBJ_DIR)$Sswig$S*_csharp_wrap.$O
1130	-$(DEL) $(LIB_DIR)$S$(DOTNET_ORTOOLS_NATIVE).*
1131	-$(DEL) $(BIN_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).*
1132	-$(DEL) $(BIN_DIR)$S$(FSHARP_ORTOOLS_ASSEMBLY_NAME).*
1133	-$(DELREC) $(DOTNET_EX_PATH)$Sbin
1134	-$(DELREC) $(DOTNET_EX_PATH)$Sobj
1135	-$(DELREC) $(CONTRIB_EX_PATH)$Sbin
1136	-$(DELREC) $(CONTRIB_EX_PATH)$Sobj
1137	-$(DELREC) $(TEST_PATH)$Sbin
1138	-$(DELREC) $(TEST_PATH)$Sobj
1139	-$(DELREC) ortools$Salgorithms$Ssamples$Sbin
1140	-$(DELREC) ortools$Salgorithms$Ssamples$Sobj
1141	-$(DELREC) ortools$Sconstraint_solver$Ssamples$Sbin
1142	-$(DELREC) ortools$Sconstraint_solver$Ssamples$Sobj
1143	-$(DELREC) ortools$Sgraph$Ssamples$Sbin
1144	-$(DELREC) ortools$Sgraph$Ssamples$Sobj
1145	-$(DELREC) ortools$Slinear_solver$Ssamples$Sbin
1146	-$(DELREC) ortools$Slinear_solver$Ssamples$Sobj
1147	-$(DELREC) ortools$Ssat$Ssamples$Sbin
1148	-$(DELREC) ortools$Ssat$Ssamples$Sobj
1149	-@"$(DOTNET_BIN)" nuget locals all --clear
1150
1151#############
1152##  DEBUG  ##
1153#############
1154.PHONY: detect_dotnet # Show variables used to build dotnet OR-Tools.
1155detect_dotnet:
1156	@echo Relevant info for the dotnet build:
1157	@echo DOTNET_BIN = $(DOTNET_BIN)
1158	@echo NUGET_BIN = $(NUGET_BIN)
1159	@echo PROTOC = $(PROTOC)
1160	@echo DOTNET_SNK = $(DOTNET_SNK)
1161	@echo DOTNET_ORTOOLS_SNK = $(DOTNET_ORTOOLS_SNK)
1162	@echo SWIG_BINARY = $(SWIG_BINARY)
1163	@echo SWIG_INC = $(SWIG_INC)
1164	@echo SWIG_DOTNET_LIB_SUFFIX = $(SWIG_DOTNET_LIB_SUFFIX)
1165	@echo DOTNET_ORTOOLS_NATIVE = $(DOTNET_ORTOOLS_NATIVE)
1166	@echo DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME =$(DOTNET_ORTOOLS_RUNTIME_ASSEMBLY_NAME)
1167	@echo DOTNET_ORTOOLS_RUNTIME_NUPKG = $(DOTNET_ORTOOLS_RUNTIME_NUPKG)
1168	@echo DOTNET_ORTOOLS_ASSEMBLY_NAME = $(DOTNET_ORTOOLS_ASSEMBLY_NAME)
1169	@echo DOTNET_ORTOOLS_NUPKG = $(DOTNET_ORTOOLS_NUPKG)
1170	@echo FSHARP_ORTOOLS_ASSEMBLY_NAME = $(FSHARP_ORTOOLS_ASSEMBLY_NAME)
1171	@echo FSHARP_ORTOOLS_NUPKG = $(FSHARP_ORTOOLS_NUPKG)
1172	@echo FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME = $(FSHARP_ORTOOLS_TESTS_ASSEMBLY_NAME)
1173ifeq ($(SYSTEM),win)
1174	@echo off & echo(
1175else
1176	@echo
1177endif
1178