ci: Add Makefile CI

* Add documentation
* Add docker layer diagram
* Add Docker/Makefile ci
* Add gh workflow
* gh workflow disable fail-fast
This commit is contained in:
Mizux Seiha
2020-04-02 00:12:08 +02:00
parent a4f01462a6
commit e7d5cde718
44 changed files with 2390 additions and 87 deletions

29
.github/workflows/docker_make.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Docker Make
on: [push, pull_request]
jobs:
Distros:
runs-on: ubuntu-latest
strategy:
matrix:
distro: [alpine, archlinux, centos, debian, fedora, opensuse, ubuntu]
lang: [cpp, python, dotnet, java]
fail-fast: false
env:
DISTRO: ${{ matrix.distro }}
LANG: ${{ matrix.lang }}
steps:
- uses: actions/checkout@v2
- name: Build base image
run: make --directory=makefiles ${DISTRO}_base
- name: Build env image
run: make --directory=makefiles ${DISTRO}_${LANG}_env
- name: Build devel image
run: make --directory=makefiles ${DISTRO}_${LANG}_devel
- name: Build project
run: make --directory=makefiles ${DISTRO}_${LANG}_build
- name: Test project
run: make --directory=makefiles ${DISTRO}_${LANG}_test
- name: Package project
run: make --directory=makefiles ${DISTRO}_${LANG}_package

304
makefiles/Makefile Normal file
View File

