diff --git a/.ci/Makefile b/.ci/Makefile new file mode 100644 index 000000000..dd6754b2a --- /dev/null +++ b/.ci/Makefile @@ -0,0 +1,179 @@ +PROJECT := clp +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 [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}env${RESET}: build a virtual env image." + @echo -e "\t${BOLD}sh_env_${RESET}: run a container using the virtual env image (debug purpose)." + @echo + @echo -e "\t${BOLD}devel${RESET}: build the library using all devel images." + @echo -e "\t${BOLD}devel_${RESET}: build the library using a specific devel image." + @echo -e "\t${BOLD}test_${RESET}: auto test using the devel image." + @echo -e "\t${BOLD}sh_${RESET}: run a container using the devel image (debug purpose)." + @echo + @echo -e "\t${BOLD}install${RESET}: execute the cmake target ${BOLD}install${RESET} using all devel image container, then create an install image with it." + @echo -e "\t${BOLD}install_${RESET}: execute the cmake target ${BOLD}install${RESET} using the devel image container specified, then create an install image with it." + @echo -e "\t${BOLD}test_install${RESET}: configure, build, install then test a sample project against it using all ${BOLD}install${RESET} image containers." + @echo -e "\t${BOLD}test_install_${RESET}: configure, build, install then test a sample project against it using the ${BOLD}install${RESET} image container specified." + @echo -e "\t${BOLD}sh_install_${RESET}: run a container using the install image (debug purpose)." + @echo + @echo -e "\t${BOLD}clean${RESET}: Remove cache and docker image." + @echo -e "\t${BOLD}clean_${RESET}: Remove cache and docker image for the specified distro." + @echo + @echo -e "\t${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}alpine${RESET} (latest)" + @echo -e "\t\t${BOLD}archlinux${RESET} (latest)" + @echo -e "\t\t${BOLD}centos${RESET} (latest)" + @echo -e "\t\t${BOLD}fedora${RESET} (latest)" + @echo -e "\t\t${BOLD}opensuse${RESET} (tumbleweed)" + @echo -e "\t\t${BOLD}debian${RESET} (latest)" + @echo -e "\t\t${BOLD}ubuntu${RESET} (latest)" + @echo -e "\te.g. 'make test_ubuntu'" + @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} + +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 fedora opensuse debian ubuntu + +# $* stem +# $< first prerequist +# $@ target name + +# ENV +targets = $(addprefix env_, $(DISTROS)) +.PHONY: env $(targets) +env: $(targets) +$(targets): env_%: cache/%/docker_env.tar +cache/%/docker_env.tar: docker/%/Dockerfile + @docker image rm -f ${IMAGE}_$*:env 2>/dev/null + ${DOCKER_BUILD_CMD} --target=env --tag ${IMAGE}_$*:env -f $< docker/$* + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:env -o $@ + +# Run a container using the env image. +targets = $(addprefix sh_env_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_env_%: cache/%/docker_env.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:env /bin/sh + +# DEVEL +targets = $(addprefix devel_, $(DISTROS)) +.PHONY: devel $(targets) +devel: $(targets) +$(targets): devel_%: cache/%/docker_devel.tar +cache/%/docker_devel.tar: docker/%/Dockerfile \ + ../CMakeLists.txt ../cmake \ + ../src + @docker image rm -f ${IMAGE}_$*:devel 2>/dev/null + ${DOCKER_BUILD_CMD} --target=devel --tag ${IMAGE}_$*:devel -f $< .. + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:devel -o $@ + +# DOCKER BASH INSTALL (debug) +targets = $(addprefix sh_devel_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_devel_%: cache/%/docker_devel.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:devel /bin/sh + +# TEST DEVEL +targets = $(addprefix test_, $(DISTROS)) +.PHONY: test $(targets) +test: $(targets) +$(targets): test_%: cache/%/docker_devel.tar + ${DOCKER_RUN_CMD} -t --name ${IMAGE}_$* ${IMAGE}_$*:devel cmake --build build --target test + +# INSTALL +targets = $(addprefix install_, $(DISTROS)) +.PHONY: install $(targets) +install: $(targets) +$(targets): install_%: cache/%/docker_install.tar +cache/%/docker_install.tar: docker/%/Dockerfile \ + sample + @docker image rm -f ${IMAGE}_$*:install 2>/dev/null + ${DOCKER_BUILD_CMD} --target=install --tag ${IMAGE}_$*:install -f $< .. + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:install -o $@ + +# DOCKER BASH INSTALL (debug) +targets = $(addprefix sh_install_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_install_%: cache/%/docker_install.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:install /bin/sh + +# TEST INSTALL +targets = $(addprefix test_install_, $(DISTROS)) +.PHONY: test_install $(targets) +test_install: $(targets) +$(targets): test_install_%: cache/%/docker_install.tar sample + @docker load -i cache/$*/docker_install.tar + ${DOCKER_RUN_CMD} -t --name ${IMAGE}_$* ${IMAGE}_$*:install /bin/sh -c \ + "cmake -H. -Bbuild; \ + cmake --build build --target all; \ + cmake --build build --target test; \ + cmake --build build --target install" + +# CLEAN +targets = $(addprefix clean_, $(DISTROS)) +.PHONY: clean $(targets) +clean: $(targets) + -rmdir cache +$(targets): clean_%: + docker container prune -f + docker image prune -f + -docker image rm -f ${IMAGE}_$*:install 2>/dev/null + -docker image rm -f ${IMAGE}_$*:devel 2>/dev/null + -docker image rm -f ${IMAGE}_$*:env 2>/dev/null + -rm -f cache/$*/docker_install.tar + -rm -f cache/$*/docker_devel.tar + -rm -f cache/$*/docker_env.tar + -rmdir cache/$* + +.PHONY: distclean +distclean: clean + -docker container rm -f $$(docker container ls -aq) + -docker image rm -f $$(docker image ls -aq) diff --git a/.ci/docker/alpine/Dockerfile b/.ci/docker/alpine/Dockerfile new file mode 100644 index 000000000..4c1409331 --- /dev/null +++ b/.ci/docker/alpine/Dockerfile @@ -0,0 +1,46 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/alpine +FROM alpine:edge AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apk add --no-cache git build-base linux-headers libexecinfo-dev cmake + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/archlinux/Dockerfile b/.ci/docker/archlinux/Dockerfile new file mode 100644 index 000000000..77e8b1d1a --- /dev/null +++ b/.ci/docker/archlinux/Dockerfile @@ -0,0 +1,46 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/archlinux/ +FROM archlinux/base AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN pacman -Syu --noconfirm base-devel git cmake + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/centos/Dockerfile b/.ci/docker/centos/Dockerfile new file mode 100644 index 000000000..f206b256b --- /dev/null +++ b/.ci/docker/centos/Dockerfile @@ -0,0 +1,52 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/centos +FROM centos:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN yum -y update \ +&& yum -y groupinstall "Development Tools" \ +&& yum -y install epel-release \ +&& yum -y install cmake3 \ +&& ln -s /usr/bin/cmake3 /usr/local/bin/cmake \ +&& yum clean all \ +&& rm -rf /var/cache/yum + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -H. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/debian/Dockerfile b/.ci/docker/debian/Dockerfile new file mode 100644 index 000000000..fccdf808a --- /dev/null +++ b/.ci/docker/debian/Dockerfile @@ -0,0 +1,49 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/debian +FROM debian:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apt-get update -q && \ +apt-get install -yq git build-essential cmake && \ +apt-get clean && \ +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/fedora/Dockerfile b/.ci/docker/fedora/Dockerfile new file mode 100644 index 000000000..7fc72a489 --- /dev/null +++ b/.ci/docker/fedora/Dockerfile @@ -0,0 +1,49 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/fedora +FROM fedora:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN dnf -y update \ +&& dnf -y groupinstall "Development Tools" \ +&& dnf -y install cmake gcc-c++ \ +&& dnf clean all + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/opensuse/Dockerfile b/.ci/docker/opensuse/Dockerfile new file mode 100644 index 000000000..1695addbd --- /dev/null +++ b/.ci/docker/opensuse/Dockerfile @@ -0,0 +1,49 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/r/opensuse/tumbleweed +FROM opensuse/tumbleweed AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN zypper up -y \ +&& zypper install -y gcc gcc-c++ cmake git \ +&& zypper clean -a +ENV CC=gcc CXX=g++ + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/ubuntu/Dockerfile b/.ci/docker/ubuntu/Dockerfile new file mode 100644 index 000000000..528d34f9d --- /dev/null +++ b/.ci/docker/ubuntu/Dockerfile @@ -0,0 +1,49 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/ubuntu +FROM ubuntu:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apt-get update -q && \ +apt-get install -yq git build-essential cmake && \ +apt-get clean && \ +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/CoinUtils.git \ +&& cd CoinUtils \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf CoinUtils + +RUN cd /tmp \ +&& git clone https://github.com/Mizux/Osi.git \ +&& cd Osi \ +&& cmake -H. -Bbuild \ +&& cmake --build build --target install \ +&& cd .. \ +&& rm -rf Osi + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -H. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/sample/CMakeLists.txt b/.ci/sample/CMakeLists.txt new file mode 100644 index 000000000..2e78a62e5 --- /dev/null +++ b/.ci/sample/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.5) +project(Sample VERSION 1.0.0 LANGUAGES CXX) + +include(CTest) +find_package(Clp REQUIRED) + +add_executable(sample main.cpp) +#target_compile_features(sample PUBLIC cxx_std_11) +set_target_properties(sample PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + VERSION ${PROJECT_VERSION}) +target_link_libraries(sample PRIVATE Coin::Clp) + +if(BUILD_TESTING) + add_test(NAME sample_UT COMMAND sample) +endif() + +include(GNUInstallDirs) +install(TARGETS sample + EXPORT SampleTargets + DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/.ci/sample/main.cpp b/.ci/sample/main.cpp new file mode 100644 index 000000000..765fd4caf --- /dev/null +++ b/.ci/sample/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main(int argc, char** argv) { + std::cout << "coinutils version: " << COINUTILS_VERSION << std::endl; + std::cout << "clp version: " << CLP_VERSION << std::endl; + return 0; +} + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..64ca80501 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Project Files unneeded by docker +.ci/cache +.ci/docker +.git +.gitignore +.github +.dockerignore +.travis.yml +.clang-format +AUTHORS +INSTALL +install-sh +missing +README +README.md + +build/ + +# Editor directories and files +*.user +*.swp diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0b76a74bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.swp +.vs/ +build/ +cache/ diff --git a/.travis.yml b/.travis.yml index c1ba38bda..818e4cf53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,36 +1,70 @@ -language: cpp env: global: - secure: dNf+ddgmbhuzrGHsO6eWuEQ9rTZbIQjdBX47TDnGulwWpOS8LyEoZNFz3IAvf9HJBY2L/pM3F6BvSfXpumX+qX2BVZLUETX54lk07i8PnGWgq0O0ylW5sB3xM0bNGPALiH3sBJEHeimEoRIAkbg+bXafLWo4cDFtQ7IT4mg6fQxq+MGNyr5GnSBkTRK7TdXef1dOylF0R2OV/xXVTr0xEkCb4ONB32ljZ1YZrYw0RzeDWX+rp674S1DnqhC3cYuOjK0Yl3h0uDHEI/rdvJmTahii9C5AILA8eB8Lc4jBlQmXlXYHy7Rr10KIwK7qYNFal6WyS4SbyBLZ6t3bNFrXe3ayMnhllVs0RsreMgMaJ78nGuHmpdQ8FJWlOIEWOYEFO6j/WnQwN7d6U4cgmB0mWmQJoO59qGuw1FsRTMssTJNeOd5t8WVi3AyNSV+GE4n+ZE1Bh4KIhmmhWno+w5iHKIHpr0SocxhPB5jQ2mEm1GhG8ZvM+wAollabkXCfeF9brGCh5IbTib10UpAkDkoeLYSpHO4Blshu5Tkpu0OXe1zcTwfUewbrZ1NZIS6LWdau6ISiPLQSnL+BwgZcIMJ/ZqUEmCtaBE79gQ/h730/Ekxkmdfr9KuvqnF+UTqXtRJeru/uZ0n2LTj7xrjpct2eFHZzGJlp2sAfQWfLK7EWg5A= matrix: include: - - os: linux + - language: cpp + os: linux addons: apt: packages: - gfortran - liblapack-dev - - os: linux + + - language: cpp + os: linux dist: bionic addons: apt: packages: - gfortran - liblapack-dev - - os: osx + + - language: cpp + os: osx osx_image: xcode11 env: OSX=10.14 CC=gcc CXX=g++ compiler: clang - - os: osx + - language: cpp + os: osx osx_image: xcode11 - env: OSX=10.14 + env: OSX=10.14 compiler: clang - - os: osx + - language: cpp + os: osx osx_image: xcode10 - env: OSX=10.13 + env: OSX=10.13 compiler: clang + - language: minimal + dist: bionic + env: DISTRO=alpine + - language: minimal + dist: bionic + env: DISTRO=archlinux + - language: minimal + dist: bionic + env: DISTRO=centos + - language: minimal + dist: bionic + env: DISTRO=debian + - language: minimal + dist: bionic + env: DISTRO=fedora + - language: minimal + dist: bionic + env: DISTRO=opensuse + - language: minimal + dist: bionic + env: DISTRO=ubuntu + + allow_failures: + - language: cpp + os: osx + +install: true + before_script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then if [ x`brew list | fgrep bash` != x'bash' ]; then brew install bash; fi; fi @@ -38,21 +72,31 @@ before_script: - if [[ "$TRAVIS_OS_NAME $CC" == "osx gcc" ]]; then export CC=gcc-9 ; export CXX=g++-9 ; $CC --version; $CXX --version; gfortran --version; fi - if [[ "$TRAVIS_OS_NAME $CC" == "osx clang" ]]; then export PLATFORM=osx$OSX-x86_64-clang`clang -dumpversion`; fi - if [[ "$TRAVIS_OS_NAME $CC" == "osx gcc-9" ]]; then export PLATFORM=osx$OSX-x86_64-gcc`gcc-9 -dumpversion`; fi - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export PLATFORM=linux-x86_64-gcc`gcc -dumpversion`; fi - - cd .. - - wget https://raw.githubusercontent.com/coin-or/coinbrew/master/coinbrew - - export PROJECT_URL=https://github.com/$TRAVIS_REPO_SLUG - - export PROJECT=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 2` - - bash ./coinbrew fetch $PROJECT_URL:$TRAVIS_BRANCH --no-prompt --skip-update + - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ -z "$DISTRO" ]]; then export PLATFORM=linux-x86_64-gcc`gcc -dumpversion`; fi + - if [[ -z "$DISTRO" ]]; then cd ..; fi + - if [[ -z "$DISTRO" ]]; then wget https://raw.githubusercontent.com/coin-or/coinbrew/master/coinbrew; fi + - if [[ -z "$DISTRO" ]]; then export PROJECT_URL=https://github.com/$TRAVIS_REPO_SLUG; fi + - if [[ -z "$DISTRO" ]]; then export PROJECT=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 2`; fi + - if [[ -z "$DISTRO" ]]; then bash ./coinbrew fetch $PROJECT_URL:$TRAVIS_BRANCH --no-prompt --skip-update; fi script: - - bash ./coinbrew build $PROJECT --no-prompt --verbosity 2 --test --enable-relocatable + - if [[ -z "$DISTRO" ]]; then bash ./coinbrew build $PROJECT --no-prompt --verbosity 2 --test --enable-relocatable; fi + + - > + if [[ ! -z "$DISTRO" ]]; then ( + cd .ci && + make env_${DISTRO} && + make devel_${DISTRO} && + make test_${DISTRO} && + make install_${DISTRO} && + make test_install_${DISTRO} || + travis_terminate 1 ); fi after_script: - - if [ $TRAVIS_BRANCH = "master" ]; then export VERSION=master; else export VERSION=`echo $TRAVIS_BRANCH | cut -d "/" -f 2`; fi - - export TGZ_FILE=$PROJECT-$VERSION-$PLATFORM.tgz - - echo $TGZ_FILE - - cp README.md LICENSE dist - - cd dist - - tar -czvf $TGZ_FILE lib/* bin/* include/* share/* README.md LICENSE - - curl -T $TGZ_FILE -utkralphs:$BINTRAY_API -H "X-Bintray-Publish:1" -H "X-Bintray-Override:1" https://api.bintray.com/content/coin-or/download/$PROJECT/$VERSION/$TGZ_FILE + - if [ $TRAVIS_BRANCH = "master" ] && [[ -z "$DISTRO" ]]; then export VERSION=master; else export VERSION=`echo $TRAVIS_BRANCH | cut -d "/" -f 2`; fi + - if [[ -z "$DISTRO" ]]; then export TGZ_FILE=$PROJECT-$VERSION-$PLATFORM.tgz; fi + - if [[ -z "$DISTRO" ]]; then echo $TGZ_FILE; fi + - if [[ -z "$DISTRO" ]]; then cp README.md LICENSE dist; fi + - if [[ -z "$DISTRO" ]]; then cd dist; fi + - if [[ -z "$DISTRO" ]]; then tar -czvf $TGZ_FILE lib/* bin/* include/* share/* README.md LICENSE; fi + - if [[ -z "$DISTRO" ]]; then curl -T $TGZ_FILE -utkralphs:$BINTRAY_API -H "X-Bintray-Publish:1" -H "X-Bintray-Override:1" https://api.bintray.com/content/coin-or/download/$PROJECT/$VERSION/$TGZ_FILE; fi diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..3f8fbce0b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.5) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include(ParseAc) +parse_ac(VERSION MAJOR MINOR PATCH) + +project(Clp VERSION ${VERSION}) + +# config options +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +option(BUILD_SHARED_LIBS "" ON) +if(BUILD_SHARED_LIBS AND MSVC) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif(BUILD_SHARED_LIBS AND MSVC) + +# config options +if(MSVC) + # Build with multiple processes + add_definitions(/MP) + add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE) + # MSVC warning suppressions + add_definitions( + /wd4018 # 'expression' : signed/unsigned mismatch + /wd4065 # switch statement contains 'default' but no 'case' labels + /wd4101 # 'identifier' : unreferenced local variable + /wd4102 # 'label' : unreferenced label + /wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data + /wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data + /wd4309 # 'conversion' : truncation of constant value + /wd4805 # 'operation' : unsafe mix of type 'type1' and type 'type2' in operation. + /wd4996 # The compiler encountered a deprecated declaration. + ) +endif() +if(APPLE) + set( + CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -Wno-inconsistent-missing-override -Wno-unused-command-line-argument -Wno-unused-result -Wno-exceptions" + ) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version") +endif(APPLE) + +# ZLIB +if(NOT TARGET ZLIB::ZLIB) + find_package(ZLIB) +endif() +if(ZLIB_FOUND OR TARGET ZLIB::ZLIB) + set(HAVE_ZLIB_H "1" CACHE INTERNAL "Use zlib") + set(COIN_HAS_ZLIB "1" CACHE INTERNAL "Use zlib") +endif() + +# PThread +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads) +if(CMAKE_USE_PTHREADS_INIT) + set(PTHREADS_FOUND TRUE) +else() + set(PTHREADS_FOUND FALSE) +endif() + +# CoinUtils +if(NOT TARGET Coin::CoinUtils) + find_package(CoinUtils REQUIRED CONFIG) +endif() +# Osi +if(NOT TARGET Coin::Osi) + find_package(Osi REQUIRED CONFIG) +endif() + +include(CheckEnv) +include(CTest) + +add_subdirectory(src) + +include(GNUInstallDirs) +install(EXPORT ${PROJECT_NAME}Targets + NAMESPACE Coin:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") +include(CMakePackageConfigHelpers) +configure_package_config_file(cmake/Config.cmake.in + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + COMPATIBILITY SameMajorVersion) +install( + FILES + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + COMPONENT Devel) diff --git a/cmake/CheckEnv.cmake b/cmake/CheckEnv.cmake new file mode 100644 index 000000000..b24770250 --- /dev/null +++ b/cmake/CheckEnv.cmake @@ -0,0 +1,151 @@ +# Flags +include (CheckIncludeFile) +check_include_file(math.h HAVE_MATH_H) +check_include_file(ctype.h HAVE_CTYPE_H) +check_include_file(inttypes.h HAVE_INTTYPES_H) +check_include_file(float.h HAVE_FLOAT_H) +check_include_file(ieeefp.h HAVE_IEEEFP_H) +check_include_file(stdarg.h HAVE_STDARG_H) +check_include_file(stddef.h HAVE_STDDEF_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stdio.h HAVE_STDIO_H) +check_include_file(stdlib.h HAVE_STDLIB_H) +check_include_file(assert.h HAVE_ASSERT_H) +check_include_file(dlfcn.h HAVE_DLFCN_H) +check_include_file(endian.h HAVE_ENDIAN_H) +check_include_file(memory.h HAVE_MEMORY_H) +check_include_file(strings.h HAVE_STRINGS_H) +check_include_file(string.h HAVE_STRING_H) +check_include_file(time.h HAVE_TIME_H) +check_include_file(unistd.h HAVE_UNISTD_H) +check_include_file(sys/stat.h HAVE_SYS_STAT_H) +check_include_file(sys/types.h HAVE_SYS_TYPES_H) + +include (CheckIncludeFileCXX) +check_include_file_cxx(cmath HAVE_CMATH) +check_include_file_cxx(cctype HAVE_CCTYPE) +check_include_file_cxx(cinttypes HAVE_CINTTYPES) +check_include_file_cxx(cfloat HAVE_CFLOAT) +check_include_file_cxx(cieeefp HAVE_CIEEEFP) +check_include_file_cxx(cstdarg HAVE_CSTDARG) +check_include_file_cxx(cstddef HAVE_CSTDDEF) +check_include_file_cxx(cstdint HAVE_CSTDINT) +check_include_file_cxx(cstdio HAVE_CSTDIO) +check_include_file_cxx(cstdlib HAVE_CSTDLIB) +check_include_file_cxx(cassert HAVE_CASSERT) +check_include_file_cxx(cstring HAVE_CSTRING) +check_include_file_cxx(ctime HAVE_CTIME) + +set(STDC_HEADERS 1 CACHE INTERNAL "System has ANSI C header files") + +set(TEST_INCLUDES "") +if(HAVE_CMATH) + list(APPEND TEST_INCLUDES "cmath") +endif() +if(HAVE_CFLOAT) + list(APPEND TEST_INCLUDES "cfloat") +endif() +if(HAVE_CIEEEFP) + list(APPEND TEST_INCLUDES "cieeefp") +endif() +if(HAVE_MATH_H) + list(APPEND TEST_INCLUDES "math.h") +endif() +if(HAVE_FLOAT_H) + list(APPEND TEST_INCLUDES "float.h") +endif() +if(HAVE_IEEEFP_H) + list(APPEND TEST_INCLUDES "ieeefp.h") +endif() + +# ISFINITE +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( + "#include \nint main(){return std::isfinite(0);}" + HAVE_STD_ISFINITE) +include(CheckFunctionExists) +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(isfinite "${TEST_INCLUDES}" HAVE_ISFINITE) +check_cxx_symbol_exists(finite "${TEST_INCLUDES}" HAVE_FINITE) +check_cxx_symbol_exists(_finite "${TEST_INCLUDES}" HAVE__FINITE) +check_cxx_symbol_exists(__finite "${TEST_INCLUDES}" HAVE___FINITE) +if(HAVE_STD_ISFINITE) + set(COIN_C_FINITE "std::isfinite") +elseif(HAVE_ISFINITE) + set(COIN_C_FINITE "isfinite") +elseif(HAVE_FINITE) + set(COIN_C_FINITE "finite") +elseif(HAVE__FINITE) + set(COIN_C_FINITE "_finite") +elseif(HAVE___FINITE) + set(COIN_C_FINITE "__finite") +else() + message(FATAL_ERROR "Can't find isfinite()") +endif() +message(STATUS "Found isfinite: ${COIN_C_FINITE}") + +# ISNAN +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( + "#include \nint main(){return std::isnan(0);}" + HAVE_STD_ISNAN) +include(CheckFunctionExists) +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(isnan "${TEST_INCLUDES}" HAVE_ISNAN) +check_cxx_symbol_exists(_isnan "${TEST_INCLUDES}" HAVE__ISNAN) +check_cxx_symbol_exists(__isnan "${TEST_INCLUDES}" HAVE___ISNAN) +if(HAVE_STD_ISNAN) + set(COIN_C_ISNAN "std::isnan") +elseif(HAVE_ISNAN) + set(COIN_C_ISNAN "isnan") +elseif(HAVE__ISNAN) + set(COIN_C_ISNAN "_isnan") +elseif(HAVE___ISNAN) + set(COIN_C_ISNAN "__isnan") +else() + message(FATAL_ERROR "Can't find isnan()") +endif() +message(STATUS "Found isnan: ${COIN_C_ISNAN}") + +# Basic type +include(CheckTypeSize) +check_type_size("int64_t" SIZEOF_INT64_T) +check_type_size("long long" SIZEOF_LONG_LONG) +check_type_size("long" SIZEOF_LONG) +check_type_size("uint64_t" SIZEOF_UINT64_T) +check_type_size("unsigned long long" SIZEOF_ULONG_LONG) +check_type_size("unsigned long" SIZEOF_ULONG) +check_type_size("intptr_t" SIZEOF_INTPTR_T) +check_type_size("int *" SIZEOF_INT_P) + +if(SIZEOF_INT64_T EQUAL "8") + set(COIN_INT64_T "int64_t") +elseif(SIZEOF_LONG EQUAL "8") + set(COIN_INT64_T "long") +elseif(SIZEOF_LONG_LONG EQUAL "8") + set(COIN_INT64_T "long long") +else() + message(FATAL_ERROR "Can't find suitable int64_t") +endif() +message(STATUS "Found int64_t: ${COIN_INT64_T}") + +if(SIZEOF_UINT64_T EQUAL "8") + set(COIN_UINT64_T "uint64_t") +elseif(SIZEOF_ULONG EQUAL "8") + set(COIN_INT64_T "unsigned long") +elseif(SIZEOF_ULONG_LONG EQUAL "8") + set(COIN_INT64_T "unsigned long long") +else() + message(FATAL_ERROR "Can't find suitable uint64_t") +endif() +message(STATUS "Found uint64_t: ${COIN_UINT64_T}") + +if(SIZEOF_INTPTR_T) + set(COIN_INTPTR_T "intptr_t") +elseif(SIZEOF_INT_P) + set(COIN_INTPTR_T "int *") +else() + message(FATAL_ERROR "Can't find suitable intptr_t") +endif() +message(STATUS "Found intptr_t: ${COIN_INTPTR_T}") + diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 000000000..bd22be92f --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,25 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +if(@ZLIB_FOUND@) + find_dependency(ZLIB REQUIRED) +endif() + +if(@PTHREADS_FOUND@) + find_dependency(Threads REQUIRED) +endif() + +if(${CMAKE_VERSION} VERSION_LESS "3.9.6") + find_dependency(CoinUtils REQUIRED) +else() + find_dependency(CoinUtils REQUIRED CONFIG) +endif() + +if(${CMAKE_VERSION} VERSION_LESS "3.9.6") + find_dependency(Osi REQUIRED) +else() + find_dependency(Osi REQUIRED CONFIG) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") diff --git a/cmake/ParseAc.cmake b/cmake/ParseAc.cmake new file mode 100644 index 000000000..aefb9c4ca --- /dev/null +++ b/cmake/ParseAc.cmake @@ -0,0 +1,28 @@ +function(parse_ac VERSION_STRING VERSION_MAJOR VERSION_MINOR VERSION_PATCH) + file(READ "configure.ac" IN) + if(IN MATCHES "AC_INIT\\(.*trunk.*\\)") + message(WARNING "using trunk...") + set(MAJOR 999) + set(MINOR 0) + set(PATCH 0) + else() + # AC_INIT([Clp],[major.minor.patch or trunk],[url or email]) + string(REGEX MATCH + "AC_INIT\\([^,]+,\\[([0-9]+)\\.([0-9]+)(\\.([0-9]+))?\\],[^\\)]+\\)" AC_INIT ${IN}) + message(STATUS "AC_INIT: ${AC_INIT}") + set(MAJOR ${CMAKE_MATCH_1}) + set(MINOR ${CMAKE_MATCH_2}) + if(CMAKE_MATCH_3) + set(PATCH ${CMAKE_MATCH_4}) + else() + set(PATCH 0) + endif() + endif() + set(VERSION "${MAJOR}.${MINOR}.${PATCH}") + + set(${VERSION_MAJOR} ${MAJOR} PARENT_SCOPE) + set(${VERSION_MINOR} ${MINOR} PARENT_SCOPE) + set(${VERSION_PATCH} ${PATCH} PARENT_SCOPE) + set(${VERSION_STRING} ${VERSION} PARENT_SCOPE) + message(STATUS "version: ${VERSION}") +endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..4007175c6 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,204 @@ +set(NAME "CLP") + +# PTHREAD +if(PTHREADS_FOUND) + set(${NAME}_PTHREADS "1" CACHE INTERNAL "Use pthread") +endif() + +set(COIN_${NAME}_CHECKLEVEL "0" CACHE INTERNAL + "${NAME} check level") +set(COIN_${NAME}_VERBOSITY "0" CACHE INTERNAL + "${NAME} verbosity level") +configure_file(config.h.cmake.in config.h) +configure_file(config_clp.h.cmake.in config_clp.h) + +set(_SRCS + ClpCholeskyBase.cpp + ClpCholeskyDense.cpp + ClpConstraint.cpp + ClpConstraintLinear.cpp + ClpConstraintQuadratic.cpp + Clp_C_Interface.cpp + ClpDualRowDantzig.cpp + ClpDualRowPivot.cpp + ClpDualRowSteepest.cpp + ClpDummyMatrix.cpp + ClpDynamicExampleMatrix.cpp + ClpDynamicMatrix.cpp + ClpEventHandler.cpp + ClpFactorization.cpp + ClpGubDynamicMatrix.cpp + ClpGubMatrix.cpp + ClpHelperFunctions.cpp + ClpInterior.cpp + ClpLinearObjective.cpp + ClpMatrixBase.cpp + ClpMessage.cpp + ClpModel.cpp + ClpNetworkBasis.cpp + ClpNetworkMatrix.cpp + ClpNonLinearCost.cpp + ClpNode.cpp + ClpObjective.cpp + ClpPackedMatrix.cpp + ClpPlusMinusOneMatrix.cpp + ClpPredictorCorrector.cpp + ClpPdco.cpp + ClpPdcoBase.cpp + ClpLsqr.cpp + ClpPresolve.cpp + ClpPrimalColumnDantzig.cpp + ClpPrimalColumnPivot.cpp + ClpPrimalColumnSteepest.cpp + ClpQuadraticObjective.cpp + ClpSimplex.cpp + ClpSimplexDual.cpp + ClpSimplexNonlinear.cpp + ClpSimplexOther.cpp + ClpSimplexPrimal.cpp + ClpSolve.cpp + Idiot.cpp + IdiSolve.cpp + ClpCholeskyPardiso.cpp + ClpPESimplex.cpp + ClpPEDualRowDantzig.cpp + ClpPEDualRowSteepest.cpp + ClpPEPrimalColumnDantzig.cpp + ClpPEPrimalColumnSteepest.cpp + ) + +set(_HDRS + ClpConfig.h + ClpCholeskyBase.hpp + ClpCholeskyDense.hpp + ClpConstraint.hpp + ClpConstraintLinear.hpp + ClpConstraintQuadratic.hpp + Clp_C_Interface.h + ClpDualRowDantzig.hpp + ClpDualRowPivot.hpp + ClpDualRowSteepest.hpp + ClpDummyMatrix.hpp + ClpDynamicExampleMatrix.hpp + ClpDynamicMatrix.hpp + ClpEventHandler.hpp + ClpFactorization.hpp + ClpGubDynamicMatrix.hpp + ClpGubMatrix.hpp + ClpHelperFunctions.hpp + ClpInterior.hpp + ClpLinearObjective.hpp + ClpMatrixBase.hpp + ClpMessage.hpp + ClpModel.hpp + ClpNetworkBasis.hpp + ClpNetworkMatrix.hpp + ClpNonLinearCost.hpp + ClpNode.hpp + ClpObjective.hpp + ClpPackedMatrix.hpp + ClpParameters.hpp + ClpPlusMinusOneMatrix.hpp + ClpPredictorCorrector.hpp + ClpPdco.hpp + ClpPdcoBase.hpp + ClpLsqr.hpp + ClpPresolve.hpp + ClpPrimalColumnDantzig.hpp + ClpPrimalColumnPivot.hpp + ClpPrimalColumnSteepest.hpp + ClpQuadraticObjective.hpp + ClpSimplex.hpp + ClpSimplexDual.hpp + ClpSimplexNonlinear.hpp + ClpSimplexOther.hpp + ClpSimplexPrimal.hpp + ClpSolve.hpp + Idiot.hpp + ClpCholeskyPardiso.hpp + ClpPESimplex.hpp + ClpPEDualRowDantzig.hpp + ClpPEDualRowSteepest.hpp + ClpPEPrimalColumnDantzig.hpp + ClpPEPrimalColumnSteepest.hpp + ) + +add_library(Clp ${_SRCS} ${_HDRS}) +target_include_directories(Clp PUBLIC + $ + $ + $) +target_compile_definitions(Clp + PUBLIC HAVE_CONFIG_H + PRIVATE CLP_BUILD COIN_HAS_CLP) +if(CMAKE_VERSION VERSION_LESS "3.8.2") + set_property(TARGET Clp PROPERTY CXX_STANDARD 11) + set_property(TARGET Clp PROPERTY CXX_STANDARD_REQUIRED ON) +else() + target_compile_features(Clp PUBLIC cxx_std_11) +endif() +target_link_libraries(Clp PUBLIC + Coin::CoinUtils + Coin::Osi) +set_target_properties(Clp PROPERTIES + PUBLIC_HEADER "${_HDRS};CbcOrClpParam.cpp;${CMAKE_CURRENT_BINARY_DIR}/config_clp.h" + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) +add_library(Coin::Clp ALIAS Clp) + +# Install +include(GNUInstallDirs) +install(TARGETS Clp + EXPORT ${PROJECT_NAME}Targets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + +################# +## ClpSolver ## +################# +set(_SRCS + ClpSolver.cpp + CbcOrClpParam.cpp + MyEventHandler.cpp + MyMessageHandler.cpp) + +set(_HDRS + CbcOrClpParam.hpp + MyEventHandler.hpp + MyMessageHandler.hpp + unitTest.cpp) + +add_library(ClpSolver ${_SRCS} ${_HDRS}) +target_include_directories(ClpSolver PUBLIC + $ + $) +target_compile_definitions(ClpSolver + PUBLIC HAVE_CONFIG_H + PRIVATE CLP_BUILD COIN_HAS_CLP) +if(CMAKE_VERSION VERSION_LESS "3.8.2") + set_property(TARGET ClpSolver PROPERTY CXX_STANDARD 11) + set_property(TARGET ClpSolver PROPERTY CXX_STANDARD_REQUIRED ON) +else() + target_compile_features(ClpSolver PUBLIC cxx_std_11) +endif() +target_link_libraries(ClpSolver PUBLIC Coin::Clp) +set_target_properties(ClpSolver PROPERTIES + PUBLIC_HEADER "${_HDRS}" + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) +add_library(Coin::ClpSolver ALIAS ClpSolver) + +# Install +install(TARGETS ClpSolver + EXPORT ${PROJECT_NAME}Targets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + +############## +## OsiClp ## +############## +add_subdirectory(OsiClp) diff --git a/src/OsiClp/CMakeLists.txt b/src/OsiClp/CMakeLists.txt new file mode 100644 index 000000000..ef4a3c6fb --- /dev/null +++ b/src/OsiClp/CMakeLists.txt @@ -0,0 +1,39 @@ +set(NAME "OSICLP") + +configure_file(config_osiclp.h.cmake.in config_osiclp.h) +configure_file(config_osiclp.h.cmake.in OsiClpConfig.h) + +set(_SRCS OsiClpSolverInterface.cpp) +set(_HDRS OsiClpSolverInterface.hpp) + +add_library(OsiClp ${_SRCS} ${_HDRS}) +target_include_directories(OsiClp PUBLIC + $ + $ + $) +target_compile_definitions(OsiClp + PUBLIC HAVE_CONFIG_H + PRIVATE CLP_BUILD) +if(CMAKE_VERSION VERSION_LESS "3.8.2") + set_property(TARGET OsiClp PROPERTY CXX_STANDARD 11) + set_property(TARGET OsiClp PROPERTY CXX_STANDARD_REQUIRED ON) +else() + target_compile_features(OsiClp PUBLIC cxx_std_11) +endif() +target_link_libraries(OsiClp PUBLIC + Coin::CoinUtils + Coin::Osi + Coin::Clp) +set_target_properties(OsiClp PROPERTIES + PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_osiclp.h;${CMAKE_CURRENT_BINARY_DIR}/OsiClpConfig.h" + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) +add_library(Coin::OsiClp ALIAS OsiClp) + +# Install +install(TARGETS OsiClp + EXPORT ${PROJECT_NAME}Targets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) diff --git a/src/OsiClp/config_osiclp.h.cmake.in b/src/OsiClp/config_osiclp.h.cmake.in new file mode 100644 index 000000000..fddeb7bb9 --- /dev/null +++ b/src/OsiClp/config_osiclp.h.cmake.in @@ -0,0 +1,7 @@ +#ifndef __CONFIG_${NAME}_H__ +#define __CONFIG_${NAME}_H__ + +/* Library Visibility Attribute */ +#define ${NAME}LIB_EXPORT + +#endif diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in new file mode 100644 index 000000000..eced4bf89 --- /dev/null +++ b/src/config.h.cmake.in @@ -0,0 +1,116 @@ +/*config.h. Generated by configure_file.*/ + +#define COIN_HAS_COINUTILS 1 +#define COIN_HAS_OSI 1 + +/* Library Visibility Attribute */ +#define ${NAME}LIB_EXPORT + +/* VERSION */ +#define VERSION "${VERSION}" +/* ${NAME}_VERSION */ +#define ${NAME}_VERSION "${VERSION}" +/* ${NAME}_VERSION_MAJOR */ +#define ${NAME}_VERSION_MAJOR ${MAJOR} +/* ${NAME}_VERSION_MINOR */ +#define ${NAME}_VERSION_MINOR ${MINOR} +/* ${NAME}_VERSION_RELEASE */ +#define ${NAME}_VERSION_RELEASE ${PATCH} + +/* HAVE_MATH_H */ +#cmakedefine HAVE_MATH_H ${HAVE_MATH_H} +/* HAVE_CTYPE_H */ +#cmakedefine HAVE_CTYPE_H ${HAVE_CTYPE_H} +/* HAVE_INTTYPES_H */ +#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} +/* HAVE_FLOAT_H */ +#cmakedefine HAVE_FLOAT_H ${HAVE_FLOAT_H} +/* HAVE_IEEEFP_H */ +#cmakedefine HAVE_IEEEFP_H ${HAVE_IEEEFP_H} +/* HAVE_STDARG_H */ +#cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H} +/* HAVE_STDDEF_H */ +#cmakedefine HAVE_STDDEF_H ${HAVE_STDDEF_H} +/* HAVE_STDINT_H */ +#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} +/* HAVE_STDIO_H */ +#cmakedefine HAVE_STDIO_H ${HAVE_STDIO_H} +/* HAVE_STDLIB_H */ +#cmakedefine HAVE_STDLIB_H ${HAVE_STDLIB_H} +/* HAVE_ASSERT_H */ +#cmakedefine HAVE_ASSERT_H ${HAVE_ASSERT_H} +/* HAVE_DLFCN_H */ +#cmakedefine HAVE_DLFCN_H ${HAVE_DLFCN_H} +/* HAVE_ENDIAN_H */ +#cmakedefine HAVE_ENDIAN_H ${HAVE_ENDIAN_H} +/* HAVE_MEMORY_H */ +#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H} +/* HAVE_STRINGS_H */ +#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H} +/* HAVE_STRING_H */ +#cmakedefine HAVE_STRING_H ${HAVE_STRING_H} +/* HAVE_TIME_H */ +#cmakedefine HAVE_TIME_H ${HAVE_TIME_H} +/* HAVE_UNISTD_H */ +#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} +/* HAVE_SYS_STAT_H */ +#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H} +/* HAVE_SYS_TYPES_H */ +#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} + +/* HAVE_CMATH */ +#cmakedefine HAVE_CMATH ${HAVE_CMATH} +/* HAVE_CCTYPE */ +#cmakedefine HAVE_CCTYPE ${HAVE_CCTYPE} +/* HAVE_CINTTYPES */ +#cmakedefine HAVE_CINTTYPES ${HAVE_CINTTYPES} +/* HAVE_CFLOAT */ +#cmakedefine HAVE_CFLOAT ${HAVE_CFLOAT} +/* HAVE_CIEEEFP */ +#cmakedefine HAVE_CIEEEFP ${HAVE_CIEEEFP} +/* HAVE_CSTDARG */ +#cmakedefine HAVE_CSTDARG ${HAVE_CSTDARG} +/* HAVE_CSTDDEF */ +#cmakedefine HAVE_CSTDDEF ${HAVE_CSTDDEF} +/* HAVE_CSTDINT */ +#cmakedefine HAVE_CSTDINT ${HAVE_CSTDINT} +/* HAVE_CSTDIO */ +#cmakedefine HAVE_CSTDIO ${HAVE_CSTDIO} +/* HAVE_CSTDLIB */ +#cmakedefine HAVE_CSTDLIB ${HAVE_CSTDLIB} +/* HAVE_CASSERT */ +#cmakedefine HAVE_CASSERT ${HAVE_CASSERT} +/* HAVE_CSTRING */ +#cmakedefine HAVE_CSTRING ${HAVE_CSTRING} +/* HAVE_CTIME */ +#cmakedefine HAVE_CTIME ${HAVE_CTIME} + +/* COIN_C_FINITE */ +#cmakedefine COIN_C_FINITE ${COIN_C_FINITE} +/* COIN_C_ISNAN */ +#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN} +/* COIN_INT64_T */ +#cmakedefine COIN_INT64_T ${COIN_INT64_T} +/* COIN_UINT64_T */ +#cmakedefine COIN_UINT64_T ${COIN_UINT64_T} +/* COIN_INTPTR_T */ +#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T} + +/* COIN_${NAME}_CHECKLEVEL */ +#define COIN_${NAME}_CHECKLEVEL ${COIN_${NAME}_CHECKLEVEL} +/* COIN_${NAME}_VERBOSITY */ +#define COIN_${NAME}_VERBOSITY ${COIN_${NAME}_VERBOSITY} + +/* PACKAGE */ +#cmakedefine PACKAGE +/* PACKAGE_NAME */ +#cmakedefine PACKAGE_NAME +/* PACKAGE_VERSION */ +#cmakedefine PACKAGE_VERSION +/* PACKAGE_STRING */ +#cmakedefine PACKAGE_STRING +/* PACKAGE_TARNAME */ +#cmakedefine PACKAGE_TARNAME +/* PACKAGE_BUGREPORT */ +#cmakedefine PACKAGE_BUGREPORT + diff --git a/src/config_clp.h.cmake.in b/src/config_clp.h.cmake.in new file mode 100644 index 000000000..79e8721cc --- /dev/null +++ b/src/config_clp.h.cmake.in @@ -0,0 +1,16 @@ +#ifndef __CONFIG_${NAME}_H__ +#define __CONFIG_${NAME}_H__ + +/* Library Visibility Attribute */ +#define ${NAME}LIB_EXPORT + +/* ${NAME}_VERSION */ +#define ${NAME}_VERSION "${VERSION}" +/* ${NAME}_VERSION_MAJOR */ +#define ${NAME}_VERSION_MAJOR ${MAJOR} +/* ${NAME}_VERSION_MINOR */ +#define ${NAME}_VERSION_MINOR ${MINOR} +/* ${NAME}_VERSION_RELEASE */ +#define ${NAME}_VERSION_RELEASE ${PATCH} + +#endif