diff --git a/cmake/dotnet.cmake b/cmake/dotnet.cmake index b0b730a04e..ea7b2e8d44 100644 --- a/cmake/dotnet.cmake +++ b/cmake/dotnet.cmake @@ -83,7 +83,18 @@ endif() list(APPEND CMAKE_SWIG_FLAGS ${FLAGS} "-I${PROJECT_SOURCE_DIR}") # Swig wrap all libraries -set(OR_TOOLS_DOTNET Google.OrTools) +set(DOTNET_PROJECT Google.OrTools) +if(APPLE) + set(RUNTIME_IDENTIFIER osx-x64) +elseif(UNIX) + set(RUNTIME_IDENTIFIER linux-x64) +elseif(WIN32) + set(RUNTIME_IDENTIFIER win-x64) +else() + message(FATAL_ERROR "Unsupported system !") +endif() +set(DOTNET_NATIVE_PROJECT ${DOTNET_PROJECT}.runtime.${RUNTIME_IDENTIFIER}) + foreach(SUBPROJECT IN ITEMS algorithms graph linear_solver constraint_solver sat util) add_subdirectory(ortools/${SUBPROJECT}/csharp) target_link_libraries(google-ortools-native PRIVATE dotnet_${SUBPROJECT}) @@ -93,7 +104,8 @@ endforeach() ## .Net Runtime Package ## ############################ file(COPY tools/doc/orLogo.png DESTINATION dotnet) -set(DOTNET_PACKAGES_DIR "../packages") +set(DOTNET_PACKAGES_DIR "${PROJECT_BINARY_DIR}/dotnet/packages") +set(DOTNET_LOGO_DIR "${PROJECT_BINARY_DIR}/dotnet") configure_file(ortools/dotnet/Directory.Build.props.in dotnet/Directory.Build.props) # Build or retrieve .snk file @@ -117,44 +129,32 @@ else() ) endif() -if(APPLE) - set(RUNTIME_IDENTIFIER osx-x64) -elseif(UNIX) - set(RUNTIME_IDENTIFIER linux-x64) -elseif(WIN32) - set(RUNTIME_IDENTIFIER win-x64) -else() - message(FATAL_ERROR "Unsupported system !") -endif() -set(OR_TOOLS_DOTNET_NATIVE ${OR_TOOLS_DOTNET}.runtime.${RUNTIME_IDENTIFIER}) - - file(GENERATE OUTPUT dotnet/$/replace_runtime.cmake CONTENT - "FILE(READ ${PROJECT_SOURCE_DIR}/ortools/dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj.in input) + "FILE(READ ${PROJECT_SOURCE_DIR}/ortools/dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj.in input) STRING(REPLACE \"@PROJECT_VERSION@\" \"${PROJECT_VERSION}\" input \"\${input}\") STRING(REPLACE \"@ortools@\" \"$<$>:$>\" input \"\${input}\") STRING(REPLACE \"@native@\" \"$\" input \"\${input}\") -FILE(WRITE ${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj \"\${input}\")" +FILE(WRITE ${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj \"\${input}\")" ) add_custom_command( - OUTPUT dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj - COMMAND ${CMAKE_COMMAND} -E make_directory ${OR_TOOLS_DOTNET_NATIVE} + OUTPUT dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj + COMMAND ${CMAKE_COMMAND} -E make_directory ${DOTNET_NATIVE_PROJECT} COMMAND ${CMAKE_COMMAND} -P ./$/replace_runtime.cmake WORKING_DIRECTORY dotnet ) if(WIN32) add_custom_command( - OUTPUT dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.targets - COMMAND ${CMAKE_COMMAND} -E make_directory ${OR_TOOLS_DOTNET_NATIVE} + OUTPUT dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.targets + COMMAND ${CMAKE_COMMAND} -E make_directory ${DOTNET_NATIVE_PROJECT} COMMAND ${CMAKE_COMMAND} -E copy - ${PROJECT_SOURCE_DIR}/ortools/dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.targets - ${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.targets + ${PROJECT_SOURCE_DIR}/ortools/dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.targets + ${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.targets WORKING_DIRECTORY dotnet ) - set(DOTNET_TARGETS dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.targets) + set(DOTNET_TARGETS dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.targets) endif() add_custom_target(dotnet_native ALL @@ -162,28 +162,33 @@ add_custom_target(dotnet_native ALL dotnet/or-tools.snk Dotnet${PROJECT_NAME}_proto google-ortools-native - dotnet/${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj + dotnet/${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj ${DOTNET_TARGETS} COMMAND ${CMAKE_COMMAND} -E make_directory packages - COMMAND ${DOTNET_EXECUTABLE} build -c Release /p:Platform=x64 ${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj - COMMAND ${DOTNET_EXECUTABLE} pack -c Release ${OR_TOOLS_DOTNET_NATIVE}/${OR_TOOLS_DOTNET_NATIVE}.csproj + COMMAND ${DOTNET_EXECUTABLE} build -c Release /p:Platform=x64 ${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj + COMMAND ${DOTNET_EXECUTABLE} pack -c Release ${DOTNET_NATIVE_PROJECT}/${DOTNET_NATIVE_PROJECT}.csproj + BYPRODUCTS + dotnet/${DOTNET_NATIVE_PROJECT}/bin + dotnet/${DOTNET_NATIVE_PROJECT}/obj WORKING_DIRECTORY dotnet ) -# Main Target +#################### +## .Net Package ## +#################### file(GENERATE OUTPUT dotnet/$/replace.cmake CONTENT - "FILE(READ ${PROJECT_SOURCE_DIR}/ortools/dotnet/${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj.in input) + "FILE(READ ${PROJECT_SOURCE_DIR}/ortools/dotnet/${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj.in input) STRING(REPLACE \"@PROJECT_VERSION@\" \"${PROJECT_VERSION}\" input \"\${input}\") STRING(REPLACE \"@PROJECT_SOURCE_DIR@\" \"${PROJECT_SOURCE_DIR}\" input \"\${input}\") STRING(REPLACE \"@PROJECT_DOTNET_DIR@\" \"${PROJECT_BINARY_DIR}/dotnet\" input \"\${input}\") STRING(REPLACE \"@DOTNET_PACKAGES_DIR@\" \"${PROJECT_BINARY_DIR}/dotnet/packages\" input \"\${input}\") -FILE(WRITE ${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj \"\${input}\")" +FILE(WRITE ${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj \"\${input}\")" ) add_custom_command( - OUTPUT dotnet/${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj - COMMAND ${CMAKE_COMMAND} -E make_directory ${OR_TOOLS_DOTNET} + OUTPUT dotnet/${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj + COMMAND ${CMAKE_COMMAND} -E make_directory ${DOTNET_PROJECT} COMMAND ${CMAKE_COMMAND} -P ./$/replace.cmake WORKING_DIRECTORY dotnet ) @@ -192,10 +197,56 @@ add_custom_target(dotnet_package ALL DEPENDS dotnet/or-tools.snk dotnet_native - dotnet/${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj - COMMAND ${DOTNET_EXECUTABLE} build -c Release /p:Platform=x64 ${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj - COMMAND ${DOTNET_EXECUTABLE} pack -c Release ${OR_TOOLS_DOTNET}/${OR_TOOLS_DOTNET}.csproj + dotnet/${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj + COMMAND ${DOTNET_EXECUTABLE} build -c Release /p:Platform=x64 ${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj + COMMAND ${DOTNET_EXECUTABLE} pack -c Release ${DOTNET_PROJECT}/${DOTNET_PROJECT}.csproj BYPRODUCTS + dotnet/${DOTNET_PROJECT}/bin + dotnet/${DOTNET_PROJECT}/obj dotnet/packages WORKING_DIRECTORY dotnet ) + +# add_dotnet_sample() +# CMake function to generate and build dotnet sample. +# Parameters: +# the dotnet filename +# e.g.: +# add_dotnet_sample(Foo.cs) +function(add_dotnet_sample FILE_NAME) + message(STATUS "Building ${FILE_NAME}: ...") + get_filename_component(SAMPLE_NAME ${FILE_NAME} NAME_WE) + get_filename_component(SAMPLE_DIR ${FILE_NAME} DIRECTORY) + get_filename_component(COMPONENT_DIR ${SAMPLE_DIR} DIRECTORY) + get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME) + + set(SAMPLE_PATH ${PROJECT_BINARY_DIR}/dotnet/${COMPONENT_NAME}/${SAMPLE_NAME}) + file(MAKE_DIRECTORY ${SAMPLE_PATH}) + + file(COPY ${FILE_NAME} DESTINATION ${SAMPLE_PATH}) + + set(DOTNET_PACKAGES_DIR "${PROJECT_BINARY_DIR}/dotnet/packages") + configure_file( + ${PROJECT_SOURCE_DIR}/ortools/dotnet/Sample.csproj.in + ${SAMPLE_PATH}/${SAMPLE_NAME}.csproj + @ONLY) + + add_custom_target(dotnet_sample_${SAMPLE_NAME} ALL + DEPENDS ${SAMPLE_PATH}/${SAMPLE_NAME}.csproj + COMMAND ${DOTNET_EXECUTABLE} build -c Release + COMMAND ${DOTNET_EXECUTABLE} pack -c Release + BYPRODUCTS + ${SAMPLE_PATH}/bin + ${SAMPLE_PATH}/obj + WORKING_DIRECTORY ${SAMPLE_PATH}) + add_dependencies(dotnet_sample_${SAMPLE_NAME} dotnet_package) + + if(BUILD_TESTING) + add_test( + NAME dotnet_${COMPONENT_NAME}_${SAMPLE_NAME} + COMMAND ${DOTNET_EXECUTABLE} run --no-build -c Release + WORKING_DIRECTORY ${SAMPLE_PATH}) + endif() + + message(STATUS "Building ${FILE_NAME}: ...DONE") +endfunction() diff --git a/ortools/algorithms/csharp/CMakeLists.txt b/ortools/algorithms/csharp/CMakeLists.txt index dbccf36430..f47eab7383 100644 --- a/ortools/algorithms/csharp/CMakeLists.txt +++ b/ortools/algorithms/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE knapsack_solver.i PROPERTY SWIG_MODULE_NAME operations_resea set_property(SOURCE knapsack_solver.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE knapsack_solver.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.Algorithms + -namespace ${DOTNET_PROJECT}.Algorithms -dllimport google-ortools-native) swig_add_library(dotnet_algorithms TYPE OBJECT diff --git a/ortools/algorithms/samples/CMakeLists.txt b/ortools/algorithms/samples/CMakeLists.txt index d1d95ec1f3..90246fcd14 100644 --- a/ortools/algorithms/samples/CMakeLists.txt +++ b/ortools/algorithms/samples/CMakeLists.txt @@ -24,5 +24,8 @@ if(BUILD_JAVA_SAMPLES) endif() if(BUILD_DOTNET_SAMPLES) - + file(GLOB DOTNET_SRCS "*.cs") + foreach(SAMPLE IN LISTS DOTNET_SRCS) + add_dotnet_sample(${SAMPLE}) + endforeach() endif() diff --git a/ortools/constraint_solver/csharp/CMakeLists.txt b/ortools/constraint_solver/csharp/CMakeLists.txt index 6bfbf67ce5..58a7038f47 100644 --- a/ortools/constraint_solver/csharp/CMakeLists.txt +++ b/ortools/constraint_solver/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE routing.i PROPERTY SWIG_MODULE_NAME operations_research_cons set_property(SOURCE routing.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE routing.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.ConstraintSolver + -namespace ${DOTNET_PROJECT}.ConstraintSolver -dllimport google-ortools-native) swig_add_library(dotnet_constraint_solver TYPE OBJECT diff --git a/ortools/constraint_solver/samples/CMakeLists.txt b/ortools/constraint_solver/samples/CMakeLists.txt index d1d95ec1f3..90246fcd14 100644 --- a/ortools/constraint_solver/samples/CMakeLists.txt +++ b/ortools/constraint_solver/samples/CMakeLists.txt @@ -24,5 +24,8 @@ if(BUILD_JAVA_SAMPLES) endif() if(BUILD_DOTNET_SAMPLES) - + file(GLOB DOTNET_SRCS "*.cs") + foreach(SAMPLE IN LISTS DOTNET_SRCS) + add_dotnet_sample(${SAMPLE}) + endforeach() endif() diff --git a/ortools/dotnet/Directory.Build.props.in b/ortools/dotnet/Directory.Build.props.in index 169a3dd553..cb8461c6de 100644 --- a/ortools/dotnet/Directory.Build.props.in +++ b/ortools/dotnet/Directory.Build.props.in @@ -25,7 +25,7 @@ 1591 - + True content diff --git a/ortools/dotnet/Sample.csproj.in b/ortools/dotnet/Sample.csproj.in new file mode 100644 index 0000000000..97431350f6 --- /dev/null +++ b/ortools/dotnet/Sample.csproj.in @@ -0,0 +1,24 @@ + + + Exe + 7.3 + netcoreapp2.1 + false + + LatestMajor + @DOTNET_PACKAGES_DIR@;$(RestoreSources);https://api.nuget.org/v3/index.json + @DOTNET_PROJECT@.@SAMPLE_NAME@ + true + + + + full + true + true + + + + + + + diff --git a/ortools/graph/csharp/CMakeLists.txt b/ortools/graph/csharp/CMakeLists.txt index 8945d22a19..2c16eec19c 100644 --- a/ortools/graph/csharp/CMakeLists.txt +++ b/ortools/graph/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE graph.i PROPERTY SWIG_MODULE_NAME operations_research_graph) set_property(SOURCE graph.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE graph.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.Graph + -namespace ${DOTNET_PROJECT}.Graph -dllimport google-ortools-native) swig_add_library(dotnet_graph TYPE OBJECT diff --git a/ortools/graph/samples/CMakeLists.txt b/ortools/graph/samples/CMakeLists.txt index d1d95ec1f3..90246fcd14 100644 --- a/ortools/graph/samples/CMakeLists.txt +++ b/ortools/graph/samples/CMakeLists.txt @@ -24,5 +24,8 @@ if(BUILD_JAVA_SAMPLES) endif() if(BUILD_DOTNET_SAMPLES) - + file(GLOB DOTNET_SRCS "*.cs") + foreach(SAMPLE IN LISTS DOTNET_SRCS) + add_dotnet_sample(${SAMPLE}) + endforeach() endif() diff --git a/ortools/linear_solver/csharp/CMakeLists.txt b/ortools/linear_solver/csharp/CMakeLists.txt index 795634cc78..774faefaf4 100644 --- a/ortools/linear_solver/csharp/CMakeLists.txt +++ b/ortools/linear_solver/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE linear_solver.i PROPERTY SWIG_MODULE_NAME operations_researc set_property(SOURCE linear_solver.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE linear_solver.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.LinearSolver + -namespace ${DOTNET_PROJECT}.LinearSolver -dllimport google-ortools-native) swig_add_library(dotnet_linear_solver TYPE OBJECT diff --git a/ortools/linear_solver/samples/CMakeLists.txt b/ortools/linear_solver/samples/CMakeLists.txt index d1d95ec1f3..90246fcd14 100644 --- a/ortools/linear_solver/samples/CMakeLists.txt +++ b/ortools/linear_solver/samples/CMakeLists.txt @@ -24,5 +24,8 @@ if(BUILD_JAVA_SAMPLES) endif() if(BUILD_DOTNET_SAMPLES) - + file(GLOB DOTNET_SRCS "*.cs") + foreach(SAMPLE IN LISTS DOTNET_SRCS) + add_dotnet_sample(${SAMPLE}) + endforeach() endif() diff --git a/ortools/sat/csharp/CMakeLists.txt b/ortools/sat/csharp/CMakeLists.txt index 9d4db30cad..daed87571d 100644 --- a/ortools/sat/csharp/CMakeLists.txt +++ b/ortools/sat/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE sat.i PROPERTY SWIG_MODULE_NAME operations_research_sat) set_property(SOURCE sat.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE sat.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.Sat + -namespace ${DOTNET_PROJECT}.Sat -dllimport google-ortools-native) swig_add_library(dotnet_sat TYPE OBJECT diff --git a/ortools/sat/samples/CMakeLists.txt b/ortools/sat/samples/CMakeLists.txt index d1d95ec1f3..90246fcd14 100644 --- a/ortools/sat/samples/CMakeLists.txt +++ b/ortools/sat/samples/CMakeLists.txt @@ -24,5 +24,8 @@ if(BUILD_JAVA_SAMPLES) endif() if(BUILD_DOTNET_SAMPLES) - + file(GLOB DOTNET_SRCS "*.cs") + foreach(SAMPLE IN LISTS DOTNET_SRCS) + add_dotnet_sample(${SAMPLE}) + endforeach() endif() diff --git a/ortools/util/csharp/CMakeLists.txt b/ortools/util/csharp/CMakeLists.txt index 5d641f5210..96784aec52 100644 --- a/ortools/util/csharp/CMakeLists.txt +++ b/ortools/util/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ set_property(SOURCE sorted_interval_list.i PROPERTY SWIG_MODULE_NAME operations_ set_property(SOURCE sorted_interval_list.i PROPERTY COMPILE_DEFINITIONS ${OR_TOOLS_COMPILE_DEFINITIONS} ABSL_MUST_USE_RESULT) set_property(SOURCE sorted_interval_list.i PROPERTY COMPILE_OPTIONS - -namespace ${OR_TOOLS_DOTNET}.Util + -namespace ${DOTNET_PROJECT}.Util -dllimport google-ortools-native) swig_add_library(dotnet_util TYPE OBJECT