@@ -0,0 +1,304 @@
PROJECT := ortools
BUILD_SYSTEM := make
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
SHA1 := $(shell git rev-parse --verify HEAD)
# General commands
.PHONY: help
BOLD=\e[1m
RESET=\e[0m
help:
@echo -e "${BOLD}SYNOPSIS${RESET}"
@echo -e "\tmake <target> [NOCACHE=1]"
@echo
@echo -e "${BOLD}DESCRIPTION${RESET}"
@echo -e "\ttest build inside docker container to have a reproductible build."
@echo
@echo -e "${BOLD}MAKE TARGETS${RESET}"
@echo -e "\t${BOLD}help${RESET}: display this help and exit."
@echo
@echo -e "\t${BOLD}<prestage>${RESET}: build <prestage> docker images for ALL DISTROS."
@echo -e "\t${BOLD}<distro>_<prestage>${RESET}: build the <prestage> docker image for a specific distro."
@echo -e "\t${BOLD}save_<prestage>${RESET}: Save <prestage> docker images for ALL DISTROS."
@echo -e "\t${BOLD}save_<distro>_<prestage>${RESET}: Save the <prestage> docker image for a specific distro."
@echo -e "\t${BOLD}sh_<distro>_<prestage>${RESET}: run a container using the <prestage> docker image specified (debug purpose)."
@echo
@echo -e "\t${BOLD}<stage>${RESET}: build <stage> docker images for ALL DISTROS and ALL LANGUAGES."
@echo -e "\t${BOLD}<distro>_<stage>${RESET}: build <stage> docker images for a specific distro for ALL LANGUAGES."
@echo -e "\t${BOLD}<lang>_<stage>${RESET}: build <stage> docker images for ALL DISTROS for a specific language."
@echo -e "\t${BOLD}<distro>_<lang>_<stage>${RESET}: build the <stage> docker image for a specific distro for a specific language."
@echo -e "\t${BOLD}save_<stage>${RESET}: Save <stage> docker images for ALL DISTROS for ALL LANGUAGES."
@echo -e "\t${BOLD}save_<distro>_<stage>${RESET}: Save <stage> docker images for a specific distro for ALL LANGUAGES."
@echo -e "\t${BOLD}save_<lang>_<stage>${RESET}: Save <stage> docker images for ALL DISTRO for a specific language."
@echo -e "\t${BOLD}save_<distro>_<lang>_<stage>${RESET}: Save the <stage> docker image for a specific distro for a specific language."
@echo -e "\t${BOLD}sh_<distro>_<lang>_<stage>${RESET}: run a container using the <stage> docker image specified (debug purpose)."
@echo
@echo -e "\t${BOLD}<distro>${RESET}:"
@echo -e "\t\t${BOLD}alpine${RESET} (edge)"
@echo -e "\t\t${BOLD}archlinux${RESET} (latest)"
@echo -e "\t\t${BOLD}centos${RESET} (latest)"
@echo -e "\t\t${BOLD}debian${RESET} (latest)"
@echo -e "\t\t${BOLD}fedora${RESET} (latest)"
@echo -e "\t\t${BOLD}opensuse${RESET} (tumbleweed)"
@echo -e "\t\t${BOLD}ubuntu${RESET} (rolling)"
@echo -e "\te.g. 'make test_ubuntu'"
@echo
@echo -e "\t${BOLD}<prestage>${RESET}:"
@echo -e "\t\t${BOLD}base${RESET} (need by cpp)"
@echo -e "\t\t${BOLD}swig${RESET} (need by .Net, Java and Python)"
@echo -e "\te.g. 'make base'"
@echo
@echo -e "\t${BOLD}<lang>${RESET}:"
@echo -e "\t\t${BOLD}cpp${RESET} (C++)"
@echo -e "\t\t${BOLD}python${RESET} (Python >= 3)"
@echo -e "\t\t${BOLD}java${RESET} (Java >= 8)"
@echo -e "\t\t${BOLD}dotnet${RESET} (.Net Core >= 2.1)"
@echo -e "\te.g. 'make devel_cpp'"
@echo
@echo -e "\t${BOLD}<stage>${RESET}:"
@echo -e "\t\t${BOLD}env${RESET}"
@echo -e "\t\t${BOLD}devel${RESET}"
@echo -e "\t\t${BOLD}build${RESET}"
@echo -e "\t\t${BOLD}test${RESET}"
@echo -e "\t\t${BOLD}package${RESET}"
@echo -e "\te.g. 'make build'"
@echo
@echo
@echo -e "\t${BOLD}clean${RESET}: Remove cache and docker image."
@echo -e "\t${BOLD}clean_<distro>${RESET}: Remove cache and docker image for the specified distro."
@echo
@echo -e "\t${BOLD}NOCACHE=1${RESET}: use 'docker build --no-cache' when building container (default use cache)."
@echo
@echo -e "branch: $(BRANCH)"
@echo -e "sha1: $(SHA1)"
# Need to add cmd_distro to PHONY otherwise target are ignored since they do not
# contain recipe (using FORCE do not work here)
.PHONY: all
all: devel
# Delete all implicit rules to speed up makefile
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
# Keep all intermediate files
# ToDo: try to remove it later
.SECONDARY:
# Docker image name prefix.
IMAGE := ${PROJECT}/${BUILD_SYSTEM}
ifdef NOCACHE
DOCKER_BUILD_CMD := docker build --no-cache
else
DOCKER_BUILD_CMD := docker build
endif
DOCKER_RUN_CMD := docker run --rm --init --net=host
# Currently supported distro
DISTROS = alpine archlinux centos debian fedora opensuse ubuntu
LANGUAGES = cpp python java dotnet
# $* stem
# $< first prerequist
# $@ target name
###############
## PRESTAGES ##
###############
PRESTAGES = base swig
define make-prestage-target
#$$(info STAGE: $1)
#$$(info Create targets: $1 $(addsuffix _$1, $(DISTROS)).)
targets_$1 = $(addsuffix _$1, $(DISTROS))
.PHONY: $1 $$(targets_$1)
$1: $$(targets_$1)
$$(targets_$1): %_$1: docker/%/Dockerfile
#@docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null
${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_$1 -f $$< ..
#$$(info Create targets: save_$1 $(addprefix save_, $(addsuffix _$1, $(DISTROS))) (debug).)
save_targets_$1 = $(addprefix save_, $(addsuffix _$1, $(DISTROS)))
.PHONY: save_$1 $$(save_targets_$1)
save_$1: $$(save_targets_$1)
$$(save_targets_$1): save_%_$1: cache/%/docker_$1.tar
cache/%/docker_$1.tar: %_$1
@rm -f $$@
mkdir -p cache/$$*
docker save ${IMAGE}:$$*_$1 -o $$@
#$$(info Create targets: $(addprefix sh_, $(addsuffix _$1, $(DISTROS))) (debug).)
sh_targets_$1 = $(addprefix sh_, $(addsuffix _$1, $(DISTROS)))
.PHONY: $$(sh_targets_$1)
$$(sh_targets_$1): sh_%_$1: %_$1
${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_$1 ${IMAGE}:$$*_$1
#$$(info Create targets: $(addprefix clean_, $(addsuffix _$1, $(DISTROS))).)
clean_targets_$1 = $(addprefix clean_, $(addsuffix _$1, $(DISTROS)))
.PHONY: clean_$1 $$(clean_targets_$1)
clean_$1: $$(clean_targets_$1)
$$(clean_targets_$1): clean_%_$1:
docker image rm -f ${IMAGE}:$$*_$1 2>/dev/null
rm -f cache/$$*/docker_$1.tar
endef
$(foreach stage,$(PRESTAGES),$(eval $(call make-prestage-target,$(stage))))
############
## STAGES ##
############
STAGES = env devel build test package
define make-stage-target
#$$(info STAGE: $1)
#$$(info Create targets: $1 $(addsuffix _$1, $(DISTROS)).)
targets_$1 = $(addsuffix _$1, $(DISTROS))
.PHONY: $1 $$(targets_$1)
$1: $$(targets_$1)
$$(targets_$1): %_$1: $(addprefix %_, $(addsuffix _$1, $(LANGUAGES)))
#$$(info Create targets: $(addsuffix _$1, $(LANGUAGES)).)
targets_$1 = $(addsuffix _$1, $(LANGUAGES))
.PHONY: $$(targets_$1)
$$(targets_$1): %_$1: $(addsuffix _$1, $(addsuffix _%, $(DISTROS)))
#$$(info Create targets: $(addsuffix _cpp_$1, $(DISTROS)))
cpp_targets_$1 = $(addsuffix _cpp_$1, $(DISTROS))
#$$(info Create targets: $(addsuffix _dotnet_$1, $(DISTROS)))
dotnet_targets_$1 = $(addsuffix _dotnet_$1, $(DISTROS))
#$$(info Create targets: $(addsuffix _java_$1, $(DISTROS)))
java_targets_$1 = $(addsuffix _java_$1, $(DISTROS))
#$$(info Create targets: $(addsuffix _python_$1, $(DISTROS)))
python_targets_$1 = $(addsuffix _python_$1, $(DISTROS))
.PHONY: $$(cpp_targets_$1) $$(dotnet_targets_$1) $$(java_targets_$1) $$(python_targets_$1)
$$(cpp_targets_$1): %_cpp_$1: docker/%/cpp.Dockerfile %_base
#@docker image rm -f ${IMAGE}:$$*_cpp_$1 2>/dev/null
${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_cpp_$1 -f $$< ..
$$(dotnet_targets_$1): %_dotnet_$1: docker/%/dotnet.Dockerfile %_swig
#@docker image rm -f ${IMAGE}:$$*_dotnet_$1 2>/dev/null
${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_dotnet_$1 -f $$< ..
$$(java_targets_$1): %_java_$1: docker/%/java.Dockerfile %_swig
#@docker image rm -f ${IMAGE}:$$*_java_$1 2>/dev/null
${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_java_$1 -f $$< ..
$$(python_targets_$1): %_python_$1: docker/%/python.Dockerfile %_swig
#@docker image rm -f ${IMAGE}:$$*_python_$1 2>/dev/null
${DOCKER_BUILD_CMD} --target=$1 --tag ${IMAGE}:$$*_python_$1 -f $$< ..
# Save $1 docker images (debug).
#$$(info Create targets: save_$1 $(addprefix save_, $(addsuffix _$1, $(DISTROS))).)
targets_$1 = $(addprefix save_, $(addsuffix _$1, $(DISTROS)))
.PHONY: save_$1 $$(targets_$1)
save_$1: $$(targets_$1)
$$(targets_$1): save_%_$1: $(addprefix save_%_, $(addsuffix _$1, $(LANGUAGES)))
#$$(info Create targets: $(addprefix save_, $(addsuffix _$1, $(LANGUAGES))).)
targets_$1 = $(addprefix save_, $(addsuffix _$1, $(LANGUAGES)))
.PHONY: $$(targets_$1)
$$(targets_$1): save_%_$1: $(addprefix save_, $(addsuffix _%_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix save_, $(addsuffix _cpp_$1, $(DISTROS))))
cpp_targets_$1 = $(addprefix save_, $(addsuffix _cpp_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix save_, $(addsuffix _dotnet_$1, $(DISTROS))))
dotnet_targets_$1 = $(addprefix save_, $(addsuffix _dotnet_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix save_, $(addsuffix _java_$1, $(DISTROS))))
java_targets_$1 = $(addprefix save_, $(addsuffix _java_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix save_, $(addsuffix _python_$1, $(DISTROS))))
python_targets_$1 = $(addprefix save_, $(addsuffix _python_$1, $(DISTROS)))
.PHONY: $$(cpp_targets_$1) $$(dotnet_targets_$1) $$(java_targets_$1) $$(python_targets_$1)
$$(cpp_targets_$1): save_%_cpp_$1: cache/%/docker_cpp_$1.tar
cache/%/docker_cpp_$1.tar: %_cpp_$1
@rm -f $$@
mkdir -p cache/$$*
docker save ${IMAGE}:$$*_cpp_$1 -o $$@
$$(dotnet_targets_$1): save_%_dotnet_$1: cache/%/docker_dotnet_$1.tar
cache/%/docker_dotnet_$1.tar: %_dotnet_$1
@rm -f $$@
mkdir -p cache/$$*
docker save ${IMAGE}:$$*_dotnet_$1 -o $$@
$$(java_targets_$1): save_%_java_$1: cache/%/docker_java_$1.tar
cache/%/docker_java_$1.tar: %_java_$1
@rm -f $$@
mkdir -p cache/$$*
docker save ${IMAGE}:$$*_java_$1 -o $$@
$$(python_targets_$1): save_%_python_$1: cache/%/docker_python_$1.tar
cache/%/docker_python_$1.tar: %_python_$1
@rm -f $$@
mkdir -p cache/$$*
docker save ${IMAGE}:$$*_python_$1 -o $$@
# Run a container using the <distro>_<lang>_$1 image (debug).
#$$(info Create targets: $(addprefix sh_, $(addsuffix _cpp_$1, $(DISTROS))))
cpp_targets_$1 = $(addprefix sh_, $(addsuffix _cpp_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix sh_, $(addsuffix _dotnet_$1, $(DISTROS))))
dotnet_targets_$1 = $(addprefix sh_, $(addsuffix _dotnet_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix sh_, $(addsuffix _java_$1, $(DISTROS))))
java_targets_$1 = $(addprefix sh_, $(addsuffix _java_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix sh_, $(addsuffix _python_$1, $(DISTROS))))
python_targets_$1 = $(addprefix sh_, $(addsuffix _python_$1, $(DISTROS)))
.PHONY: $$(cpp_targets_$1) $$(dotnet_targets_$1) $$(java_targets_$1) $$(python_targets_$1)
$$(cpp_targets_$1): sh_%_cpp_$1: %_cpp_$1
${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_cpp_$1 ${IMAGE}:$$*_cpp_$1
$$(dotnet_targets_$1): sh_%_dotnet_$1: %_dotnet_$1
${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_dotnet_$1 ${IMAGE}:$$*_dotnet_$1
$$(java_targets_$1): sh_%_java_$1: %_java_$1
${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_java_$1 ${IMAGE}:$$*_java_$1
$$(python_targets_$1): sh_%_python_$1: %_python_$1
${DOCKER_RUN_CMD} -it --name ${PROJECT}_${BUILD_SYSTEM}_$$*_python_$1 ${IMAGE}:$$*_python_$1
# Clean $1 docker images.
#$$(info Create targets: clean_$1 $(addprefix clean_, $(addsuffix _$1, $(DISTROS))).)
targets_$1 = $(addprefix clean_, $(addsuffix _$1, $(DISTROS)))
.PHONY: clean_$1 $(targets_$1)
clean_$1: $$(targets_$1)
$$(targets_$1): clean_%_$1: $(addprefix clean_%_, $(addsuffix _$1, $(LANGUAGES)))
#$$(info Create targets: $(addprefix clean_, $(addsuffix _$1, $(LANGUAGES))).)
targets_$1 = $(addprefix clean_, $(addsuffix _$1, $(LANGUAGES)))
.PHONY: $$(targets_$1)
$$(targets_$1): clean_%_$1: $(addprefix clean_, $(addsuffix _%_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix clean_, $(addsuffix _cpp_$1, $(DISTROS))))
cpp_targets_$1 = $(addprefix clean_, $(addsuffix _cpp_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix clean_, $(addsuffix _dotnet_$1, $(DISTROS))))
dotnet_targets_$1 = $(addprefix clean_, $(addsuffix _dotnet_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix clean_, $(addsuffix _java_$1, $(DISTROS))))
java_targets_$1 = $(addprefix clean_, $(addsuffix _java_$1, $(DISTROS)))
#$$(info Create targets: $(addprefix clean_, $(addsuffix _python_$1, $(DISTROS))))
python_targets_$1 = $(addprefix clean_, $(addsuffix _python_$1, $(DISTROS)))
.PHONY: $$(cpp_targets_$1) $$(dotnet_targets_$1) $$(java_targets_$1) $$(python_targets_$1)
$$(cpp_targets_$1): clean_%_cpp_$1:
docker image rm -f ${IMAGE}:$$*_cpp_$1 2>/dev/null
rm -f cache/$$*/docker_cpp_$1.tar
$$(dotnet_targets_$1): clean_%_dotnet_$1:
docker image rm -f ${IMAGE}:$$*_dotnet_$1 2>/dev/null
rm -f cache/$$*/docker_dotnet_$1.tar
$$(java_targets_$1): clean_%_java_$1:
docker image rm -f ${IMAGE}:$$*_java_$1 2>/dev/null
rm -f cache/$$*/docker_java_$1.tar
$$(python_targets_$1): clean_%_python_$1:
docker image rm -f ${IMAGE}:$$*_python_$1 2>/dev/null
rm -f cache/$$*/docker_python_$1.tar
endef
$(foreach stage,$(STAGES),$(eval $(call make-stage-target,$(stage))))
# CLEAN
targets = $(addprefix clean_, $(DISTROS))
.PHONY: clean $(targets)
clean: $(targets)
docker container prune -f
docker image prune -f
-rmdir cache
$(targets): clean_%: $(addprefix clean_%_, $(PRESTAGES)) $(addprefix clean_%_, $(STAGES))
-rmdir cache/$*
.PHONY: distclean
distclean: clean
-docker container rm -f $$(docker container ls -aq)
-docker image rm -f $$(docker image ls -aq)

50
makefiles/README.md Normal file
View File

@@ -0,0 +1,50 @@
# OR-Tools Makefile Build Instructions
| OS | |
|:--------|------------------------------------|
| Linux | [![Status][linux_svg]][linux_link] |
| MacOS | [![Status][osx_svg]][osx_link] |
| Windows | [![Status][win_svg]][win_link] |
[linux_svg]: https://github.com/google/or-tools/workflows/Makefile/badge.svg
[linux_link]: https://github.com/google/or-tools/actions?query=workflow%3A"Makefile"
Dockers: [![Status][docker_svg]][docker_link]
[docker_svg]: https://github.com/google/or-tools/workflows/Docker%20Make/badge.svg
[docker_link]: https://github.com/google/or-tools/actions?query=workflow%3A"Docker+Make"
## Introduction
<nav for="make"> |
<a href="#deps">Dependencies</a> |
<a href="doc/ci.md">CI</a> |
</nav>
OR-Tools comes with a GNU Make based build ([Makefile](../Makefile)) that can be
used on a wide range of platforms.
## [Dependencies](#deps)
OR-Tools depends on severals mandatory libraries. You can compile them all
using the target `third_party` or you can compile few of them and give the
installation directory to the others using the Make variable below.
* ZLIB (`UNIX_ZLIB_DIR` or `WINDOWS_ZLIB_DIR`),
* Google Abseil-cpp (`UNIX_ABSL_DIR` or `WINDOWS_ABSL_DIR`),
* Google Gflags (`UNIX_GFLAG_DIR` or `WINDOWS_GFLAG_DIR`),
* Google Glog (`UNIX_GLOG_DIR` or `WINDOWS_GLOG_DIR`),
* Google Protobuf (`UNIX_PROTOBUF_DIR` or `WINDOWS_PROTOBUF_DIR`),
* COIN-OR CoinUtils (`UNIX_COINUTILS_DIR` or `WINDOWS_COINUTILS_DIR`),
* COIN-OR Osi (`UNIX_OSI_DIR` or `WINDOWS_OSI_DIR`),
* COIN-OR Clp (`UNIX_CLP_DIR` or `WINDOWS_CLP_DIR`),
* COIN-OR Cgl (`UNIX_CGL_DIR` or `WINDOWS_CGL_DIR`),
* COIN-OR Cbc (`UNIX_CBC_DIR` or `WINDOWS_CBC_DIR`),
OR-Tools also have few (ed compile time) optional solvers support (disabled by
default):
* SCIP (`UNIX_SCIP_DIR` or `WINDOWS_SCIP_DIR`),
* CPLEX (`UNIX_CPLEX_DIR` or `WINDOWS_CPLEX_DIR`),
* XPRESS (`UNIX_XPRESS_DIR` or `WINDOWS_XPRESS_DIR`)
**warning: Since these solvers require license and are proprietary, we can't
test it on public CI and support can be broken.**

37
makefiles/doc/ci.md Normal file
View File

@@ -0,0 +1,37 @@
# CI: Makefile/Docker testing
To test the build on various distro, I'm using docker containers and a Makefile for orchestration.
pros:
* You are independent of third party CI runner config (e.g. github actions runners or Travis-CI VM images).
* You can run it locally on your linux system.
* Most CI provide runner with docker and Makefile installed (e.g. tarvis-ci [minimal images](https://docs.travis-ci.com/user/languages/minimal-and-generic/).
cons:
* Only GNU/Linux distro supported.
* Could take few GiB (~30 GiB for all distro and all languages)
* ~500MiB OS + C++/CMake tools,
* ~150 MiB Python,
* ~400 MiB dotnet-sdk,
* ~400 MiB java-jdk.
# Usage
To get the help simply type:
```sh
make
```
note: you can also use from top directory
```sh
make --directory=makefiles
```
## Example
For example to test `Python` inside an `Alpine` container:
```sh
make alpine_python_test
```
# Docker layers
Dockerfile is splitted in several stages.
![docker](docker.svg)

71
makefiles/doc/docker.dot Normal file
View File

@@ -0,0 +1,71 @@
@startdot
digraph DockerDeps {
//rankdir=BT;
rankdir=TD;
node [shape=cylinder, style="rounded,filled", color=black, fillcolor=royalblue];
DISTRO_IMG [label="<distro>:latest"];
PKG [label="Build packages\ne.g. cmake, g++", shape=box3d];
PYPKG [label="Python packages\ne.g. python-dev", shape=box3d, fillcolor=gold];
JAVAPKG [label="Java packages\ne.g. openjdk", shape=box3d, fillcolor=crimson];
DOTNETPKG [label=".Net packages\ne.g. dotnet-cli", shape=box3d, fillcolor=forestgreen];
SRC [label="git repo", shape=folder];
SAMPLE [label="sample", shape=folder];
subgraph clusterDockerfile {
BASE_IMG [label="ortools/make:<distro>_base\nbase"];
SWIG_IMG [label="ortools/make:<distro>_swig\nswig"];
BASE_IMG -> SWIG_IMG;
color=royalblue;
label = "docker/<distro>/Dockerfile";
}
DISTRO_IMG -> BASE_IMG;
PKG -> BASE_IMG [label="install", style="dashed"];
// LANG
subgraph clusterLang {
LANGENV_IMG [label="ortools/make:<distro>_<lang>_env\nenv"];
LANGDEVEL_IMG [label="ortools/make:<distro>_<lang>_devel\ndevel"];
LANGBUILD_IMG [label="ortools/make:<distro>_<lang>_build\nbuild"];
LANGTEST_IMG [label="ortools/make:<distro>_<lang>_test\ntest"];
LANGPKG_IMG [label="ortools/make:<distro>_<lang>_package\ntest"];
LANGENV_IMG -> LANGDEVEL_IMG;
LANGDEVEL_IMG -> LANGBUILD_IMG;
LANGBUILD_IMG -> LANGTEST_IMG;
LANGBUILD_IMG -> LANGPKG_IMG;
color=royalblue;
label = "docker/<distro>/<lang>.Dockerfile";
}
SWIG_IMG -> LANGENV_IMG;
PYPKG -> LANGENV_IMG [label="install", style="dashed"];
JAVAPKG -> LANGENV_IMG [label="install", style="dashed"];
DOTNETPKG -> LANGENV_IMG [label="install", style="dashed"];
SRC -> LANGDEVEL_IMG [label="copy", style="dashed"];
subgraph clusterCache {
node [shape=note, style="rounded,filled", color=black, fillcolor=royalblue];
BASE_TAR [label="docker_base.tar"];
SWIG_TAR [label="docker_swig.tar"];
LANGENV_TAR [label="docker_<lang>_env.tar"];
LANGDEVEL_TAR [label="docker_<lang>_devel.tar"];
LANGBUILD_TAR [label="docker_<lang>_build.tar"];
LANGTEST_TAR [label="docker_<lang>_test.tar"];
LANGPKG_TAR [label="docker_<lang>_package.tar"];
edge [color=red];
BASE_IMG -> BASE_TAR [label="make save_<distro>_base"];
SWIG_IMG -> SWIG_TAR [label="make save_<distro>_swig"];
LANGENV_IMG -> LANGENV_TAR [label="make save_<distro>_<lang>_env"];
LANGDEVEL_IMG -> LANGDEVEL_TAR [label="make save_<distro>_<lang>_devel"];
LANGBUILD_IMG -> LANGBUILD_TAR [label="make save_<distro>_<lang>_build"];
LANGTEST_IMG -> LANGTEST_TAR [label="make save_<distro>_<lang>_test"];
LANGPKG_IMG -> LANGPKG_TAR [label="make save_<distro>_<lang>_package"];
color=royalblue;
label = "cache/<distro>/";
}
}
@enddot

325
makefiles/doc/docker.svg Normal file
View File

@@ -0,0 +1,325 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.3 (0)
-->
<!-- Title: DockerDeps Pages: 1 -->
<svg width="1606pt" height="818pt"
viewBox="0.00 0.00 1606.01 817.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 813.5)">
<title>DockerDeps</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-813.5 1602.01,-813.5 1602.01,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clusterDockerfile</title>
<polygon fill="none" stroke="royalblue" points="1089.01,-550 1089.01,-730.5 1325.01,-730.5 1325.01,-550 1089.01,-550"/>
<text text-anchor="middle" x="1207.01" y="-715.3" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/Dockerfile</text>
</g>
<g id="clust2" class="cluster">
<title>clusterLang</title>
<polygon fill="none" stroke="royalblue" points="265.01,-116 265.01,-517 881.01,-517 881.01,-116 265.01,-116"/>
<text text-anchor="middle" x="573.01" y="-501.8" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/&lt;lang&gt;.Dockerfile</text>
</g>
<g id="clust3" class="cluster">
<title>clusterCache</title>
<polygon fill="none" stroke="royalblue" points="67.01,-8 67.01,-83 1428.01,-83 1428.01,-8 67.01,-8"/>
<text text-anchor="middle" x="747.51" y="-67.8" font-family="Times,serif" font-size="14.00">cache/&lt;distro&gt;/</text>
</g>
<!-- DISTRO_IMG -->
<g id="node1" class="node">
<title>DISTRO_IMG</title>
<path fill="royalblue" stroke="black" d="M1196.01,-805.23C1196.01,-807.03 1167.33,-808.5 1132.01,-808.5 1096.7,-808.5 1068.01,-807.03 1068.01,-805.23 1068.01,-805.23 1068.01,-775.77 1068.01,-775.77 1068.01,-773.97 1096.7,-772.5 1132.01,-772.5 1167.33,-772.5 1196.01,-773.97 1196.01,-775.77 1196.01,-775.77 1196.01,-805.23 1196.01,-805.23"/>
<path fill="none" stroke="black" d="M1196.01,-805.23C1196.01,-803.42 1167.33,-801.95 1132.01,-801.95 1096.7,-801.95 1068.01,-803.42 1068.01,-805.23"/>
<text text-anchor="middle" x="1132.01" y="-786.8" font-family="Times,serif" font-size="14.00">&lt;distro&gt;:latest</text>
</g>
<!-- BASE_IMG -->
<g id="node8" class="node">
<title>BASE_IMG</title>
<path fill="royalblue" stroke="black" d="M1316.51,-694.85C1316.51,-697.49 1267.43,-699.63 1207.01,-699.63 1146.59,-699.63 1097.51,-697.49 1097.51,-694.85 1097.51,-694.85 1097.51,-651.9 1097.51,-651.9 1097.51,-649.26 1146.59,-647.12 1207.01,-647.12 1267.43,-647.12 1316.51,-649.26 1316.51,-651.9 1316.51,-651.9 1316.51,-694.85 1316.51,-694.85"/>
<path fill="none" stroke="black" d="M1316.51,-694.85C1316.51,-692.22 1267.43,-690.08 1207.01,-690.08 1146.59,-690.08 1097.51,-692.22 1097.51,-694.85"/>
<text text-anchor="middle" x="1207.01" y="-677.17" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_base</text>
<text text-anchor="middle" x="1207.01" y="-662.17" font-family="Times,serif" font-size="14.00">base</text>
</g>
<!-- DISTRO_IMG&#45;&gt;BASE_IMG -->
<g id="edge2" class="edge">
<title>DISTRO_IMG&#45;&gt;BASE_IMG</title>
<path fill="none" stroke="black" d="M1143.4,-772.01C1154.38,-755.17 1171.27,-729.24 1184.89,-708.34"/>
<polygon fill="black" stroke="black" points="1187.97,-710.02 1190.5,-699.73 1182.11,-706.19 1187.97,-710.02"/>
</g>
<!-- PKG -->
<g id="node2" class="node">
<title>PKG</title>
<polygon fill="royalblue" stroke="black" points="1349.51,-809.5 1218.51,-809.5 1214.51,-805.5 1214.51,-771.5 1345.51,-771.5 1349.51,-775.5 1349.51,-809.5"/>
<polyline fill="none" stroke="black" points="1345.51,-805.5 1214.51,-805.5 "/>
<polyline fill="none" stroke="black" points="1345.51,-805.5 1345.51,-771.5 "/>
<polyline fill="none" stroke="black" points="1345.51,-805.5 1349.51,-809.5 "/>
<text text-anchor="middle" x="1282.01" y="-794.3" font-family="Times,serif" font-size="14.00">Build packages</text>
<text text-anchor="middle" x="1282.01" y="-779.3" font-family="Times,serif" font-size="14.00">e.g. cmake, g++</text>
</g>
<!-- PKG&#45;&gt;BASE_IMG -->
<g id="edge3" class="edge">
<title>PKG&#45;&gt;BASE_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1270.13,-771.26C1259.14,-754.39 1242.54,-728.9 1229.11,-708.3"/>
<polygon fill="black" stroke="black" points="1231.97,-706.28 1223.58,-699.81 1226.11,-710.1 1231.97,-706.28"/>
<text text-anchor="middle" x="1279.51" y="-742.3" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- PYPKG -->
<g id="node3" class="node">
<title>PYPKG</title>
<polygon fill="gold" stroke="black" points="950.51,-603.12 817.51,-603.12 813.51,-599.12 813.51,-565.12 946.51,-565.12 950.51,-569.12 950.51,-603.12"/>
<polyline fill="none" stroke="black" points="946.51,-599.12 813.51,-599.12 "/>
<polyline fill="none" stroke="black" points="946.51,-599.12 946.51,-565.12 "/>
<polyline fill="none" stroke="black" points="946.51,-599.12 950.51,-603.12 "/>
<text text-anchor="middle" x="882.01" y="-587.92" font-family="Times,serif" font-size="14.00">Python packages</text>
<text text-anchor="middle" x="882.01" y="-572.92" font-family="Times,serif" font-size="14.00">e.g. python&#45;dev</text>
</g>
<!-- LANGENV_IMG -->
<g id="node10" class="node">
<title>LANGENV_IMG</title>
<path fill="royalblue" stroke="black" d="M872.51,-481.35C872.51,-483.99 811.33,-486.13 736.01,-486.13 660.7,-486.13 599.51,-483.99 599.51,-481.35 599.51,-481.35 599.51,-438.4 599.51,-438.4 599.51,-435.76 660.7,-433.62 736.01,-433.62 811.33,-433.62 872.51,-435.76 872.51,-438.4 872.51,-438.4 872.51,-481.35 872.51,-481.35"/>
<path fill="none" stroke="black" d="M872.51,-481.35C872.51,-478.72 811.33,-476.58 736.01,-476.58 660.7,-476.58 599.51,-478.72 599.51,-481.35"/>
<text text-anchor="middle" x="736.01" y="-463.68" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_&lt;lang&gt;_env</text>
<text text-anchor="middle" x="736.01" y="-448.68" font-family="Times,serif" font-size="14.00">env</text>
</g>
<!-- PYPKG&#45;&gt;LANGENV_IMG -->
<g id="edge9" class="edge">
<title>PYPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M860.47,-565.09C837.8,-546.11 801.66,-515.84 774.15,-492.81"/>
<polygon fill="black" stroke="black" points="776.2,-489.96 766.28,-486.22 771.7,-495.32 776.2,-489.96"/>
<text text-anchor="middle" x="848.51" y="-528.8" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- JAVAPKG -->
<g id="node4" class="node">
<title>JAVAPKG</title>
<polygon fill="crimson" stroke="black" points="658.51,-603.12 545.51,-603.12 541.51,-599.12 541.51,-565.12 654.51,-565.12 658.51,-569.12 658.51,-603.12"/>
<polyline fill="none" stroke="black" points="654.51,-599.12 541.51,-599.12 "/>
<polyline fill="none" stroke="black" points="654.51,-599.12 654.51,-565.12 "/>
<polyline fill="none" stroke="black" points="654.51,-599.12 658.51,-603.12 "/>
<text text-anchor="middle" x="600.01" y="-587.92" font-family="Times,serif" font-size="14.00">Java packages</text>
<text text-anchor="middle" x="600.01" y="-572.92" font-family="Times,serif" font-size="14.00">e.g. openjdk</text>
</g>
<!-- JAVAPKG&#45;&gt;LANGENV_IMG -->
<g id="edge10" class="edge">
<title>JAVAPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M620.08,-565.09C641.11,-546.19 674.57,-516.1 700.16,-493.11"/>
<polygon fill="black" stroke="black" points="702.72,-495.51 707.82,-486.22 698.04,-490.3 702.72,-495.51"/>
<text text-anchor="middle" x="685.51" y="-528.8" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- DOTNETPKG -->
<g id="node5" class="node">
<title>DOTNETPKG</title>
<polygon fill="forestgreen" stroke="black" points="795.01,-603.12 681.01,-603.12 677.01,-599.12 677.01,-565.12 791.01,-565.12 795.01,-569.12 795.01,-603.12"/>
<polyline fill="none" stroke="black" points="791.01,-599.12 677.01,-599.12 "/>
<polyline fill="none" stroke="black" points="791.01,-599.12 791.01,-565.12 "/>
<polyline fill="none" stroke="black" points="791.01,-599.12 795.01,-603.12 "/>
<text text-anchor="middle" x="736.01" y="-587.92" font-family="Times,serif" font-size="14.00">.Net packages</text>
<text text-anchor="middle" x="736.01" y="-572.92" font-family="Times,serif" font-size="14.00">e.g. dotnet&#45;cli</text>
</g>
<!-- DOTNETPKG&#45;&gt;LANGENV_IMG -->
<g id="edge11" class="edge">
<title>DOTNETPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M736.01,-565.09C736.01,-547.08 736.01,-518.93 736.01,-496.43"/>
<polygon fill="black" stroke="black" points="739.51,-496.22 736.01,-486.22 732.51,-496.22 739.51,-496.22"/>
<text text-anchor="middle" x="758.51" y="-528.8" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- SRC -->
<g id="node6" class="node">
<title>SRC</title>
<polygon fill="royalblue" stroke="black" points="1006.51,-477.88 1003.51,-481.88 982.51,-481.88 979.51,-477.88 933.51,-477.88 933.51,-441.88 1006.51,-441.88 1006.51,-477.88"/>
<text text-anchor="middle" x="970.01" y="-456.18" font-family="Times,serif" font-size="14.00">git repo</text>
</g>
<!-- LANGDEVEL_IMG -->
<g id="node11" class="node">
<title>LANGDEVEL_IMG</title>
<path fill="royalblue" stroke="black" d="M873.01,-378.1C873.01,-380.74 808.92,-382.88 730.01,-382.88 651.11,-382.88 587.01,-380.74 587.01,-378.1 587.01,-378.1 587.01,-335.15 587.01,-335.15 587.01,-332.51 651.11,-330.37 730.01,-330.37 808.92,-330.37 873.01,-332.51 873.01,-335.15 873.01,-335.15 873.01,-378.1 873.01,-378.1"/>
<path fill="none" stroke="black" d="M873.01,-378.1C873.01,-375.47 808.92,-373.33 730.01,-373.33 651.11,-373.33 587.01,-375.47 587.01,-378.1"/>
<text text-anchor="middle" x="730.01" y="-360.43" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_&lt;lang&gt;_devel</text>
<text text-anchor="middle" x="730.01" y="-345.43" font-family="Times,serif" font-size="14.00">devel</text>
</g>
<!-- SRC&#45;&gt;LANGDEVEL_IMG -->
<g id="edge12" class="edge">
<title>SRC&#45;&gt;LANGDEVEL_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M933.3,-443.39C897.7,-428.37 842.81,-405.21 799.03,-386.74"/>
<polygon fill="black" stroke="black" points="800.16,-383.42 789.58,-382.76 797.44,-389.87 800.16,-383.42"/>
<text text-anchor="middle" x="881.01" y="-404.55" font-family="Times,serif" font-size="14.00">copy</text>
</g>
<!-- SAMPLE -->
<g id="node7" class="node">
<title>SAMPLE</title>
<polygon fill="royalblue" stroke="black" points="1436.01,-808.5 1433.01,-812.5 1412.01,-812.5 1409.01,-808.5 1368.01,-808.5 1368.01,-772.5 1436.01,-772.5 1436.01,-808.5"/>
<text text-anchor="middle" x="1402.01" y="-786.8" font-family="Times,serif" font-size="14.00">sample</text>
</g>
<!-- SWIG_IMG -->
<g id="node9" class="node">
<title>SWIG_IMG</title>
<path fill="royalblue" stroke="black" d="M1316.51,-605.6C1316.51,-608.24 1267.43,-610.38 1207.01,-610.38 1146.59,-610.38 1097.51,-608.24 1097.51,-605.6 1097.51,-605.6 1097.51,-562.65 1097.51,-562.65 1097.51,-560.01 1146.59,-557.87 1207.01,-557.87 1267.43,-557.87 1316.51,-560.01 1316.51,-562.65 1316.51,-562.65 1316.51,-605.6 1316.51,-605.6"/>
<path fill="none" stroke="black" d="M1316.51,-605.6C1316.51,-602.97 1267.43,-600.83 1207.01,-600.83 1146.59,-600.83 1097.51,-602.97 1097.51,-605.6"/>
<text text-anchor="middle" x="1207.01" y="-587.92" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_swig</text>
<text text-anchor="middle" x="1207.01" y="-572.92" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- BASE_IMG&#45;&gt;SWIG_IMG -->
<g id="edge1" class="edge">
<title>BASE_IMG&#45;&gt;SWIG_IMG</title>
<path fill="none" stroke="black" d="M1207.01,-647.14C1207.01,-638.82 1207.01,-629.41 1207.01,-620.47"/>
<polygon fill="black" stroke="black" points="1210.51,-620.3 1207.01,-610.3 1203.51,-620.3 1210.51,-620.3"/>
</g>
<!-- BASE_TAR -->
<g id="node15" class="node">
<title>BASE_TAR</title>
<polygon fill="royalblue" stroke="black" points="1414.01,-52 1290.01,-52 1290.01,-16 1420.01,-16 1420.01,-46 1414.01,-52"/>
<polyline fill="none" stroke="black" points="1414.01,-52 1414.01,-46 "/>
<polyline fill="none" stroke="black" points="1420.01,-46 1414.01,-46 "/>
<text text-anchor="middle" x="1355.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_base.tar</text>
</g>
<!-- BASE_IMG&#45;&gt;BASE_TAR -->
<g id="edge13" class="edge">
<title>BASE_IMG&#45;&gt;BASE_TAR</title>
<path fill="none" stroke="red" d="M1316.54,-663.96C1364.48,-653.66 1410.01,-631.64 1410.01,-585.12 1410.01,-585.12 1410.01,-585.12 1410.01,-149.12 1410.01,-116.12 1391.11,-82.59 1375.47,-60.49"/>
<polygon fill="red" stroke="red" points="1378.21,-58.31 1369.46,-52.33 1372.57,-62.46 1378.21,-58.31"/>
<text text-anchor="middle" x="1504.01" y="-352.93" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_base</text>
</g>
<!-- SWIG_IMG&#45;&gt;LANGENV_IMG -->
<g id="edge8" class="edge">
<title>SWIG_IMG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" d="M1101.19,-559.85C1048.13,-547.79 982.97,-532.39 925.01,-517 892.77,-508.44 857.69,-498.26 826.6,-488.94"/>
<polygon fill="black" stroke="black" points="827.24,-485.48 816.66,-485.95 825.22,-492.18 827.24,-485.48"/>
</g>
<!-- SWIG_TAR -->
<g id="node16" class="node">
<title>SWIG_TAR</title>
<polygon fill="royalblue" stroke="black" points="1266.01,-52 1142.01,-52 1142.01,-16 1272.01,-16 1272.01,-46 1266.01,-52"/>
<polyline fill="none" stroke="black" points="1266.01,-52 1266.01,-46 "/>
<polyline fill="none" stroke="black" points="1272.01,-46 1266.01,-46 "/>
<text text-anchor="middle" x="1207.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_swig.tar</text>
</g>
<!-- SWIG_IMG&#45;&gt;SWIG_TAR -->
<g id="edge14" class="edge">
<title>SWIG_IMG&#45;&gt;SWIG_TAR</title>
<path fill="none" stroke="red" d="M1207.01,-557.84C1207.01,-533.12 1207.01,-494.41 1207.01,-460.88 1207.01,-460.88 1207.01,-460.88 1207.01,-149.12 1207.01,-119.36 1207.01,-85.24 1207.01,-62.11"/>
<polygon fill="red" stroke="red" points="1210.51,-62.01 1207.01,-52.01 1203.51,-62.02 1210.51,-62.01"/>
<text text-anchor="middle" x="1301.01" y="-301.3" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_swig</text>
</g>
<!-- LANGENV_IMG&#45;&gt;LANGDEVEL_IMG -->
<g id="edge4" class="edge">
<title>LANGENV_IMG&#45;&gt;LANGDEVEL_IMG</title>
<path fill="none" stroke="black" d="M734.52,-433.59C733.79,-421.38 732.91,-406.54 732.12,-393.22"/>
<polygon fill="black" stroke="black" points="735.6,-392.72 731.51,-382.94 728.61,-393.13 735.6,-392.72"/>
</g>
<!-- LANGENV_TAR -->
<g id="node17" class="node">
<title>LANGENV_TAR</title>
<polygon fill="royalblue" stroke="black" points="1118.01,-52 942.01,-52 942.01,-16 1124.01,-16 1124.01,-46 1118.01,-52"/>
<polyline fill="none" stroke="black" points="1118.01,-52 1118.01,-46 "/>
<polyline fill="none" stroke="black" points="1124.01,-46 1118.01,-46 "/>
<text text-anchor="middle" x="1033.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_env.tar</text>
</g>
<!-- LANGENV_IMG&#45;&gt;LANGENV_TAR -->
<g id="edge15" class="edge">
<title>LANGENV_IMG&#45;&gt;LANGENV_TAR</title>
<path fill="none" stroke="red" d="M806.66,-433.68C832.95,-421.53 861.37,-404.74 882.01,-382.75 933.77,-327.63 894.65,-277.64 951.01,-227.25 970.82,-209.54 990.82,-229.51 1008.01,-209.25 1043.11,-167.89 1041.56,-100.13 1037.31,-62.45"/>
<polygon fill="red" stroke="red" points="1040.74,-61.7 1036,-52.23 1033.8,-62.59 1040.74,-61.7"/>
<text text-anchor="middle" x="1072.01" y="-249.68" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_env</text>
</g>
<!-- LANGBUILD_IMG -->
<g id="node12" class="node">
<title>LANGBUILD_IMG</title>
<path fill="royalblue" stroke="black" d="M652.01,-274.85C652.01,-277.49 588.37,-279.63 510.01,-279.63 431.66,-279.63 368.01,-277.49 368.01,-274.85 368.01,-274.85 368.01,-231.9 368.01,-231.9 368.01,-229.26 431.66,-227.12 510.01,-227.12 588.37,-227.12 652.01,-229.26 652.01,-231.9 652.01,-231.9 652.01,-274.85 652.01,-274.85"/>
<path fill="none" stroke="black" d="M652.01,-274.85C652.01,-272.22 588.37,-270.08 510.01,-270.08 431.66,-270.08 368.01,-272.22 368.01,-274.85"/>
<text text-anchor="middle" x="510.01" y="-257.18" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_&lt;lang&gt;_build</text>
<text text-anchor="middle" x="510.01" y="-242.18" font-family="Times,serif" font-size="14.00">build</text>
</g>
<!-- LANGDEVEL_IMG&#45;&gt;LANGBUILD_IMG -->
<g id="edge5" class="edge">
<title>LANGDEVEL_IMG&#45;&gt;LANGBUILD_IMG</title>
<path fill="none" stroke="black" d="M675.35,-330.47C644.66,-316.34 606.19,-298.64 574.09,-283.86"/>
<polygon fill="black" stroke="black" points="575.33,-280.58 564.78,-279.58 572.4,-286.94 575.33,-280.58"/>
</g>
<!-- LANGDEVEL_TAR -->
<g id="node18" class="node">
<title>LANGDEVEL_TAR</title>
<polygon fill="royalblue" stroke="black" points="917.51,-52 726.51,-52 726.51,-16 923.51,-16 923.51,-46 917.51,-52"/>
<polyline fill="none" stroke="black" points="917.51,-52 917.51,-46 "/>
<polyline fill="none" stroke="black" points="923.51,-46 917.51,-46 "/>
<text text-anchor="middle" x="825.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_devel.tar</text>
</g>
<!-- LANGDEVEL_IMG&#45;&gt;LANGDEVEL_TAR -->
<g id="edge16" class="edge">
<title>LANGDEVEL_IMG&#45;&gt;LANGDEVEL_TAR</title>
<path fill="none" stroke="red" d="M725.27,-330.32C720.19,-294.66 717.14,-230.02 753.01,-194.25 794.01,-153.38 842.49,-218.54 882.01,-176.25 907.93,-148.52 902.42,-125.68 887.01,-91 881.38,-78.32 871.31,-67.31 860.89,-58.47"/>
<polygon fill="red" stroke="red" points="862.94,-55.63 852.93,-52.15 858.59,-61.11 862.94,-55.63"/>
<text text-anchor="middle" x="880.51" y="-198.05" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_devel</text>
</g>
<!-- LANGTEST_IMG -->
<g id="node13" class="node">
<title>LANGTEST_IMG</title>
<path fill="royalblue" stroke="black" d="M548.51,-171.6C548.51,-174.24 486.88,-176.38 411.01,-176.38 335.14,-176.38 273.51,-174.24 273.51,-171.6 273.51,-171.6 273.51,-128.65 273.51,-128.65 273.51,-126.01 335.14,-123.87 411.01,-123.87 486.88,-123.87 548.51,-126.01 548.51,-128.65 548.51,-128.65 548.51,-171.6 548.51,-171.6"/>
<path fill="none" stroke="black" d="M548.51,-171.6C548.51,-168.97 486.88,-166.83 411.01,-166.83 335.14,-166.83 273.51,-168.97 273.51,-171.6"/>
<text text-anchor="middle" x="411.01" y="-153.93" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_&lt;lang&gt;_test</text>
<text text-anchor="middle" x="411.01" y="-138.93" font-family="Times,serif" font-size="14.00">test</text>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGTEST_IMG -->
<g id="edge6" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGTEST_IMG</title>
<path fill="none" stroke="black" d="M485.29,-227.09C472.53,-214.04 456.82,-197.97 443.13,-183.97"/>
<polygon fill="black" stroke="black" points="445.26,-181.15 435.77,-176.44 440.26,-186.04 445.26,-181.15"/>
</g>
<!-- LANGPKG_IMG -->
<g id="node14" class="node">
<title>LANGPKG_IMG</title>
<path fill="royalblue" stroke="black" d="M873.01,-171.6C873.01,-174.24 804.44,-176.38 720.01,-176.38 635.59,-176.38 567.01,-174.24 567.01,-171.6 567.01,-171.6 567.01,-128.65 567.01,-128.65 567.01,-126.01 635.59,-123.87 720.01,-123.87 804.44,-123.87 873.01,-126.01 873.01,-128.65 873.01,-128.65 873.01,-171.6 873.01,-171.6"/>
<path fill="none" stroke="black" d="M873.01,-171.6C873.01,-168.97 804.44,-166.83 720.01,-166.83 635.59,-166.83 567.01,-168.97 567.01,-171.6"/>
<text text-anchor="middle" x="720.01" y="-153.93" font-family="Times,serif" font-size="14.00">ortools/make:&lt;distro&gt;_&lt;lang&gt;_package</text>
<text text-anchor="middle" x="720.01" y="-138.93" font-family="Times,serif" font-size="14.00">test</text>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGPKG_IMG -->
<g id="edge7" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGPKG_IMG</title>
<path fill="none" stroke="black" d="M562.19,-227.22C591.37,-213.15 627.89,-195.54 658.46,-180.8"/>
<polygon fill="black" stroke="black" points="660.25,-183.82 667.74,-176.33 657.21,-177.52 660.25,-183.82"/>
</g>
<!-- LANGBUILD_TAR -->
<g id="node19" class="node">
<title>LANGBUILD_TAR</title>
<polygon fill="royalblue" stroke="black" points="263.01,-52 75.01,-52 75.01,-16 269.01,-16 269.01,-46 263.01,-52"/>
<polyline fill="none" stroke="black" points="263.01,-52 263.01,-46 "/>
<polyline fill="none" stroke="black" points="269.01,-46 263.01,-46 "/>
<text text-anchor="middle" x="172.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_build.tar</text>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGBUILD_TAR -->
<g id="edge17" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGBUILD_TAR</title>
<path fill="none" stroke="red" d="M367.98,-250.54C237.31,-245.49 57.17,-228.84 12.01,-176.25 -5.43,-155.93 -2.01,-138.81 12.01,-116 29.89,-86.91 61.81,-67.88 92.46,-55.63"/>
<polygon fill="red" stroke="red" points="93.81,-58.86 101.91,-52.04 91.32,-52.32 93.81,-58.86"/>
<text text-anchor="middle" x="138.51" y="-146.43" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_build</text>
</g>
<!-- LANGTEST_TAR -->
<g id="node20" class="node">
<title>LANGTEST_TAR</title>
<polygon fill="royalblue" stroke="black" points="467.01,-52 287.01,-52 287.01,-16 473.01,-16 473.01,-46 467.01,-52"/>
<polyline fill="none" stroke="black" points="467.01,-52 467.01,-46 "/>
<polyline fill="none" stroke="black" points="473.01,-46 467.01,-46 "/>
<text text-anchor="middle" x="380.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_test.tar</text>
</g>
<!-- LANGTEST_IMG&#45;&gt;LANGTEST_TAR -->
<g id="edge18" class="edge">
<title>LANGTEST_IMG&#45;&gt;LANGTEST_TAR</title>
<path fill="none" stroke="red" d="M360.1,-123.9C354.06,-118.81 348.73,-112.86 345.01,-106 336.89,-90.99 344.89,-73.83 355.28,-60.14"/>
<polygon fill="red" stroke="red" points="358.25,-62.04 361.94,-52.11 352.86,-57.58 358.25,-62.04"/>
<text text-anchor="middle" x="467.01" y="-94.8" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_test</text>
</g>
<!-- LANGPKG_TAR -->
<g id="node21" class="node">
<title>LANGPKG_TAR</title>
<polygon fill="royalblue" stroke="black" points="702.51,-52 491.51,-52 491.51,-16 708.51,-16 708.51,-46 702.51,-52"/>
<polyline fill="none" stroke="black" points="702.51,-52 702.51,-46 "/>
<polyline fill="none" stroke="black" points="708.51,-46 702.51,-46 "/>
<text text-anchor="middle" x="600.01" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_package.tar</text>
</g>
<!-- LANGPKG_IMG&#45;&gt;LANGPKG_TAR -->
<g id="edge19" class="edge">
<title>LANGPKG_IMG&#45;&gt;LANGPKG_TAR</title>
<path fill="none" stroke="red" d="M632.48,-123.94C624.76,-118.99 617.72,-113.07 612.01,-106 602.25,-93.91 599.14,-76.82 598.52,-62.43"/>
<polygon fill="red" stroke="red" points="602.02,-62.07 598.47,-52.09 595.02,-62.11 602.02,-62.07"/>
<text text-anchor="middle" x="749.51" y="-94.8" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_package</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,7 +1,7 @@
#/usr/bin/env bash
set -ex
rm *.svg
rm -f *.svg
for i in *.dot; do
plantuml -Tsvg $i;
done

View File

@@ -1,100 +1,179 @@
// C++: royalblue
// Python: gold
// Java: crimson
// .Net: forestgreen
// F#: indigo
@startdot
digraph Make {
rankdir=BT;
//rankdir=BT;
rankdir=TD;
subgraph clusterPrerequisite {
node [shape=box, style=rounded];
M [label="Make/NMake"];
CM [label="CMake", color=royalblue];
SWIG [label="Swig\n(Unix)", color=chocolate];
PY [label="Python\n(2.7,3.5,3.6)", color=gold];
JV [label="Java", color=crimson];
MONO [label="Mono\n(Unix)", color=blueviolet];
FS [label="Fsharpc\n(Linux)", color=blueviolet];
DN [label="Dotnet", color=blueviolet];
M -> SWIG [arrowhead=none, style=invisible];
node [shape=box3d, style=filled, color=black];
M [label="Make", fillcolor=royalblue];
CM [label="CMake", fillcolor=royalblue];
SWIG [label="Swig\n(Unix)", fillcolor=chocolate];
PY [label="Python\n(3.5+)", fillcolor=gold];
JV [label="Java\n(openJDK 8+)", fillcolor=crimson];
NET [label=".Net Core SDK\n(3.0.101)", fillcolor=forestgreen];
FS [label=".Net F#", fillcolor=forestgreen];
M -> SWIG [arrowhead=none, style=invisible];
SWIG -> PY [arrowhead=none, style=invisible];
SWIG -> JV [arrowhead=none, style=invisible];
SWIG -> MONO [arrowhead=none, style=invisible];
MONO -> FS [arrowhead=none, style=invisible];
MONO -> DN [arrowhead=none, style=invisible];
SWIG -> NET [arrowhead=none, style=invisible];
NET -> FS [arrowhead=none, style=invisible];
label = "Prerequisite";
}
subgraph clusterOR {
node [shape=box,style=rounded];
OR [label="C++\n(make cc)", style="rounded,filled,bold", color=dimgrey, fillcolor=grey64];
OR_WPY [label="Python wrap", color=gold];
OR_PY [label="Python\n(make python)", style="rounded,filled,bold", color=gold, fillcolor=gold];
OR_WJV [label="Java wrap", color=crimson];
OR_JV [label="Java\n(make java)", style="rounded,filled,bold", color=crimson, fillcolor=crimson];
OR_WCS [label="C# wrap", color=blueviolet];
OR_CS [label="C#\n(make csharp)", style="rounded,filled,bold", color=blueviolet, fillcolor=purple];
OR_FS [label="F#\n(make fsharp)", style="rounded,filled,bold", color=blueviolet, fillcolor=purple];
OR_NS [label=".NetStandard\n(make netstandard)", style="rounded,filled,bold", color=blueviolet, fillcolor=purple];
OR -> OR_WPY [label="swig", color=chocolate];
OR_WPY -> OR_PY [label="python", color=gold];
OR -> OR_PY [label="python", color=gold];
OR -> OR_WJV [label="swig", color=chocolate];
OR_WJV -> OR_JV [label="javac", color=crimson];
OR -> OR_JV [label="javac", color=crimson];
OR -> OR_WCS [label="swig", color=chocolate];
OR_WCS -> OR_CS [label="Mono", color=blueviolet];
OR -> OR_CS [label="Mono", color=blueviolet];
OR_CS -> OR_FS [label="fsharpc", color=blueviolet];
OR_WCS -> OR_NS [label="dotnet", color=blueviolet];
OR -> OR_NS [label="dotnet", color=blueviolet];
node [shape=box, style="rounded,filled", color=black, fillcolor=royalblue];
subgraph clusterDeps {
node [shape=box,style=rounded];
Z [label="Zlib\n(Make)", color=dimgrey];
Z [label="Zlib\n(Make)", color=royalblue];
ABSL [label="Abseil-cpp\n(CMake)", color=royalblue];
GF [label="GFlags\n(CMake)", color=royalblue];
GL [label="GLog\n(CMake)", color=royalblue];
PB [label="Protobuf\n(CMake)", color=royalblue];
CBC [label="Cbc\n(Autotools)", color=dimgrey];
SWIG_WIN [label="Swig\n(Windows)", color=chocolate];
SCIP [label="SCIP",style="rounded,dashed"];
color=dimgrey;
label = "Dependencies\n(make third_party)";
}
Z -> OR;
PB -> OR;
GF -> OR;
GL -> OR;
CBC -> OR;
SCIP -> OR;
subgraph clusterPackage {
node [shape=component];
PKG_CC [label=".deb Package\n(make deb_archive)", style="filled", color=dimgrey];
PKG_PY [label="Pypi Package\n(make pypi_archive)", style="filled", color=gold];
PKG_JV [label="Maven Package\n(make maven_archive)", style="filled", color=crimson];
PKG_NS [label="Nuget Package\n(make nuget_archive)", style="filled", color=blueviolet];
color=dimgrey;
label = "Package";
}
OR -> PKG_CC [label="WIP", style="dotted", color=dimgrey];
OR_PY -> PKG_PY [color=gold];
OR_JV -> PKG_JV [label="WIP", style="dotted", color=crimson];
OR_CS -> PKG_NS [label="WIP", style="dotted", color=blueviolet];
OR_FS -> PKG_NS [label="WIP", style="dotted", color=blueviolet];
OR_NS -> PKG_NS [label="WIP", style="dotted", color=blueviolet];
subgraph clusterEX {
node [shape=box,style="rounded,dashed"];
EX_CC [label="C++\n(make test_cc)"];
EX_PY [label="Python\n(make test_python)", color=gold];
EX_JV [label="Java\n(make test_java)", color=crimson];
EX_CS [label="C#\n(make test_csharp)", color=blueviolet];
EX_FS [label="F#\n(make test_fsharp)", color=blueviolet];
EX_NS [label=".NetStandard\n(make test_netstandard)", color=blueviolet];
color=dimgrey;
label = "Examples";
}
OR -> EX_CC;
OR_PY -> EX_PY [color=gold];
OR_JV -> EX_JV [color=crimson];
OR_CS -> EX_CS [color=blueviolet];
OR_FS -> EX_FS [color=blueviolet];
OR_NS -> EX_NS [color=blueviolet];
color=dimgrey;
CU [label="CoinUtils\n(Autotools)", color=royalblue];
OSI [label="Osi\n(Autotools)", color=royalblue];
CLP [label="Clp\n(Autotools)", color=royalblue];
CGL [label="Cgl\n(Autotools)", color=royalblue];
CBC [label="Cbc\n(Autotools)", color=royalblue];
SWIG_WIN [label="Swigwin\n(Windows)", color=chocolate];
GLPK [label="GLPK",style="rounded,dashed", color=grey];
SCIP [label="SCIP",style="rounded,dashed", color=grey];
CPLEX [label="CPLEX",style="rounded,dashed", color=grey];
GUROBI [label="Gurobi",style="rounded,dashed", color=grey];
Z -> PB;
ABSL -> PB;
GF -> GL;
CU -> OSI;
CU -> CLP;
OSI -> CLP;
CU -> CGL;
OSI -> CGL;
CU -> CBC;
OSI -> CBC;
CLP -> CBC
CGL -> CBC
color=grey;
label = "Dependencies\nTarget: third_party";
} // clusterDeps
subgraph clusterCXX {
node [shape=box, style="rounded,filled", color=black, fillcolor=royalblue];
OR_SRC [label="OR-Tools src\nortools/...", shape=folder];
OR_CC [label="C++\nTarget: cc"];
PKG_CC [label=".tar.gz/.zip Archive\nTarget: package_cc", shape=box3d];
subgraph clusterCXXTest {
EX_CC [label="C++ Samples", shape=note];
label = "Examples\nTarget: test_cc";
}
OR_CC -> EX_CC;
Z -> OR_CC;
ABSL -> OR_CC;
GF -> OR_CC;
GL -> OR_CC;
PB -> OR_CC;
CLP -> OR_CC;
CBC -> OR_CC;
GLPK -> OR_CC;
SCIP -> OR_CC;
CPLEX -> OR_CC;
GUROBI -> OR_CC;
OR_CC -> PKG_CC [label="WIP", style="dotted", color=dimgrey];
color=royalblue;
label = "C++\nTarget: cc";
} // clusterCXX
subgraph clusterPython {
node [shape=box, style="rounded,filled", color=black, fillcolor=gold];
OR_WPY [label="C++ Python wrappers", shape=note];
OR_PY [label="Python files\nTarget: python", shape=note];
PKG_PY [label="Wheel Package\nTarget: package_python", shape=box3d];
subgraph clusterPythonTest {
EX_PY [label="Python Samples", shape=note];
label = "Examples\nTarget: test_python";
}
OR_PY -> EX_PY [color=gold];
OR_CC -> OR_WPY [label="swig", color=chocolate];
OR_CC -> OR_PY [label="swig", color=chocolate];
OR_WPY -> OR_PY [label="python", color=gold];
OR_PY -> PKG_PY [label="python setup.py", color=gold];
color=gold;
label = "Python\nTarget: python";
} // clusterPython
subgraph clusterJava {
node [shape=box, style="rounded,filled", color=black, fillcolor=crimson];
OR_WJV [label="C++ Java wrappers", shape=note];
OR_JV [label="Java files\nTarget: java", shape=note];
PKG_JV [label="Maven Package\nTarget: package_java", shape=box3d];
subgraph clusterJavaTest {
EX_JV [label="Java Samples", shape=note];
label = "Examples\nTarget: test_java";
}
OR_JV -> EX_JV [color=crimson];
OR_CC -> OR_WJV [label="swig", color=chocolate];
OR_CC -> OR_JV [label="swig", color=chocolate];
OR_WJV -> OR_JV [label="javac", color=crimson];
OR_JV -> PKG_JV [label="maven (WIP)", style="dotted", color=crimson];
color=crimson;
label = "Java\nTarget: java";
} // clusterJava
subgraph clusterNet {
node [shape=box, style="rounded,filled", color=black, fillcolor=forestgreen];
OR_WNET [label="C++ .Net wrappers", shape=note];
OR_NET [label=".Net files\nTarget: dotnet", shape=note];
OR_FS [label="F# files\nTarget: fsharp", shape=note];
PKG_NET_RT [label="Nuget Google.OrTools.runtime.rid.nupkg\nTarget: package_dotnet", shape=box3d];
PKG_NET [label="Nuget Google.OrTools.nupkg\nTarget: package_dotnet", shape=box3d];
PKG_FS [label="Nuget Google.OrTools.FSharp.nupkg\nTarget: package_dotnet", shape=box3d];
subgraph clusterNetTest {
EX_NET [label="C# Samples", shape=note];
EX_FS [label="F# Samples", shape=note];
label = "Examples\nTarget: test_dotnet";
}
OR_NET -> EX_NET [color=forestgreen];
OR_FS -> EX_FS [color=forestgreen];
OR_CC -> OR_WNET [label="swig", color=chocolate];
OR_CC -> OR_NET [label="swig", color=chocolate];
OR_WNET -> OR_NET [label="dotnet", color=forestgreen];
OR_NET -> OR_FS [label="dotnet", color=forestgreen];
PKG_NET -> OR_FS [label="dotnet", color=forestgreen];
OR_WNET -> PKG_NET_RT [label="dotnet package", color=forestgreen];
PKG_NET_RT -> PKG_NET [color=forestgreen];
OR_NET -> PKG_NET [label="dotnet package", color=forestgreen];
OR_FS -> PKG_FS [label="dotnet package", color=forestgreen];
color=forestgreen;
label = ".Net\nTarget: dotnet";
} // clusterNet
color=royalblue;
label = "OR-Tools (Makefile)";
}
}
} // clusterOR
} // digraph
@enddot
# vim tw:0
// vim tw:0

732
makefiles/doc/make.svg Normal file
View File

@@ -0,0 +1,732 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.42.3 (0)
-->
<!-- Title: Make Pages: 1 -->
<svg width="1978pt" height="1058pt"
viewBox="0.00 0.00 1978.00 1058.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1054)">
<title>Make</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1054 1974,-1054 1974,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clusterPrerequisite</title>
<polygon fill="none" stroke="black" points="8,-695 8,-995 364,-995 364,-695 8,-695"/>
<text text-anchor="middle" x="186" y="-979.8" font-family="Times,serif" font-size="14.00">Prerequisite</text>
</g>
<g id="clust2" class="cluster">
<title>clusterOR</title>
<polygon fill="none" stroke="royalblue" points="372,-8 372,-1042 1962,-1042 1962,-8 372,-8"/>
<text text-anchor="middle" x="1167" y="-1026.8" font-family="Times,serif" font-size="14.00">OR&#45;Tools (Makefile)</text>
</g>
<g id="clust3" class="cluster">
<title>clusterDeps</title>
<polygon fill="none" stroke="grey" points="380,-694 380,-1011 1206,-1011 1206,-694 380,-694"/>
<text text-anchor="middle" x="793" y="-995.8" font-family="Times,serif" font-size="14.00">Dependencies</text>
<text text-anchor="middle" x="793" y="-980.8" font-family="Times,serif" font-size="14.00">Target: third_party</text>
</g>
<g id="clust4" class="cluster">
<title>clusterCXX</title>
<polygon fill="none" stroke="royalblue" points="380,-452 380,-675 690,-675 690,-452 380,-452"/>
<text text-anchor="middle" x="535" y="-659.8" font-family="Times,serif" font-size="14.00">C++</text>
<text text-anchor="middle" x="535" y="-644.8" font-family="Times,serif" font-size="14.00">Target: cc</text>
</g>
<g id="clust5" class="cluster">
<title>clusterCXXTest</title>
<polygon fill="none" stroke="black" points="550,-460 550,-550 682,-550 682,-460 550,-460"/>
<text text-anchor="middle" x="616" y="-534.8" font-family="Times,serif" font-size="14.00">Examples</text>
<text text-anchor="middle" x="616" y="-519.8" font-family="Times,serif" font-size="14.00">Target: test_cc</text>
</g>
<g id="clust6" class="cluster">
<title>clusterPython</title>
<polygon fill="none" stroke="gold" points="698,-234 698,-550 1064,-550 1064,-234 698,-234"/>
<text text-anchor="middle" x="881" y="-534.8" font-family="Times,serif" font-size="14.00">Python</text>
<text text-anchor="middle" x="881" y="-519.8" font-family="Times,serif" font-size="14.00">Target: python</text>
</g>
<g id="clust7" class="cluster">
<title>clusterPythonTest</title>
<polygon fill="none" stroke="black" points="900,-242 900,-332 1056,-332 1056,-242 900,-242"/>
<text text-anchor="middle" x="978" y="-316.8" font-family="Times,serif" font-size="14.00">Examples</text>
<text text-anchor="middle" x="978" y="-301.8" font-family="Times,serif" font-size="14.00">Target: test_python</text>
</g>
<g id="clust8" class="cluster">
<title>clusterJava</title>
<polygon fill="none" stroke="crimson" points="1072,-234 1072,-550 1398,-550 1398,-234 1072,-234"/>
<text text-anchor="middle" x="1235" y="-534.8" font-family="Times,serif" font-size="14.00">Java</text>
<text text-anchor="middle" x="1235" y="-519.8" font-family="Times,serif" font-size="14.00">Target: java</text>
</g>
<g id="clust9" class="cluster">
<title>clusterJavaTest</title>
<polygon fill="none" stroke="black" points="1254,-242 1254,-332 1390,-332 1390,-242 1254,-242"/>
<text text-anchor="middle" x="1322" y="-316.8" font-family="Times,serif" font-size="14.00">Examples</text>
<text text-anchor="middle" x="1322" y="-301.8" font-family="Times,serif" font-size="14.00">Target: test_java</text>
</g>
<g id="clust10" class="cluster">
<title>clusterNet</title>
<polygon fill="none" stroke="forestgreen" points="1406,-16 1406,-550 1954,-550 1954,-16 1406,-16"/>
<text text-anchor="middle" x="1680" y="-534.8" font-family="Times,serif" font-size="14.00">.Net</text>
<text text-anchor="middle" x="1680" y="-519.8" font-family="Times,serif" font-size="14.00">Target: dotnet</text>
</g>
<g id="clust11" class="cluster">
<title>clusterNetTest</title>
<polygon fill="none" stroke="black" points="1704,-24 1704,-114 1946,-114 1946,-24 1704,-24"/>
<text text-anchor="middle" x="1825" y="-98.8" font-family="Times,serif" font-size="14.00">Examples</text>
<text text-anchor="middle" x="1825" y="-83.8" font-family="Times,serif" font-size="14.00">Target: test_dotnet</text>
</g>
<!-- M -->
<g id="node1" class="node">
<title>M</title>
<polygon fill="royalblue" stroke="black" points="187,-964 135,-964 131,-960 131,-928 183,-928 187,-932 187,-964"/>
<polyline fill="none" stroke="black" points="183,-960 131,-960 "/>
<polyline fill="none" stroke="black" points="183,-960 183,-928 "/>
<polyline fill="none" stroke="black" points="183,-960 187,-964 "/>
<text text-anchor="middle" x="159" y="-942.3" font-family="Times,serif" font-size="14.00">Make</text>
</g>
<!-- SWIG -->
<g id="node3" class="node">
<title>SWIG</title>
<polygon fill="chocolate" stroke="black" points="189.5,-890 132.5,-890 128.5,-886 128.5,-852 185.5,-852 189.5,-856 189.5,-890"/>
<polyline fill="none" stroke="black" points="185.5,-886 128.5,-886 "/>
<polyline fill="none" stroke="black" points="185.5,-886 185.5,-852 "/>
<polyline fill="none" stroke="black" points="185.5,-886 189.5,-890 "/>
<text text-anchor="middle" x="159" y="-874.8" font-family="Times,serif" font-size="14.00">Swig</text>
<text text-anchor="middle" x="159" y="-859.8" font-family="Times,serif" font-size="14.00">(Unix)</text>
</g>
<!-- M&#45;&gt;SWIG -->
<g id="edge1" class="edge">
<title>M&#45;&gt;SWIG</title>
</g>
<!-- CM -->
<g id="node2" class="node">
<title>CM</title>
<polygon fill="royalblue" stroke="black" points="98,-964 36,-964 32,-960 32,-928 94,-928 98,-932 98,-964"/>
<polyline fill="none" stroke="black" points="94,-960 32,-960 "/>
<polyline fill="none" stroke="black" points="94,-960 94,-928 "/>
<polyline fill="none" stroke="black" points="94,-960 98,-964 "/>
<text text-anchor="middle" x="65" y="-942.3" font-family="Times,serif" font-size="14.00">CMake</text>
</g>
<!-- PY -->
<g id="node4" class="node">
<title>PY</title>
<polygon fill="gold" stroke="black" points="83.5,-815 20.5,-815 16.5,-811 16.5,-777 79.5,-777 83.5,-781 83.5,-815"/>
<polyline fill="none" stroke="black" points="79.5,-811 16.5,-811 "/>
<polyline fill="none" stroke="black" points="79.5,-811 79.5,-777 "/>
<polyline fill="none" stroke="black" points="79.5,-811 83.5,-815 "/>
<text text-anchor="middle" x="50" y="-799.8" font-family="Times,serif" font-size="14.00">Python</text>
<text text-anchor="middle" x="50" y="-784.8" font-family="Times,serif" font-size="14.00">(3.5+)</text>
</g>
<!-- SWIG&#45;&gt;PY -->
<g id="edge2" class="edge">
<title>SWIG&#45;&gt;PY</title>
</g>
<!-- JV -->
<g id="node5" class="node">
<title>JV</title>
<polygon fill="crimson" stroke="black" points="216,-815 106,-815 102,-811 102,-777 212,-777 216,-781 216,-815"/>
<polyline fill="none" stroke="black" points="212,-811 102,-811 "/>
<polyline fill="none" stroke="black" points="212,-811 212,-777 "/>
<polyline fill="none" stroke="black" points="212,-811 216,-815 "/>
<text text-anchor="middle" x="159" y="-799.8" font-family="Times,serif" font-size="14.00">Java</text>
<text text-anchor="middle" x="159" y="-784.8" font-family="Times,serif" font-size="14.00">(openJDK 8+)</text>
</g>
<!-- SWIG&#45;&gt;JV -->
<g id="edge3" class="edge">
<title>SWIG&#45;&gt;JV</title>
</g>
<!-- NET -->
<g id="node6" class="node">
<title>NET</title>
<polygon fill="forestgreen" stroke="black" points="356,-815 238,-815 234,-811 234,-777 352,-777 356,-781 356,-815"/>
<polyline fill="none" stroke="black" points="352,-811 234,-811 "/>
<polyline fill="none" stroke="black" points="352,-811 352,-777 "/>
<polyline fill="none" stroke="black" points="352,-811 356,-815 "/>
<text text-anchor="middle" x="295" y="-799.8" font-family="Times,serif" font-size="14.00">.Net Core SDK</text>
<text text-anchor="middle" x="295" y="-784.8" font-family="Times,serif" font-size="14.00">(3.0.101)</text>
</g>
<!-- SWIG&#45;&gt;NET -->
<g id="edge4" class="edge">
<title>SWIG&#45;&gt;NET</title>
</g>
<!-- FS -->
<g id="node7" class="node">
<title>FS</title>
<polygon fill="forestgreen" stroke="black" points="332,-739 262,-739 258,-735 258,-703 328,-703 332,-707 332,-739"/>
<polyline fill="none" stroke="black" points="328,-735 258,-735 "/>
<polyline fill="none" stroke="black" points="328,-735 328,-703 "/>
<polyline fill="none" stroke="black" points="328,-735 332,-739 "/>
<text text-anchor="middle" x="295" y="-717.3" font-family="Times,serif" font-size="14.00">.Net F#</text>
</g>
<!-- NET&#45;&gt;FS -->
<g id="edge5" class="edge">
<title>NET&#45;&gt;FS</title>
</g>
<!-- Z -->
<g id="node8" class="node">
<title>Z</title>
<path fill="royalblue" stroke="royalblue" d="M556,-965C556,-965 514,-965 514,-965 508,-965 502,-959 502,-953 502,-953 502,-939 502,-939 502,-933 508,-927 514,-927 514,-927 556,-927 556,-927 562,-927 568,-933 568,-939 568,-939 568,-953 568,-953 568,-959 562,-965 556,-965"/>
<text text-anchor="middle" x="535" y="-949.8" font-family="Times,serif" font-size="14.00">Zlib</text>
<text text-anchor="middle" x="535" y="-934.8" font-family="Times,serif" font-size="14.00">(Make)</text>
</g>
<!-- PB -->
<g id="node12" class="node">
<title>PB</title>
<path fill="royalblue" stroke="royalblue" d="M537.5,-890C537.5,-890 482.5,-890 482.5,-890 476.5,-890 470.5,-884 470.5,-878 470.5,-878 470.5,-864 470.5,-864 470.5,-858 476.5,-852 482.5,-852 482.5,-852 537.5,-852 537.5,-852 543.5,-852 549.5,-858 549.5,-864 549.5,-864 549.5,-878 549.5,-878 549.5,-884 543.5,-890 537.5,-890"/>
<text text-anchor="middle" x="510" y="-874.8" font-family="Times,serif" font-size="14.00">Protobuf</text>
<text text-anchor="middle" x="510" y="-859.8" font-family="Times,serif" font-size="14.00">(CMake)</text>
</g>
<!-- Z&#45;&gt;PB -->
<g id="edge6" class="edge">
<title>Z&#45;&gt;PB</title>
<path fill="none" stroke="black" d="M528.82,-926.96C526,-918.71 522.59,-908.75 519.45,-899.6"/>
<polygon fill="black" stroke="black" points="522.75,-898.42 516.2,-890.09 516.12,-900.68 522.75,-898.42"/>
</g>
<!-- OR_CC -->
<g id="node24" class="node">
<title>OR_CC</title>
<path fill="royalblue" stroke="black" d="M545.5,-629C545.5,-629 482.5,-629 482.5,-629 476.5,-629 470.5,-623 470.5,-617 470.5,-617 470.5,-603 470.5,-603 470.5,-597 476.5,-591 482.5,-591 482.5,-591 545.5,-591 545.5,-591 551.5,-591 557.5,-597 557.5,-603 557.5,-603 557.5,-617 557.5,-617 557.5,-623 551.5,-629 545.5,-629"/>
<text text-anchor="middle" x="514" y="-613.8" font-family="Times,serif" font-size="14.00">C++</text>
<text text-anchor="middle" x="514" y="-598.8" font-family="Times,serif" font-size="14.00">Target: cc</text>
</g>
<!-- Z&#45;&gt;OR_CC -->
<g id="edge19" class="edge">
<title>Z&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M568.23,-930C571.17,-928.91 574.12,-927.89 577,-927 665.11,-899.88 777,-964.19 777,-872 777,-872 777,-872 777,-720 777,-624.55 648.62,-724.49 567,-675 551.82,-665.8 538.99,-650.65 529.76,-637.41"/>
<polygon fill="black" stroke="black" points="532.66,-635.46 524.22,-629.06 526.83,-639.33 532.66,-635.46"/>
</g>
<!-- ABSL -->
<g id="node9" class="node">
<title>ABSL</title>
<path fill="royalblue" stroke="royalblue" d="M664,-965C664,-965 598,-965 598,-965 592,-965 586,-959 586,-953 586,-953 586,-939 586,-939 586,-933 592,-927 598,-927 598,-927 664,-927 664,-927 670,-927 676,-933 676,-939 676,-939 676,-953 676,-953 676,-959 670,-965 664,-965"/>
<text text-anchor="middle" x="631" y="-949.8" font-family="Times,serif" font-size="14.00">Abseil&#45;cpp</text>
<text text-anchor="middle" x="631" y="-934.8" font-family="Times,serif" font-size="14.00">(CMake)</text>
</g>
<!-- ABSL&#45;&gt;PB -->
<g id="edge7" class="edge">
<title>ABSL&#45;&gt;PB</title>
<path fill="none" stroke="black" d="M601.09,-926.96C585.24,-917.39 565.58,-905.53 548.59,-895.28"/>
<polygon fill="black" stroke="black" points="550.36,-892.26 539.99,-890.09 546.74,-898.25 550.36,-892.26"/>
</g>
<!-- ABSL&#45;&gt;OR_CC -->
<g id="edge20" class="edge">
<title>ABSL&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M676.2,-929.78C679.51,-928.8 682.8,-927.86 686,-927 739.17,-912.71 797,-927.06 797,-872 797,-872 797,-872 797,-720 797,-706.66 792.84,-701.78 782,-694 761.75,-679.47 751.74,-686.08 727,-683 709.34,-680.8 582.91,-682.97 567,-675 550.92,-666.94 537.93,-651.55 528.83,-637.88"/>
<polygon fill="black" stroke="black" points="531.7,-635.86 523.43,-629.24 525.77,-639.57 531.7,-635.86"/>
</g>
<!-- GF -->
<g id="node10" class="node">
<title>GF</title>
<path fill="royalblue" stroke="royalblue" d="M759.5,-965C759.5,-965 706.5,-965 706.5,-965 700.5,-965 694.5,-959 694.5,-953 694.5,-953 694.5,-939 694.5,-939 694.5,-933 700.5,-927 706.5,-927 706.5,-927 759.5,-927 759.5,-927 765.5,-927 771.5,-933 771.5,-939 771.5,-939 771.5,-953 771.5,-953 771.5,-959 765.5,-965 759.5,-965"/>
<text text-anchor="middle" x="733" y="-949.8" font-family="Times,serif" font-size="14.00">GFlags</text>
<text text-anchor="middle" x="733" y="-934.8" font-family="Times,serif" font-size="14.00">(CMake)</text>
</g>
<!-- GL -->
<g id="node11" class="node">
<title>GL</title>
<path fill="royalblue" stroke="royalblue" d="M632.5,-890C632.5,-890 579.5,-890 579.5,-890 573.5,-890 567.5,-884 567.5,-878 567.5,-878 567.5,-864 567.5,-864 567.5,-858 573.5,-852 579.5,-852 579.5,-852 632.5,-852 632.5,-852 638.5,-852 644.5,-858 644.5,-864 644.5,-864 644.5,-878 644.5,-878 644.5,-884 638.5,-890 632.5,-890"/>
<text text-anchor="middle" x="606" y="-874.8" font-family="Times,serif" font-size="14.00">GLog</text>
<text text-anchor="middle" x="606" y="-859.8" font-family="Times,serif" font-size="14.00">(CMake)</text>
</g>
<!-- GF&#45;&gt;GL -->
<g id="edge8" class="edge">
<title>GF&#45;&gt;GL</title>
<path fill="none" stroke="black" d="M701.61,-926.96C684.97,-917.39 664.34,-905.53 646.51,-895.28"/>
<polygon fill="black" stroke="black" points="647.89,-892.04 637.47,-890.09 644.4,-898.11 647.89,-892.04"/>
</g>
<!-- GF&#45;&gt;OR_CC -->
<g id="edge21" class="edge">
<title>GF&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M771.56,-928.97C793.64,-916.96 817,-898.08 817,-872 817,-872 817,-872 817,-720 817,-706.66 812.89,-701.71 802,-694 780.23,-678.59 769.5,-686.06 743,-683 723.55,-680.76 584.52,-683.73 567,-675 550.9,-666.98 537.91,-651.59 528.82,-637.91"/>
<polygon fill="black" stroke="black" points="531.68,-635.89 523.42,-629.26 525.75,-639.6 531.68,-635.89"/>
</g>
<!-- GL&#45;&gt;OR_CC -->
<g id="edge22" class="edge">
<title>GL&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M567.4,-854.8C564.57,-853.81 561.75,-852.87 559,-852 494.76,-831.69 453.42,-868.14 412,-815 366.99,-757.26 440.21,-676.51 484.35,-636.11"/>
<polygon fill="black" stroke="black" points="486.85,-638.56 491.95,-629.28 482.17,-633.35 486.85,-638.56"/>
</g>
<!-- PB&#45;&gt;OR_CC -->
<g id="edge23" class="edge">
<title>PB&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M470.46,-868.83C444.74,-865.76 412.93,-857.1 396,-834 356.33,-779.87 363.15,-741.52 396,-683 410.06,-657.95 436.77,-640.58 461.23,-629.19"/>
<polygon fill="black" stroke="black" points="462.73,-632.36 470.46,-625.11 459.9,-625.95 462.73,-632.36"/>
</g>
<!-- CU -->
<g id="node13" class="node">
<title>CU</title>
<path fill="royalblue" stroke="royalblue" d="M471.5,-965C471.5,-965 400.5,-965 400.5,-965 394.5,-965 388.5,-959 388.5,-953 388.5,-953 388.5,-939 388.5,-939 388.5,-933 394.5,-927 400.5,-927 400.5,-927 471.5,-927 471.5,-927 477.5,-927 483.5,-933 483.5,-939 483.5,-939 483.5,-953 483.5,-953 483.5,-959 477.5,-965 471.5,-965"/>
<text text-anchor="middle" x="436" y="-949.8" font-family="Times,serif" font-size="14.00">CoinUtils</text>
<text text-anchor="middle" x="436" y="-934.8" font-family="Times,serif" font-size="14.00">(Autotools)</text>
</g>
<!-- OSI -->
<g id="node14" class="node">
<title>OSI</title>
<path fill="royalblue" stroke="royalblue" d="M745.5,-890C745.5,-890 674.5,-890 674.5,-890 668.5,-890 662.5,-884 662.5,-878 662.5,-878 662.5,-864 662.5,-864 662.5,-858 668.5,-852 674.5,-852 674.5,-852 745.5,-852 745.5,-852 751.5,-852 757.5,-858 757.5,-864 757.5,-864 757.5,-878 757.5,-878 757.5,-884 751.5,-890 745.5,-890"/>
<text text-anchor="middle" x="710" y="-874.8" font-family="Times,serif" font-size="14.00">Osi</text>
<text text-anchor="middle" x="710" y="-859.8" font-family="Times,serif" font-size="14.00">(Autotools)</text>
</g>
<!-- CU&#45;&gt;OSI -->
<g id="edge9" class="edge">
<title>CU&#45;&gt;OSI</title>
<path fill="none" stroke="black" d="M483.5,-929.69C486.71,-928.75 489.9,-927.85 493,-927 560.8,-908.54 581.45,-909.36 652.54,-890.29"/>
<polygon fill="black" stroke="black" points="653.69,-893.6 662.42,-887.6 651.86,-886.85 653.69,-893.6"/>
</g>
<!-- CLP -->
<g id="node15" class="node">
<title>CLP</title>
<path fill="royalblue" stroke="royalblue" d="M503.5,-815C503.5,-815 432.5,-815 432.5,-815 426.5,-815 420.5,-809 420.5,-803 420.5,-803 420.5,-789 420.5,-789 420.5,-783 426.5,-777 432.5,-777 432.5,-777 503.5,-777 503.5,-777 509.5,-777 515.5,-783 515.5,-789 515.5,-789 515.5,-803 515.5,-803 515.5,-809 509.5,-815 503.5,-815"/>
<text text-anchor="middle" x="468" y="-799.8" font-family="Times,serif" font-size="14.00">Clp</text>
<text text-anchor="middle" x="468" y="-784.8" font-family="Times,serif" font-size="14.00">(Autotools)</text>
</g>
<!-- CU&#45;&gt;CLP -->
<g id="edge10" class="edge">
<title>CU&#45;&gt;CLP</title>
<path fill="none" stroke="black" d="M429.57,-926.72C422.57,-903.48 414.31,-862.81 430,-833 431.9,-829.39 434.3,-825.95 436.96,-822.71"/>
<polygon fill="black" stroke="black" points="439.76,-824.85 444.01,-815.15 434.63,-820.08 439.76,-824.85"/>
</g>
<!-- CGL -->
<g id="node16" class="node">
<title>CGL</title>
<path fill="royalblue" stroke="royalblue" d="M637.5,-815C637.5,-815 566.5,-815 566.5,-815 560.5,-815 554.5,-809 554.5,-803 554.5,-803 554.5,-789 554.5,-789 554.5,-783 560.5,-777 566.5,-777 566.5,-777 637.5,-777 637.5,-777 643.5,-777 649.5,-783 649.5,-789 649.5,-789 649.5,-803 649.5,-803 649.5,-809 643.5,-815 637.5,-815"/>
<text text-anchor="middle" x="602" y="-799.8" font-family="Times,serif" font-size="14.00">Cgl</text>
<text text-anchor="middle" x="602" y="-784.8" font-family="Times,serif" font-size="14.00">(Autotools)</text>
</g>
<!-- CU&#45;&gt;CGL -->
<g id="edge12" class="edge">
<title>CU&#45;&gt;CGL</title>
<path fill="none" stroke="black" d="M436.41,-927C437.82,-906.42 443.12,-872.9 462,-852 473.71,-839.04 511.42,-824.6 544.75,-813.77"/>
<polygon fill="black" stroke="black" points="546,-817.05 554.47,-810.67 543.88,-810.38 546,-817.05"/>
</g>
<!-- CBC -->
<g id="node17" class="node">
<title>CBC</title>
<path fill="royalblue" stroke="royalblue" d="M570.5,-740C570.5,-740 499.5,-740 499.5,-740 493.5,-740 487.5,-734 487.5,-728 487.5,-728 487.5,-714 487.5,-714 487.5,-708 493.5,-702 499.5,-702 499.5,-702 570.5,-702 570.5,-702 576.5,-702 582.5,-708 582.5,-714 582.5,-714 582.5,-728 582.5,-728 582.5,-734 576.5,-740 570.5,-740"/>
<text text-anchor="middle" x="535" y="-724.8" font-family="Times,serif" font-size="14.00">Cbc</text>
<text text-anchor="middle" x="535" y="-709.8" font-family="Times,serif" font-size="14.00">(Autotools)</text>
</g>
<!-- CU&#45;&gt;CBC -->
<g id="edge14" class="edge">
<title>CU&#45;&gt;CBC</title>
<path fill="none" stroke="black" d="M431,-926.83C426.59,-906.71 422.97,-874.2 438,-852 461.55,-817.2 499.98,-848.76 525,-815 538.69,-796.53 540.3,-770.05 539,-750.07"/>
<polygon fill="black" stroke="black" points="542.47,-749.64 538.07,-740.01 535.5,-750.29 542.47,-749.64"/>
</g>
<!-- OSI&#45;&gt;CLP -->
<g id="edge11" class="edge">
<title>OSI&#45;&gt;CLP</title>
<path fill="none" stroke="black" d="M662.37,-854.6C659.54,-853.72 656.73,-852.84 654,-852 611.21,-838.8 562.68,-824.47 525.92,-813.75"/>
<polygon fill="black" stroke="black" points="526.46,-810.26 515.88,-810.82 524.5,-816.98 526.46,-810.26"/>
</g>
<!-- OSI&#45;&gt;CGL -->
<g id="edge13" class="edge">
<title>OSI&#45;&gt;CGL</title>
<path fill="none" stroke="black" d="M683.3,-851.96C669.41,-842.57 652.25,-830.97 637.28,-820.85"/>
<polygon fill="black" stroke="black" points="639.01,-817.79 628.76,-815.09 635.09,-823.59 639.01,-817.79"/>
</g>
<!-- OSI&#45;&gt;CBC -->
<g id="edge15" class="edge">
<title>OSI&#45;&gt;CBC</title>
<path fill="none" stroke="black" d="M704,-851.64C696.45,-831.05 681.64,-797.81 659,-777 640.19,-759.71 615.05,-747.19 592.32,-738.51"/>
<polygon fill="black" stroke="black" points="593.35,-735.16 582.76,-735.03 590.95,-741.74 593.35,-735.16"/>
</g>
<!-- CLP&#45;&gt;CBC -->
<g id="edge16" class="edge">
<title>CLP&#45;&gt;CBC</title>
<path fill="none" stroke="black" d="M484.56,-776.96C492.7,-768.09 502.64,-757.26 511.54,-747.56"/>
<polygon fill="black" stroke="black" points="514.21,-749.82 518.4,-740.09 509.06,-745.09 514.21,-749.82"/>
</g>
<!-- CLP&#45;&gt;OR_CC -->
<g id="edge24" class="edge">
<title>CLP&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M468.4,-776.84C469.21,-756.4 471.65,-722.34 479,-694 483.97,-674.82 492.6,-654.29 500.04,-638.45"/>
<polygon fill="black" stroke="black" points="503.29,-639.78 504.48,-629.25 496.98,-636.74 503.29,-639.78"/>
</g>
<!-- CGL&#45;&gt;CBC -->
<g id="edge17" class="edge">
<title>CGL&#45;&gt;CBC</title>
<path fill="none" stroke="black" d="M585.44,-776.96C577.3,-768.09 567.36,-757.26 558.46,-747.56"/>
<polygon fill="black" stroke="black" points="560.94,-745.09 551.6,-740.09 555.79,-749.82 560.94,-745.09"/>
</g>
<!-- CBC&#45;&gt;OR_CC -->
<g id="edge25" class="edge">
<title>CBC&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M531.44,-701.51C528.14,-684.42 523.2,-658.77 519.42,-639.14"/>
<polygon fill="black" stroke="black" points="522.84,-638.37 517.51,-629.22 515.96,-639.7 522.84,-638.37"/>
</g>
<!-- SWIG_WIN -->
<g id="node18" class="node">
<title>SWIG_WIN</title>
<path fill="royalblue" stroke="chocolate" d="M870,-965C870,-965 802,-965 802,-965 796,-965 790,-959 790,-953 790,-953 790,-939 790,-939 790,-933 796,-927 802,-927 802,-927 870,-927 870,-927 876,-927 882,-933 882,-939 882,-939 882,-953 882,-953 882,-959 876,-965 870,-965"/>
<text text-anchor="middle" x="836" y="-949.8" font-family="Times,serif" font-size="14.00">Swigwin</text>
<text text-anchor="middle" x="836" y="-934.8" font-family="Times,serif" font-size="14.00">(Windows)</text>
</g>
<!-- GLPK -->
<g id="node19" class="node">
<title>GLPK</title>
<path fill="none" stroke="grey" stroke-dasharray="5,2" d="M945.5,-964C945.5,-964 912.5,-964 912.5,-964 906.5,-964 900.5,-958 900.5,-952 900.5,-952 900.5,-940 900.5,-940 900.5,-934 906.5,-928 912.5,-928 912.5,-928 945.5,-928 945.5,-928 951.5,-928 957.5,-934 957.5,-940 957.5,-940 957.5,-952 957.5,-952 957.5,-958 951.5,-964 945.5,-964"/>
<text text-anchor="middle" x="929" y="-942.3" font-family="Times,serif" font-size="14.00">GLPK</text>
</g>
<!-- GLPK&#45;&gt;OR_CC -->
<g id="edge26" class="edge">
<title>GLPK&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M900.2,-928.45C882.04,-915.66 862,-896.08 862,-872 862,-872 862,-872 862,-720 862,-698.8 841.68,-701.9 822,-694 797.65,-684.22 790.07,-685.98 764,-683 742.24,-680.51 586.63,-684.72 567,-675 550.88,-667.02 537.89,-651.63 528.81,-637.94"/>
<polygon fill="black" stroke="black" points="531.67,-635.92 523.41,-629.29 525.73,-639.62 531.67,-635.92"/>
</g>
<!-- SCIP -->
<g id="node20" class="node">
<title>SCIP</title>
<path fill="none" stroke="grey" stroke-dasharray="5,2" d="M1018,-964C1018,-964 988,-964 988,-964 982,-964 976,-958 976,-952 976,-952 976,-940 976,-940 976,-934 982,-928 988,-928 988,-928 1018,-928 1018,-928 1024,-928 1030,-934 1030,-940 1030,-940 1030,-952 1030,-952 1030,-958 1024,-964 1018,-964"/>
<text text-anchor="middle" x="1003" y="-942.3" font-family="Times,serif" font-size="14.00">SCIP</text>
</g>
<!-- SCIP&#45;&gt;OR_CC -->
<g id="edge27" class="edge">
<title>SCIP&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M975.74,-930.61C956.08,-918.05 933,-897.81 933,-872 933,-872 933,-872 933,-720 933,-688.47 897.58,-701.67 867,-694 826.2,-683.76 814.94,-686.26 773,-683 750.16,-681.22 587.54,-685.15 567,-675 550.87,-667.03 537.88,-651.64 528.8,-637.95"/>
<polygon fill="black" stroke="black" points="531.66,-635.93 523.4,-629.3 525.72,-639.63 531.66,-635.93"/>
</g>
<!-- CPLEX -->
<g id="node21" class="node">
<title>CPLEX</title>
<path fill="none" stroke="grey" stroke-dasharray="5,2" d="M1102,-964C1102,-964 1060,-964 1060,-964 1054,-964 1048,-958 1048,-952 1048,-952 1048,-940 1048,-940 1048,-934 1054,-928 1060,-928 1060,-928 1102,-928 1102,-928 1108,-928 1114,-934 1114,-940 1114,-940 1114,-952 1114,-952 1114,-958 1108,-964 1102,-964"/>
<text text-anchor="middle" x="1081" y="-942.3" font-family="Times,serif" font-size="14.00">CPLEX</text>
</g>
<!-- CPLEX&#45;&gt;OR_CC -->
<g id="edge28" class="edge">
<title>CPLEX&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M1071.17,-927.91C1063.81,-913.49 1055,-892.05 1055,-872 1055,-872 1055,-872 1055,-720 1055,-666.73 990.71,-701.7 938,-694 870.1,-684.09 852.52,-686.71 784,-683 759.91,-681.7 588.64,-685.67 567,-675 550.76,-666.99 537.7,-651.46 528.61,-637.69"/>
<polygon fill="black" stroke="black" points="531.47,-635.65 523.22,-629 525.52,-639.35 531.47,-635.65"/>
</g>
<!-- GUROBI -->
<g id="node22" class="node">
<title>GUROBI</title>
<path fill="none" stroke="grey" stroke-dasharray="5,2" d="M1185.5,-964C1185.5,-964 1144.5,-964 1144.5,-964 1138.5,-964 1132.5,-958 1132.5,-952 1132.5,-952 1132.5,-940 1132.5,-940 1132.5,-934 1138.5,-928 1144.5,-928 1144.5,-928 1185.5,-928 1185.5,-928 1191.5,-928 1197.5,-934 1197.5,-940 1197.5,-940 1197.5,-952 1197.5,-952 1197.5,-958 1191.5,-964 1185.5,-964"/>
<text text-anchor="middle" x="1165" y="-942.3" font-family="Times,serif" font-size="14.00">Gurobi</text>
</g>
<!-- GUROBI&#45;&gt;OR_CC -->
<g id="edge29" class="edge">
<title>GUROBI&#45;&gt;OR_CC</title>
<path fill="none" stroke="black" d="M1152.34,-927.98C1143.03,-913.77 1132,-892.58 1132,-872 1132,-872 1132,-872 1132,-720 1132,-685.98 1093.38,-700.57 1060,-694 945.64,-671.5 914.46,-687.46 798,-683 785.17,-682.51 578.52,-680.66 567,-675 550.75,-667.01 537.7,-651.47 528.61,-637.71"/>
<polygon fill="black" stroke="black" points="531.46,-635.67 523.22,-629.02 525.51,-639.36 531.46,-635.67"/>
</g>
<!-- OR_SRC -->
<g id="node23" class="node">
<title>OR_SRC</title>
<polygon fill="royalblue" stroke="black" points="682,-629 679,-633 658,-633 655,-629 576,-629 576,-591 682,-591 682,-629"/>
<text text-anchor="middle" x="629" y="-613.8" font-family="Times,serif" font-size="14.00">OR&#45;Tools src</text>
<text text-anchor="middle" x="629" y="-598.8" font-family="Times,serif" font-size="14.00">ortools/...</text>
</g>
<!-- PKG_CC -->
<g id="node25" class="node">
<title>PKG_CC</title>
<polygon fill="royalblue" stroke="black" points="540,-505 392,-505 388,-501 388,-467 536,-467 540,-471 540,-505"/>
<polyline fill="none" stroke="black" points="536,-501 388,-501 "/>
<polyline fill="none" stroke="black" points="536,-501 536,-467 "/>
<polyline fill="none" stroke="black" points="536,-501 540,-505 "/>
<text text-anchor="middle" x="464" y="-489.8" font-family="Times,serif" font-size="14.00">.tar.gz/.zip Archive</text>
<text text-anchor="middle" x="464" y="-474.8" font-family="Times,serif" font-size="14.00">Target: package_cc</text>
</g>
<!-- OR_CC&#45;&gt;PKG_CC -->
<g id="edge30" class="edge">
<title>OR_CC&#45;&gt;PKG_CC</title>
<path fill="none" stroke="dimgrey" stroke-dasharray="1,5" d="M506.62,-591C498.35,-570.82 484.84,-537.86 475.25,-514.45"/>
<polygon fill="dimgrey" stroke="dimgrey" points="478.44,-513 471.41,-505.08 471.96,-515.66 478.44,-513"/>
<text text-anchor="middle" x="514" y="-561.8" font-family="Times,serif" font-size="14.00">WIP</text>
</g>
<!-- EX_CC -->
<g id="node26" class="node">
<title>EX_CC</title>
<polygon fill="royalblue" stroke="black" points="668,-504 558,-504 558,-468 674,-468 674,-498 668,-504"/>
<polyline fill="none" stroke="black" points="668,-504 668,-498 "/>
<polyline fill="none" stroke="black" points="674,-498 668,-498 "/>
<text text-anchor="middle" x="616" y="-482.3" font-family="Times,serif" font-size="14.00">C++ Samples</text>
</g>
<!-- OR_CC&#45;&gt;EX_CC -->
<g id="edge18" class="edge">
<title>OR_CC&#45;&gt;EX_CC</title>
<path fill="none" stroke="black" d="M529.05,-591C546.5,-570.13 575.37,-535.59 595.02,-512.1"/>
<polygon fill="black" stroke="black" points="597.82,-514.2 601.55,-504.29 592.45,-509.71 597.82,-514.2"/>
</g>
<!-- OR_WPY -->
<g id="node27" class="node">
<title>OR_WPY</title>
<polygon fill="gold" stroke="black" points="878,-504 706,-504 706,-468 884,-468 884,-498 878,-504"/>
<polyline fill="none" stroke="black" points="878,-504 878,-498 "/>
<polyline fill="none" stroke="black" points="884,-498 878,-498 "/>
<text text-anchor="middle" x="795" y="-482.3" font-family="Times,serif" font-size="14.00">C++ Python wrappers</text>
</g>
<!-- OR_CC&#45;&gt;OR_WPY -->
<g id="edge32" class="edge">
<title>OR_CC&#45;&gt;OR_WPY</title>
<path fill="none" stroke="chocolate" d="M557.72,-594.12C607.66,-577.1 682.94,-551.39 686,-550 711.76,-538.27 739.35,-522.29 760.33,-509.35"/>
<polygon fill="chocolate" stroke="chocolate" points="762.25,-512.28 768.89,-504.02 758.55,-506.34 762.25,-512.28"/>
<text text-anchor="middle" x="679" y="-561.8" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_PY -->
<g id="node28" class="node">
<title>OR_PY</title>
<polygon fill="gold" stroke="black" points="928,-411 812,-411 812,-373 934,-373 934,-405 928,-411"/>
<polyline fill="none" stroke="black" points="928,-411 928,-405 "/>
<polyline fill="none" stroke="black" points="934,-405 928,-405 "/>
<text text-anchor="middle" x="873" y="-395.8" font-family="Times,serif" font-size="14.00">Python files</text>
<text text-anchor="middle" x="873" y="-380.8" font-family="Times,serif" font-size="14.00">Target: python</text>
</g>
<!-- OR_CC&#45;&gt;OR_PY -->
<g id="edge33" class="edge">
<title>OR_CC&#45;&gt;OR_PY</title>
<path fill="none" stroke="chocolate" d="M557.76,-593.38C560.87,-592.5 563.97,-591.7 567,-591 638.15,-574.62 844.44,-604.53 893,-550 928.77,-509.84 908.04,-480.92 894,-429 893.2,-426.02 892.08,-423.04 890.77,-420.13"/>
<polygon fill="chocolate" stroke="chocolate" points="893.85,-418.46 886.11,-411.22 887.64,-421.71 893.85,-418.46"/>
<text text-anchor="middle" x="929" y="-482.3" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_WJV -->
<g id="node31" class="node">
<title>OR_WJV</title>
<polygon fill="crimson" stroke="black" points="1232,-504 1080,-504 1080,-468 1238,-468 1238,-498 1232,-504"/>
<polyline fill="none" stroke="black" points="1232,-504 1232,-498 "/>
<polyline fill="none" stroke="black" points="1238,-498 1232,-498 "/>
<text text-anchor="middle" x="1159" y="-482.3" font-family="Times,serif" font-size="14.00">C++ Java wrappers</text>
</g>
<!-- OR_CC&#45;&gt;OR_WJV -->
<g id="edge37" class="edge">
<title>OR_CC&#45;&gt;OR_WJV</title>
<path fill="none" stroke="chocolate" d="M557.71,-593.11C560.83,-592.3 563.95,-591.58 567,-591 786.44,-549.07 860.73,-633.39 1068,-550 1091.44,-540.57 1114.81,-524.21 1131.99,-510.52"/>
<polygon fill="chocolate" stroke="chocolate" points="1134.37,-513.1 1139.91,-504.06 1129.95,-507.67 1134.37,-513.1"/>
<text text-anchor="middle" x="1060" y="-561.8" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_JV -->
<g id="node32" class="node">
<title>OR_JV</title>
<polygon fill="crimson" stroke="black" points="1271.5,-411 1176.5,-411 1176.5,-373 1277.5,-373 1277.5,-405 1271.5,-411"/>
<polyline fill="none" stroke="black" points="1271.5,-411 1271.5,-405 "/>
<polyline fill="none" stroke="black" points="1277.5,-405 1271.5,-405 "/>
<text text-anchor="middle" x="1227" y="-395.8" font-family="Times,serif" font-size="14.00">Java files</text>
<text text-anchor="middle" x="1227" y="-380.8" font-family="Times,serif" font-size="14.00">Target: java</text>
</g>
<!-- OR_CC&#45;&gt;OR_JV -->
<g id="edge38" class="edge">
<title>OR_CC&#45;&gt;OR_JV</title>
<path fill="none" stroke="chocolate" d="M557.7,-593.06C560.82,-592.26 563.94,-591.56 567,-591 679.42,-570.4 967.13,-582.86 1081,-573 1155.21,-566.58 1198.08,-606.17 1247,-550 1278.34,-514.02 1257.95,-454.6 1241.6,-420.1"/>
<polygon fill="chocolate" stroke="chocolate" points="1244.71,-418.49 1237.14,-411.08 1238.43,-421.59 1244.71,-418.49"/>
<text text-anchor="middle" x="1280" y="-482.3" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_WNET -->
<g id="node35" class="node">
<title>OR_WNET</title>
<polygon fill="forestgreen" stroke="black" points="1641,-504 1489,-504 1489,-468 1647,-468 1647,-498 1641,-504"/>
<polyline fill="none" stroke="black" points="1641,-504 1641,-498 "/>
<polyline fill="none" stroke="black" points="1647,-498 1641,-498 "/>
<text text-anchor="middle" x="1568" y="-482.3" font-family="Times,serif" font-size="14.00">C++ .Net wrappers</text>
</g>
<!-- OR_CC&#45;&gt;OR_WNET -->
<g id="edge43" class="edge">
<title>OR_CC&#45;&gt;OR_WNET</title>
<path fill="none" stroke="chocolate" d="M557.69,-593.03C560.81,-592.24 563.94,-591.55 567,-591 722.82,-563.23 1121.6,-589.6 1279,-573 1334.31,-567.17 1348.46,-565.04 1402,-550 1442.52,-538.62 1487.03,-521.46 1519.75,-507.92"/>
<polygon fill="chocolate" stroke="chocolate" points="1521.2,-511.11 1529.08,-504.03 1518.51,-504.65 1521.2,-511.11"/>
<text text-anchor="middle" x="1388" y="-561.8" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_NET -->
<g id="node36" class="node">
<title>OR_NET</title>
<polygon fill="forestgreen" stroke="black" points="1853.5,-411 1740.5,-411 1740.5,-373 1859.5,-373 1859.5,-405 1853.5,-411"/>
<polyline fill="none" stroke="black" points="1853.5,-411 1853.5,-405 "/>
<polyline fill="none" stroke="black" points="1859.5,-405 1853.5,-405 "/>
<text text-anchor="middle" x="1800" y="-395.8" font-family="Times,serif" font-size="14.00">.Net files</text>
<text text-anchor="middle" x="1800" y="-380.8" font-family="Times,serif" font-size="14.00">Target: dotnet</text>
</g>
<!-- OR_CC&#45;&gt;OR_NET -->
<g id="edge44" class="edge">
<title>OR_CC&#45;&gt;OR_NET</title>
<path fill="none" stroke="chocolate" d="M557.69,-593.01C560.81,-592.23 563.94,-591.54 567,-591 751.32,-558.53 1222.15,-583.68 1409,-573 1519.07,-566.71 1555.57,-595.5 1656,-550 1716.1,-522.77 1762.36,-457.26 1784.89,-420.04"/>
<polygon fill="chocolate" stroke="chocolate" points="1788.02,-421.61 1790.1,-411.22 1782,-418.05 1788.02,-421.61"/>
<text text-anchor="middle" x="1780" y="-482.3" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- OR_WPY&#45;&gt;OR_PY -->
<g id="edge34" class="edge">
<title>OR_WPY&#45;&gt;OR_PY</title>
<path fill="none" stroke="gold" d="M809.67,-467.7C821.32,-453.95 837.79,-434.53 851.02,-418.93"/>
<polygon fill="gold" stroke="gold" points="853.8,-421.06 857.59,-411.17 848.46,-416.54 853.8,-421.06"/>
<text text-anchor="middle" x="865" y="-432.8" font-family="Times,serif" font-size="14.00">python</text>
</g>
<!-- PKG_PY -->
<g id="node29" class="node">
<title>PKG_PY</title>
<polygon fill="gold" stroke="black" points="892.5,-287 709.5,-287 705.5,-283 705.5,-249 888.5,-249 892.5,-253 892.5,-287"/>
<polyline fill="none" stroke="black" points="888.5,-283 705.5,-283 "/>
<polyline fill="none" stroke="black" points="888.5,-283 888.5,-249 "/>
<polyline fill="none" stroke="black" points="888.5,-283 892.5,-287 "/>
<text text-anchor="middle" x="799" y="-271.8" font-family="Times,serif" font-size="14.00">Wheel Package</text>
<text text-anchor="middle" x="799" y="-256.8" font-family="Times,serif" font-size="14.00">Target: package_python</text>
</g>
<!-- OR_PY&#45;&gt;PKG_PY -->
<g id="edge35" class="edge">
<title>OR_PY&#45;&gt;PKG_PY</title>
<path fill="none" stroke="gold" d="M855.67,-372.64C850.94,-367.18 846.02,-361.04 842,-355 829.71,-336.53 818.59,-314.06 810.74,-296.72"/>
<polygon fill="gold" stroke="gold" points="813.76,-294.89 806.51,-287.17 807.36,-297.73 813.76,-294.89"/>
<text text-anchor="middle" x="900" y="-343.8" font-family="Times,serif" font-size="14.00">python setup.py</text>
</g>
<!-- EX_PY -->
<g id="node30" class="node">
<title>EX_PY</title>
<polygon fill="gold" stroke="black" points="1037,-286 911,-286 911,-250 1043,-250 1043,-280 1037,-286"/>
<polyline fill="none" stroke="black" points="1037,-286 1037,-280 "/>
<polyline fill="none" stroke="black" points="1043,-280 1037,-280 "/>
<text text-anchor="middle" x="977" y="-264.3" font-family="Times,serif" font-size="14.00">Python Samples</text>
</g>
<!-- OR_PY&#45;&gt;EX_PY -->
<g id="edge31" class="edge">
<title>OR_PY&#45;&gt;EX_PY</title>
<path fill="none" stroke="gold" d="M934.08,-373.7C943.12,-368.88 951.54,-362.76 958,-355 971.57,-338.69 976.01,-314.79 977.23,-296.32"/>
<polygon fill="gold" stroke="gold" points="980.74,-296.31 977.62,-286.18 973.74,-296.04 980.74,-296.31"/>
</g>
<!-- OR_WJV&#45;&gt;OR_JV -->
<g id="edge39" class="edge">
<title>OR_WJV&#45;&gt;OR_JV</title>
<path fill="none" stroke="crimson" d="M1171.79,-467.7C1181.85,-454.08 1196.04,-434.88 1207.52,-419.36"/>
<polygon fill="crimson" stroke="crimson" points="1210.44,-421.29 1213.57,-411.17 1204.81,-417.13 1210.44,-421.29"/>
<text text-anchor="middle" x="1217.5" y="-432.8" font-family="Times,serif" font-size="14.00">javac</text>
</g>
<!-- PKG_JV -->
<g id="node33" class="node">
<title>PKG_JV</title>
<polygon fill="crimson" stroke="black" points="1246.5,-287 1083.5,-287 1079.5,-283 1079.5,-249 1242.5,-249 1246.5,-253 1246.5,-287"/>
<polyline fill="none" stroke="black" points="1242.5,-283 1079.5,-283 "/>
<polyline fill="none" stroke="black" points="1242.5,-283 1242.5,-249 "/>
<polyline fill="none" stroke="black" points="1242.5,-283 1246.5,-287 "/>
<text text-anchor="middle" x="1163" y="-271.8" font-family="Times,serif" font-size="14.00">Maven Package</text>
<text text-anchor="middle" x="1163" y="-256.8" font-family="Times,serif" font-size="14.00">Target: package_java</text>
</g>
<!-- OR_JV&#45;&gt;PKG_JV -->
<g id="edge40" class="edge">
<title>OR_JV&#45;&gt;PKG_JV</title>
<path fill="none" stroke="crimson" stroke-dasharray="1,5" d="M1217.32,-372.69C1214.33,-367.02 1211.02,-360.76 1208,-355 1197.71,-335.42 1186.15,-313.32 1177.32,-296.42"/>
<polygon fill="crimson" stroke="crimson" points="1180.2,-294.37 1172.46,-287.13 1173.99,-297.61 1180.2,-294.37"/>
<text text-anchor="middle" x="1254" y="-343.8" font-family="Times,serif" font-size="14.00">maven (WIP)</text>
</g>
<!-- EX_JV -->
<g id="node34" class="node">
<title>EX_JV</title>
<polygon fill="crimson" stroke="black" points="1370,-286 1264,-286 1264,-250 1376,-250 1376,-280 1370,-286"/>
<polyline fill="none" stroke="black" points="1370,-286 1370,-280 "/>
<polyline fill="none" stroke="black" points="1376,-280 1370,-280 "/>
<text text-anchor="middle" x="1320" y="-264.3" font-family="Times,serif" font-size="14.00">Java Samples</text>
</g>
<!-- OR_JV&#45;&gt;EX_JV -->
<g id="edge36" class="edge">
<title>OR_JV&#45;&gt;EX_JV</title>
<path fill="none" stroke="crimson" d="M1277.62,-373.45C1286.08,-368.6 1294.03,-362.53 1300,-355 1313.22,-338.33 1317.98,-314.47 1319.58,-296.1"/>
<polygon fill="crimson" stroke="crimson" points="1323.07,-296.22 1320.19,-286.02 1316.09,-295.79 1323.07,-296.22"/>
</g>
<!-- OR_WNET&#45;&gt;OR_NET -->
<g id="edge45" class="edge">
<title>OR_WNET&#45;&gt;OR_NET</title>
<path fill="none" stroke="forestgreen" d="M1617.63,-467.91C1637.72,-460.8 1661.07,-452.28 1682,-444 1704.68,-435.03 1729.49,-424.43 1750.49,-415.22"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1752.11,-418.33 1759.85,-411.1 1749.28,-411.93 1752.11,-418.33"/>
<text text-anchor="middle" x="1740.5" y="-432.8" font-family="Times,serif" font-size="14.00">dotnet</text>
</g>
<!-- PKG_NET_RT -->
<g id="node38" class="node">
<title>PKG_NET_RT</title>
<polygon fill="forestgreen" stroke="black" points="1722.5,-411 1417.5,-411 1413.5,-407 1413.5,-373 1718.5,-373 1722.5,-377 1722.5,-411"/>
<polyline fill="none" stroke="black" points="1718.5,-407 1413.5,-407 "/>
<polyline fill="none" stroke="black" points="1718.5,-407 1718.5,-373 "/>
<polyline fill="none" stroke="black" points="1718.5,-407 1722.5,-411 "/>
<text text-anchor="middle" x="1568" y="-395.8" font-family="Times,serif" font-size="14.00">Nuget Google.OrTools.runtime.rid.nupkg</text>
<text text-anchor="middle" x="1568" y="-380.8" font-family="Times,serif" font-size="14.00">Target: package_dotnet</text>
</g>
<!-- OR_WNET&#45;&gt;PKG_NET_RT -->
<g id="edge48" class="edge">
<title>OR_WNET&#45;&gt;PKG_NET_RT</title>
<path fill="none" stroke="forestgreen" d="M1568,-467.7C1568,-454.71 1568,-436.65 1568,-421.54"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1571.5,-421.17 1568,-411.17 1564.5,-421.17 1571.5,-421.17"/>
<text text-anchor="middle" x="1623" y="-432.8" font-family="Times,serif" font-size="14.00">dotnet package</text>
</g>
<!-- OR_FS -->
<g id="node37" class="node">
<title>OR_FS</title>
<polygon fill="forestgreen" stroke="black" points="1754,-193 1642,-193 1642,-155 1760,-155 1760,-187 1754,-193"/>
<polyline fill="none" stroke="black" points="1754,-193 1754,-187 "/>
<polyline fill="none" stroke="black" points="1760,-187 1754,-187 "/>
<text text-anchor="middle" x="1701" y="-177.8" font-family="Times,serif" font-size="14.00">F# files</text>
<text text-anchor="middle" x="1701" y="-162.8" font-family="Times,serif" font-size="14.00">Target: fsharp</text>
</g>
<!-- OR_NET&#45;&gt;OR_FS -->
<g id="edge46" class="edge">
<title>OR_NET&#45;&gt;OR_FS</title>
<path fill="none" stroke="forestgreen" d="M1801.01,-372.57C1801.85,-341.62 1799.79,-278.24 1773,-234 1764.84,-220.52 1752.45,-208.75 1740.24,-199.34"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1742,-196.3 1731.87,-193.22 1737.87,-201.95 1742,-196.3"/>
<text text-anchor="middle" x="1822.5" y="-264.3" font-family="Times,serif" font-size="14.00">dotnet</text>
</g>
<!-- PKG_NET -->
<g id="node39" class="node">
<title>PKG_NET</title>
<polygon fill="forestgreen" stroke="black" points="1763.5,-287 1544.5,-287 1540.5,-283 1540.5,-249 1759.5,-249 1763.5,-253 1763.5,-287"/>
<polyline fill="none" stroke="black" points="1759.5,-283 1540.5,-283 "/>
<polyline fill="none" stroke="black" points="1759.5,-283 1759.5,-249 "/>
<polyline fill="none" stroke="black" points="1759.5,-283 1763.5,-287 "/>
<text text-anchor="middle" x="1652" y="-271.8" font-family="Times,serif" font-size="14.00">Nuget Google.OrTools.nupkg</text>
<text text-anchor="middle" x="1652" y="-256.8" font-family="Times,serif" font-size="14.00">Target: package_dotnet</text>
</g>
<!-- OR_NET&#45;&gt;PKG_NET -->
<g id="edge50" class="edge">
<title>OR_NET&#45;&gt;PKG_NET</title>
<path fill="none" stroke="forestgreen" d="M1740.34,-374.76C1714.71,-367.34 1689.54,-359.26 1685,-355 1668.77,-339.76 1660.43,-315.66 1656.2,-296.85"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1659.63,-296.15 1654.25,-287.03 1652.77,-297.52 1659.63,-296.15"/>
<text text-anchor="middle" x="1740" y="-343.8" font-family="Times,serif" font-size="14.00">dotnet package</text>
</g>
<!-- EX_NET -->
<g id="node41" class="node">
<title>EX_NET</title>
<polygon fill="forestgreen" stroke="black" points="1932,-68 1834,-68 1834,-32 1938,-32 1938,-62 1932,-68"/>
<polyline fill="none" stroke="black" points="1932,-68 1932,-62 "/>
<polyline fill="none" stroke="black" points="1938,-62 1932,-62 "/>
<text text-anchor="middle" x="1886" y="-46.3" font-family="Times,serif" font-size="14.00">C# Samples</text>
</g>
<!-- OR_NET&#45;&gt;EX_NET -->
<g id="edge41" class="edge">
<title>OR_NET&#45;&gt;EX_NET</title>
<path fill="none" stroke="forestgreen" d="M1820.31,-372.78C1830.96,-362.01 1843.18,-347.48 1850,-332 1888.25,-245.24 1889.31,-129.79 1887.5,-78.07"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1890.99,-77.88 1887.08,-68.03 1884,-78.17 1890.99,-77.88"/>
</g>
<!-- PKG_FS -->
<g id="node40" class="node">
<title>PKG_FS</title>
<polygon fill="forestgreen" stroke="black" points="1694,-69 1418,-69 1414,-65 1414,-31 1690,-31 1694,-35 1694,-69"/>
<polyline fill="none" stroke="black" points="1690,-65 1414,-65 "/>
<polyline fill="none" stroke="black" points="1690,-65 1690,-31 "/>
<polyline fill="none" stroke="black" points="1690,-65 1694,-69 "/>
<text text-anchor="middle" x="1554" y="-53.8" font-family="Times,serif" font-size="14.00">Nuget Google.OrTools.FSharp.nupkg</text>
<text text-anchor="middle" x="1554" y="-38.8" font-family="Times,serif" font-size="14.00">Target: package_dotnet</text>
</g>
<!-- OR_FS&#45;&gt;PKG_FS -->
<g id="edge51" class="edge">
<title>OR_FS&#45;&gt;PKG_FS</title>
<path fill="none" stroke="forestgreen" d="M1641.99,-158.02C1628.88,-152.83 1615.71,-145.97 1605,-137 1586.41,-121.44 1572.93,-97.26 1564.51,-78.5"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1567.71,-77.08 1560.57,-69.26 1561.27,-79.83 1567.71,-77.08"/>
<text text-anchor="middle" x="1660" y="-125.8" font-family="Times,serif" font-size="14.00">dotnet package</text>
</g>
<!-- EX_FS -->
<g id="node42" class="node">
<title>EX_FS</title>
<polygon fill="forestgreen" stroke="black" points="1810,-68 1712,-68 1712,-32 1816,-32 1816,-62 1810,-68"/>
<polyline fill="none" stroke="black" points="1810,-68 1810,-62 "/>
<polyline fill="none" stroke="black" points="1816,-62 1810,-62 "/>
<text text-anchor="middle" x="1764" y="-46.3" font-family="Times,serif" font-size="14.00">F# Samples</text>
</g>
<!-- OR_FS&#45;&gt;EX_FS -->
<g id="edge42" class="edge">
<title>OR_FS&#45;&gt;EX_FS</title>
<path fill="none" stroke="forestgreen" d="M1710.3,-155C1720.89,-134.49 1738.29,-100.8 1750.4,-77.34"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1753.6,-78.78 1755.07,-68.29 1747.38,-75.56 1753.6,-78.78"/>
</g>
<!-- PKG_NET_RT&#45;&gt;PKG_NET -->
<g id="edge49" class="edge">
<title>PKG_NET_RT&#45;&gt;PKG_NET</title>
<path fill="none" stroke="forestgreen" d="M1580.39,-373C1594.48,-352.55 1617.59,-318.97 1633.74,-295.52"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1636.77,-297.3 1639.55,-287.08 1631,-293.33 1636.77,-297.3"/>
</g>
<!-- PKG_NET&#45;&gt;OR_FS -->
<g id="edge47" class="edge">
<title>PKG_NET&#45;&gt;OR_FS</title>
<path fill="none" stroke="forestgreen" d="M1661.68,-248.82C1668.79,-235.47 1678.58,-217.1 1686.61,-202.02"/>
<polygon fill="forestgreen" stroke="forestgreen" points="1689.73,-203.61 1691.34,-193.14 1683.55,-200.32 1689.73,-203.61"/>
<text text-anchor="middle" x="1703.5" y="-214.8" font-family="Times,serif" font-size="14.00">dotnet</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -0,0 +1,11 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/alpine
FROM alpine:edge AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN apk add --no-cache git build-base linux-headers cmake xfce4-dev-tools
CMD [ "/bin/sh" ]
FROM base AS swig
RUN apk add --no-cache swig

View File

@@ -0,0 +1,16 @@
FROM ortools/make:alpine_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,27 @@
FROM ortools/make:alpine_swig AS env
RUN apk add --no-cache wget icu-libs libintl
# .NET install
RUN dotnet_sdk_version=3.1.101 \
&& wget -O dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$dotnet_sdk_version/dotnet-sdk-$dotnet_sdk_version-linux-musl-x64.tar.gz \
&& dotnet_sha512='ce386da8bc07033957fd404909fc230e8ab9e29929675478b90f400a1838223379595a4459056c6c2251ab5c722f80858b9ca536db1a2f6d1670a97094d0fe55' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -C /usr/share/dotnet -oxzf dotnet.tar.gz \
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
&& rm dotnet.tar.gz
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,17 @@
FROM ortools/make:alpine_swig AS env
ENV JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
RUN apk add --no-cache openjdk8 maven
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,16 @@
FROM ortools/make:alpine_swig AS env
RUN apk add --no-cache python3-dev py3-pip py3-wheel
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,12 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/archlinux/
FROM archlinux/base AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN pacman -Syu --noconfirm \
git base-devel cmake lsb-release
CMD [ "/bin/bash" ]
FROM base AS swig
RUN pacman -Syu --noconfirm swig

View File

@@ -0,0 +1,16 @@
FROM ortools/make:archlinux_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,18 @@
FROM ortools/make:archlinux_swig AS env
RUN pacman -Syu --noconfirm dotnet-sdk
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,16 @@
FROM ortools/make:archlinux_swig AS env
RUN pacman -Syu --noconfirm jdk-openjdk maven
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,16 @@
FROM ortools/make:archlinux_swig AS env
RUN pacman -Syu --noconfirm python python-pip python-wheel
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,33 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/centos
FROM centos:latest AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN yum -y update \
&& yum -y install \
git wget which redhat-lsb-core openssl-devel pkgconfig autoconf libtool zlib-devel \
&& yum -y groupinstall "Development Tools" \
&& yum clean all \
&& rm -rf /var/cache/yum
# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4-Linux-x86_64.sh" \
&& chmod a+x cmake-3.16.4-Linux-x86_64.sh \
&& ./cmake-3.16.4-Linux-x86_64.sh --prefix=/usr/local/ --skip-license \
&& rm cmake-3.16.4-Linux-x86_64.sh
CMD [ "/usr/bin/bash" ]
FROM base AS swig
RUN yum -y update \
&& yum -y install pcre-devel \
&& yum clean all \
&& rm -rf /var/cache/yum \
&& wget "https://downloads.sourceforge.net/project/swig/swig/swig-4.0.1/swig-4.0.1.tar.gz" \
&& tar xvf swig-4.0.1.tar.gz \
&& rm swig-4.0.1.tar.gz \
&& cd swig-4.0.1 \
&& ./configure --prefix=/usr \
&& make -j 4 \
&& make install \
&& cd .. \
&& rm -rf swig-4.0.1

View File

@@ -0,0 +1,16 @@
FROM ortools/make:centos_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,23 @@
FROM ortools/make:centos_swig AS env
# see https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-centos7
RUN rpm -Uvh "https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm" \
&& yum -y update \
&& yum -y install dotnet-sdk-3.1 \
&& yum clean all \
&& rm -rf /var/cache/yum
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,19 @@
FROM ortools/make:centos_swig AS env
RUN yum -y update \
&& yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel maven \
&& yum clean all \
&& rm -rf /var/cache/yum
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,19 @@
FROM ortools/make:centos_swig AS env
RUN yum -y update \
&& yum -y install python36-devel python3-wheel \
&& yum clean all \
&& rm -rf /var/cache/yum
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,24 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/debian
FROM debian:latest AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN apt-get update -qq \
&& apt-get install -yq \
git wget libssl-dev pkg-config build-essential \
autoconf libtool zlib1g-dev lsb-release \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4-Linux-x86_64.sh" \
&& chmod a+x cmake-3.16.4-Linux-x86_64.sh \
&& ./cmake-3.16.4-Linux-x86_64.sh --prefix=/usr/local/ --skip-license \
&& rm cmake-3.16.4-Linux-x86_64.sh
CMD [ "/bin/bash" ]
FROM base AS swig
RUN apt-get update -qq \
&& apt-get install -yq swig \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

View File

@@ -0,0 +1,16 @@
FROM ortools/make:debian_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,28 @@
FROM ortools/make:debian_swig AS env
# see: https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-debian10
RUN apt-get update -qq \
&& apt-get install -yq wget gpg apt-transport-https \
&& wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg \
&& mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/ \
&& wget -q https://packages.microsoft.com/config/debian/10/prod.list \
&& mv prod.list /etc/apt/sources.list.d/microsoft-prod.list \
&& apt-get update -qq \
&& apt-get install -yq dotnet-sdk-3.1 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,19 @@
FROM ortools/make:debian_swig AS env
RUN apt-get update -qq \
&& apt-get install -yq default-jdk maven \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,19 @@
FROM ortools/make:debian_swig AS env
RUN apt-get update -qq \
&& apt-get install -yq python3-dev python3-pip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,18 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/fedora
FROM fedora:latest AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN dnf -y update \
&& dnf -y install git \
wget which redhat-lsb-core pkgconfig autoconf libtool zlib-devel \
&& dnf -y groupinstall "Development Tools" \
&& dnf -y install gcc-c++ cmake \
&& dnf clean all
CMD [ "/usr/bin/bash" ]
FROM base AS swig
RUN dnf -y update \
&& dnf -y install swig \
&& dnf clean all

View File

@@ -0,0 +1,16 @@
FROM ortools/make:fedora_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,23 @@
FROM ortools/make:fedora_swig AS env
# see: https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-fedora31
RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc \
&& wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/31/prod.repo \
&& dnf -y update \
&& dnf -y install dotnet-sdk-3.1 \
&& dnf clean all
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,18 @@
FROM ortools/make:fedora_swig AS env
RUN dnf -y update \
&& dnf -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel maven \
&& dnf clean all
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,19 @@
FROM ortools/make:fedora_swig AS env
RUN dnf -y update \
&& dnf -y install \
python3 python3-devel python3-pip python3-six python3-wheel \
&& dnf clean all
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,17 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/r/opensuse/tumbleweed
FROM opensuse/tumbleweed AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN zypper update -y \
&& zypper install -y git gcc gcc-c++ cmake \
wget which lsb-release pkgconfig autoconf libtool zlib-devel \
&& zypper clean -a
ENV CC=gcc CXX=g++
CMD [ "/usr/bin/bash" ]
FROM base AS swig
RUN zypper update -y \
&& zypper install -y swig \
&& zypper clean -a

View File

@@ -0,0 +1,16 @@
FROM ortools/make:opensuse_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,27 @@
FROM ortools/make:opensuse_swig AS env
RUN zypper update -y \
&& zypper install -y wget tar libicu-devel
RUN dotnet_sdk_version=3.1.102 \
&& wget -O dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$dotnet_sdk_version/dotnet-sdk-$dotnet_sdk_version-linux-x64.tar.gz \
&& dotnet_sha512='9cacdc9700468a915e6fa51a3e5539b3519dd35b13e7f9d6c4dd0077e298baac0e50ad1880181df6781ef1dc64a232e9f78ad8e4494022987d12812c4ca15f29' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -C /usr/share/dotnet -oxzf dotnet.tar.gz \
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
&& rm dotnet.tar.gz
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,18 @@
FROM ortools/make:opensuse_swig AS env
RUN zypper update -y \
&& zypper install -y java-1_8_0-openjdk java-1_8_0-openjdk-devel maven \
&& zypper clean -a
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,19 @@
FROM ortools/make:opensuse_swig AS env
RUN zypper update -y \
&& zypper install -y \
python3 python3-pip python3-devel python3-wheel \
&& zypper clean -a
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python

View File

@@ -0,0 +1,24 @@
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/ubuntu
FROM ubuntu:rolling AS base
LABEL maintainer="corentinl@google.com"
# Install system build dependencies
ENV PATH=/usr/local/bin:$PATH
RUN apt-get update -qq \
&& apt-get install -yq \
git wget libssl-dev pkg-config build-essential \
autoconf libtool zlib1g-dev lsb-release \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4-Linux-x86_64.sh" \
&& chmod a+x cmake-3.16.4-Linux-x86_64.sh \
&& ./cmake-3.16.4-Linux-x86_64.sh --prefix=/usr/local/ --skip-license \
&& rm cmake-3.16.4-Linux-x86_64.sh
CMD [ "/usr/bin/bash" ]
FROM base AS swig
RUN apt-get update -qq \
&& apt-get install -yq swig \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

View File

@@ -0,0 +1,16 @@
FROM ortools/make:ubuntu_base AS env
RUN make -version
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make cc
FROM build AS test
RUN make test_cc
FROM build AS package
RUN make package_cc

View File

@@ -0,0 +1,26 @@
FROM ortools/make:ubuntu_swig AS env
# see: https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-ubuntu-1910
RUN apt-get update -qq \
&& apt-get install -yq wget apt-transport-https \
&& wget -q https://packages.microsoft.com/config/ubuntu/19.10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& apt-get update -qq \
&& apt-get install -yq dotnet-sdk-3.1 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Trigger first run experience by running arbitrary cmd
RUN dotnet --info
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make dotnet
FROM build AS test
RUN make test_dotnet
FROM build AS package
RUN make package_dotnet

View File

@@ -0,0 +1,19 @@
FROM ortools/make:ubuntu_swig AS env
RUN apt-get update -qq \
&& apt-get install -yq default-jdk maven \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make java
FROM build AS test
RUN make test_java
FROM build AS package
RUN make package_java

View File

@@ -0,0 +1,19 @@
FROM ortools/make:ubuntu_swig AS env
RUN apt-get update -qq \
&& apt-get install -yq python3-dev python3-pip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
FROM env AS devel
WORKDIR /home/lib
COPY . .
FROM devel AS build
RUN make third_party
RUN make python
FROM build AS test
RUN make test_python
FROM build AS package
RUN make package_python