diff --git a/makefiles/Makefile.cpp.mk b/makefiles/Makefile.cpp.mk index 34c6c76b96..c23e3d548e 100644 --- a/makefiles/Makefile.cpp.mk +++ b/makefiles/Makefile.cpp.mk @@ -88,6 +88,9 @@ $(GEN_DIR)/ortools/sat: | $(GEN_DIR)/ortools $(GEN_DIR)/ortools/util: | $(GEN_DIR)/ortools -$(MKDIR) $(GEN_PATH)$Sortools$Sutil +$(GEN_DIR)/ortools/init: | $(GEN_DIR)/ortools + -$(MKDIR) $(GEN_PATH)$Sortools$Sinit + $(GEN_DIR)/examples: | $(GEN_DIR) -$(MKDIR) $(GEN_PATH)$Sexamples diff --git a/makefiles/Makefile.dotnet.mk b/makefiles/Makefile.dotnet.mk index e9804e5e97..20152661f3 100644 --- a/makefiles/Makefile.dotnet.mk +++ b/makefiles/Makefile.dotnet.mk @@ -271,7 +271,27 @@ $(OBJ_DIR)/swig/sat_csharp_wrap.$O: \ -c $(GEN_PATH)$Sortools$Ssat$Ssat_csharp_wrap.cc \ $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssat_csharp_wrap.$O -$(GEN_DIR)/ortools/util/sorted_interval_list_csharp_wrap.cc: \ +$(GEN_DIR)/ortools/init/init_csharp_wrap.cc: \ + $(SRC_DIR)/ortools/base/base.i \ + $(SRC_DIR)/ortools/init/csharp/init.i \ + $(INIT_DEPS) \ + | $(GEN_DIR)/ortools/init + $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -csharp \ + -o $(GEN_PATH)$Sortools$Sinit$Sinit_csharp_wrap.cc \ + -module operations_research_init \ + -namespace $(DOTNET_ORTOOLS_ASSEMBLY_NAME).Init \ + -dllimport "$(DOTNET_ORTOOLS_NATIVE)" \ + -outdir $(GEN_PATH)$Sortools$Sinit \ + $(SRC_DIR)$Sortools$Sinit$Scsharp$Sinit.i + +$(OBJ_DIR)/swig/init_csharp_wrap.$O: \ + $(GEN_DIR)/ortools/init/init_csharp_wrap.cc \ + | $(OBJ_DIR)/swig + $(CCC) $(CFLAGS) \ + -c $(GEN_PATH)$Sortools$Sinit$Sinit_csharp_wrap.cc \ + $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sinit_csharp_wrap.$O + + $(GEN_DIR)/ortools/util/sorted_interval_list_csharp_wrap.cc: \ $(SRC_DIR)/ortools/base/base.i \ $(SRC_DIR)/ortools/util/csharp/sorted_interval_list.i \ $(SRC_DIR)/ortools/util/csharp/proto.i \ @@ -314,6 +334,7 @@ $(LIB_DIR)/$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX): \ $(OBJ_DIR)/swig/knapsack_solver_csharp_wrap.$O \ $(OBJ_DIR)/swig/graph_csharp_wrap.$O \ $(OBJ_DIR)/swig/sorted_interval_list_csharp_wrap.$O \ + $(OBJ_DIR)/swig/init_csharp_wrap.$O \ | $(LIB_DIR) $(DYNAMIC_LD) \ $(LD_OUT)$(LIB_DIR)$S$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX) \ @@ -322,7 +343,7 @@ $(LIB_DIR)/$(DOTNET_ORTOOLS_NATIVE).$(SWIG_DOTNET_LIB_SUFFIX): \ $(OBJ_DIR)$Sswig$Sconstraint_solver_csharp_wrap.$O \ $(OBJ_DIR)$Sswig$Sknapsack_solver_csharp_wrap.$O \ $(OBJ_DIR)$Sswig$Sgraph_csharp_wrap.$O \ - $(OBJ_DIR)/swig/sorted_interval_list_csharp_wrap.$O \ + $(OBJ_DIR)/swig/init_csharp_wrap.$O \ $(OR_TOOLS_LNK) \ $(OR_TOOLS_LDFLAGS) @@ -914,6 +935,8 @@ clean_dotnet: -$(DEL) $(GEN_PATH)$Sortools$Ssat$S*csharp_wrap* -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*.cs -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*csharp_wrap* + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.cs + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*csharp_wrap* -$(DEL) $(OBJ_DIR)$Sswig$S*_csharp_wrap.$O -$(DEL) $(LIB_DIR)$S$(DOTNET_ORTOOLS_NATIVE).* -$(DEL) $(BIN_DIR)$S$(DOTNET_ORTOOLS_ASSEMBLY_NAME).* diff --git a/makefiles/Makefile.gen.mk b/makefiles/Makefile.gen.mk index 43c21776c8..e685e047ed 100644 --- a/makefiles/Makefile.gen.mk +++ b/makefiles/Makefile.gen.mk @@ -352,6 +352,10 @@ $(OBJ_DIR)/util/optional_boolean.pb.$O: \ $(GEN_DIR)/ortools/util/optional_boolean.pb.cc | $(OBJ_DIR)/util $(CCC) $(CFLAGS) -c $(GEN_PATH)$Sortools$Sutil$Soptional_boolean.pb.cc $(OBJ_OUT)$(OBJ_DIR)$Sutil$Soptional_boolean.pb.$O +INIT_DEPS = \ + $(SRC_DIR)/ortools/init/init.h \ + + DATA_DEPS = \ $(SRC_DIR)/ortools/data/jobshop_scheduling_parser.h \ $(SRC_DIR)/ortools/data/rcpsp_parser.h \ diff --git a/makefiles/Makefile.java.mk b/makefiles/Makefile.java.mk index 6dd18b5363..bdd5e1d6d6 100644 --- a/makefiles/Makefile.java.mk +++ b/makefiles/Makefile.java.mk @@ -92,6 +92,9 @@ $(GEN_DIR)/java/com/google/ortools/linearsolver: $(GEN_DIR)/java/com/google/ortools/flatzinc: -$(MKDIR_P) $(GEN_PATH)$Sjava$Scom$Sgoogle$Sortools$Sflatzinc +$(GEN_DIR)/java/com/google/ortools/init: + $(MKDIR_P) $(GEN_PATH)$Sjava$Scom$Sgoogle$Sortools$Sinit + $(GEN_DIR)/java/com/google/ortools/sat: -$(MKDIR_P) $(GEN_PATH)$Sjava$Scom$Sgoogle$Sortools$Ssat @@ -220,6 +223,26 @@ $(OBJ_DIR)/swig/sat_java_wrap.$O: \ -c $(GEN_PATH)$Sortools$Ssat$Ssat_java_wrap.cc \ $(OBJ_OUT)$(OBJ_DIR)$Sswig$Ssat_java_wrap.$O +$(GEN_DIR)/ortools/init/init_java_wrap.cc: \ + $(SRC_DIR)/ortools/init/java/init.i \ + $(SRC_DIR)/ortools/base/base.i \ + $(INIT_DEPS) \ + | $(GEN_DIR)/ortools/init $(GEN_DIR)/java/com/google/ortools/init + $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -java $(SWIG_DOXYGEN) \ + -o $(GEN_PATH)$Sortools$Sinit$Sinit_java_wrap.cc \ + -package com.google.ortools.init \ + -module main \ + -outdir $(GEN_PATH)$Sjava$Scom$Sgoogle$Sortools$Sinit \ + $(SRC_DIR)$Sortools$Sinit$Sjava$Sinit.i + +$(OBJ_DIR)/swig/init_java_wrap.$O: \ + $(GEN_DIR)/ortools/init/init_java_wrap.cc \ + $(INIT_DEPS) \ + | $(OBJ_DIR)/swig + $(CCC) $(JNIFLAGS) $(JAVA_INC) \ + -c $(GEN_PATH)$Sortools$Sinit$Sinit_java_wrap.cc \ + $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sinit_java_wrap.$O + $(GEN_DIR)/ortools/util/util_java_wrap.cc: \ $(SRC_DIR)/ortools/util/java/sorted_interval_list.i \ $(SRC_DIR)/ortools/base/base.i \ @@ -246,6 +269,7 @@ $(JAVA_ORTOOLS_NATIVE_LIBS): \ $(OBJ_DIR)/swig/knapsack_solver_java_wrap.$O \ $(OBJ_DIR)/swig/graph_java_wrap.$O \ $(OBJ_DIR)/swig/linear_solver_java_wrap.$O \ + $(OBJ_DIR)/swig/init_java_wrap.$O \ $(OBJ_DIR)/swig/sat_java_wrap.$O \ $(OBJ_DIR)/swig/util_java_wrap.$O $(DYNAMIC_LD) $(LD_OUT)$(LIB_DIR)$S$(LIB_PREFIX)jniortools.$(JNI_LIB_EXT) \ @@ -253,6 +277,7 @@ $(JAVA_ORTOOLS_NATIVE_LIBS): \ $(OBJ_DIR)$Sswig$Sknapsack_solver_java_wrap.$O \ $(OBJ_DIR)$Sswig$Sgraph_java_wrap.$O \ $(OBJ_DIR)$Sswig$Slinear_solver_java_wrap.$O \ + $(OBJ_DIR)$Sswig$Sinit_java_wrap.$O \ $(OBJ_DIR)$Sswig$Ssat_java_wrap.$O \ $(OBJ_DIR)$Sswig$Sutil_java_wrap.$O \ $(OR_TOOLS_LNK) \ @@ -858,6 +883,7 @@ clean_java: -$(DEL) $(GEN_PATH)$Sortools$Slinear_solver$S*java_wrap* -$(DEL) $(GEN_PATH)$Sortools$Ssat$S*java_wrap* -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*java_wrap* + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*java_wrap* -$(DEL) $(OBJ_DIR)$Sswig$S*_java_wrap.$O -$(DEL) $(LIB_DIR)$S$(LIB_PREFIX)jni*.$(JNI_LIB_EXT) -$(DEL) $(LIB_DIR)$S*.jar diff --git a/makefiles/Makefile.python.mk b/makefiles/Makefile.python.mk index e5eb77ea2d..6b0b7e821e 100644 --- a/makefiles/Makefile.python.mk +++ b/makefiles/Makefile.python.mk @@ -46,6 +46,7 @@ PYLP_LIBS = $(LIB_DIR)/_pywraplp.$(SWIG_PYTHON_LIB_SUFFIX) PYSAT_LIBS = $(LIB_DIR)/_pywrapsat.$(SWIG_PYTHON_LIB_SUFFIX) PYDATA_LIBS = $(LIB_DIR)/_pywraprcpsp.$(SWIG_PYTHON_LIB_SUFFIX) PYSORTED_INTERVAL_LIST_LIBS = $(LIB_DIR)/_sorted_interval_list.$(SWIG_PYTHON_LIB_SUFFIX) +PYINIT_LIBS = $(LIB_DIR)/_init.$(SWIG_PYTHON_LIB_SUFFIX) PYTHON_OR_TOOLS_LIBS = \ $(GEN_DIR)/ortools/__init__.py \ $(PYALGORITHMS_LIBS) \ @@ -54,7 +55,8 @@ PYTHON_OR_TOOLS_LIBS = \ $(PYLP_LIBS) \ $(PYSAT_LIBS) \ $(PYDATA_LIBS) \ - $(PYSORTED_INTERVAL_LIST_LIBS) + $(PYSORTED_INTERVAL_LIST_LIBS) \ + $(PYINIT_LIBS) # Main target .PHONY: python # Build Python OR-Tools. @@ -494,6 +496,49 @@ else cp $(PYSORTED_INTERVAL_LIST_LIBS) $(GEN_PATH)/ortools/util endif +# init +ifeq ($(PLATFORM),MACOSX) +PYINIT_LDFLAGS = -install_name @rpath/_init.$(SWIG_PYTHON_LIB_SUFFIX) # +endif + +$(GEN_DIR)/ortools/init/init.py: \ + $(SRC_DIR)/ortools/init/init.h \ + $(SRC_DIR)/ortools/base/base.i \ + $(SRC_DIR)/ortools/util/python/vector.i \ + $(SRC_DIR)/ortools/init/python/init.i \ + $(INIT_DEPS) \ + | $(GEN_DIR)/ortools/init + $(SWIG_BINARY) $(SWIG_INC) -I$(INC_DIR) -c++ -python $(SWIG_DOXYGEN) $(SWIG_PYTHON3_FLAG) \ + -o $(GEN_PATH)$Sortools$Sinit$Sinit_python_wrap.cc \ + -module init \ + $(SRC_DIR)$Sortools$Sinit$Spython$Sinit.i + +$(GEN_DIR)/ortools/init/init_python_wrap.cc: \ + $(GEN_DIR)/ortools/init/init.py + +$(OBJ_DIR)/swig/init_python_wrap.$O: \ + $(GEN_DIR)/ortools/init/init_python_wrap.cc \ + $(INIT_DEPS) \ + | $(OBJ_DIR)/swig + $(CCC) $(CFLAGS) $(PYTHON_INC) $(PYTHON3_CFLAGS) \ + -c $(GEN_PATH)$Sortools$Sinit$Sinit_python_wrap.cc \ + $(OBJ_OUT)$(OBJ_DIR)$Sswig$Sinit_python_wrap.$O + +$(PYINIT_LIBS): $(OBJ_DIR)/swig/init_python_wrap.$O $(OR_TOOLS_LIBS) + $(DYNAMIC_LD) \ + $(PYINIT_LDFLAGS) \ + $(LD_OUT)$(LIB_DIR)$S_init.$(SWIG_PYTHON_LIB_SUFFIX) \ + $(OBJ_DIR)$Sswig$Sinit_python_wrap.$O \ + $(OR_TOOLS_LNK) \ + $(SYS_LNK) \ + $(PYTHON_LNK) \ + $(PYTHON_LDFLAGS) +ifeq ($(SYSTEM),win) + copy $(LIB_DIR)$S_init.$(SWIG_PYTHON_LIB_SUFFIX) $(GEN_PATH)\\ortools\\init\\_init.pyd +else + cp $(PYINIT_LIBS) $(GEN_PATH)/ortools/init +endif + ####################### ## Python SOURCE ## ####################### @@ -1132,6 +1177,11 @@ clean_python: -$(DELREC) ortools$Sutil$S__pycache__ -$(DEL) $(GEN_PATH)$Sortools$Sutil$S*_python_wrap.* -$(DEL) $(GEN_PATH)$Sortools$Sutil$S_* + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.py + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*.pyc + -$(DELREC) $(GEN_PATH)$Sortools$Sinit$S__pycache__ + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S*_python_wrap.* + -$(DEL) $(GEN_PATH)$Sortools$Sinit$S_* -$(DEL) $(LIB_DIR)$S_*.$(SWIG_PYTHON_LIB_SUFFIX) -$(DEL) $(OBJ_DIR)$Sswig$S*python_wrap.$O -$(DELREC) temp_python* diff --git a/ortools/init/csharp/init.i b/ortools/init/csharp/init.i new file mode 100644 index 0000000000..7771003116 --- /dev/null +++ b/ortools/init/csharp/init.i @@ -0,0 +1,19 @@ +%include "ortools/base/base.i" + +%include "std_string.i" + +%{ +#include "ortools/init/init.h" +%} + +%ignoreall + +%unignore operations_research; + +%unignore operations_research::Init; +%unignore operations_research::Init::InitCppLogging; +%unignore operations_research::Init::LoadGurobiSharedLibrary; + +%include "ortools/init/init.h" + +%unignoreall \ No newline at end of file diff --git a/ortools/init/init.h b/ortools/init/init.h index 680e65b757..ce3b204c55 100644 --- a/ortools/init/init.h +++ b/ortools/init/init.h @@ -1,9 +1,11 @@ #include #include +#include "absl/flags/flag.h" #include "ortools/base/logging.h" #include "ortools/gurobi/environment.h" + namespace operations_research { // This class performs various C++ initialization. @@ -14,17 +16,16 @@ class Init { // If logtostderr is false, all C++ logging will be ignored. // If true, all logging will the displayed on stderr. static void InitCppLogging(const std::string& program_name, bool logtostderr) { - absl::SetFlags(&FLAGS_logtostderr, logtostderr); - InitLogging(program_name.c_str()); + absl::SetFlag(&FLAGS_logtostderr, logtostderr); + google::InitGoogleLogging(program_name.c_str()); } // Load the gurobi shared library. // This is necessary if the library is installed in a non canonical // directory, or if for any reason, it is not found. // You need to pass the full path, including the shared library file. - // You can pass multiple paths. They will be tried in order. - static void LoadGurobiSharedLibrary(const std::vector& possible_paths) { - LoadGurobiDynamicLibrary(possible_paths); + static void LoadGurobiSharedLibrary(const std::string& full_library_path) { + LoadGurobiDynamicLibrary({full_library_path}); } }; diff --git a/ortools/init/java/init.i b/ortools/init/java/init.i new file mode 100644 index 0000000000..9820e630ba --- /dev/null +++ b/ortools/init/java/init.i @@ -0,0 +1,19 @@ +%include "ortools/base/base.i" + +%include "std_string.i" + +%{ +#include "ortools/init/init.h" +%} + +%ignoreall + +%unignore operations_research; + +%unignore operations_research::Init; +%rename (initCppLogging) operations_research::Init::InitCppLogging; +%rename (logGurobiSharedLibrary) operations_research::Init::LoadGurobiSharedLibrary; + +%include "ortools/init/init.h" + +%unignoreall \ No newline at end of file diff --git a/ortools/init/python/init.i b/ortools/init/python/init.i new file mode 100644 index 0000000000..7771003116 --- /dev/null +++ b/ortools/init/python/init.i @@ -0,0 +1,19 @@ +%include "ortools/base/base.i" + +%include "std_string.i" + +%{ +#include "ortools/init/init.h" +%} + +%ignoreall + +%unignore operations_research; + +%unignore operations_research::Init; +%unignore operations_research::Init::InitCppLogging; +%unignore operations_research::Init::LoadGurobiSharedLibrary; + +%include "ortools/init/init.h" + +%unignoreall \ No newline at end of file