cmake_minimum_required(VERSION 3.15...3.27)
include(Platform/${CMAKE_SYSTEM_NAME}-Determine-C OPTIONAL)
include(Platform/${CMAKE_SYSTEM_NAME}-C OPTIONAL)
set(CMAKE_C_COMPILER_NAMES clang gcc icx cc ${CMAKE_C_COMPILER_NAMES})
include(Platform/${CMAKE_SYSTEM_NAME}-Determine-CXX OPTIONAL)
include(Platform/${CMAKE_SYSTEM_NAME}-CXX OPTIONAL)
set(CMAKE_CXX_COMPILER_NAMES clang++ g++ icpx c++ ${CMAKE_CXX_COMPILER_NAMES})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
option(HIGHS_VCPKG "Vcpkg integration: " OFF)
message(STATUS "HIGHS_VCPKG: ${HIGHS_VCPKG}")
include(vcpkg)
include(set-version)
set_version(VERSION ${CMAKE_CURRENT_SOURCE_DIR})
project(HIGHS VERSION ${VERSION} LANGUAGES CXX C)
set(PROJECT_NAMESPACE highs)
message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
if(EXISTS "${LOC_PATH}")
message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file).
Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.")
endif()
option(FAST_BUILD "Fast build: " ON)
find_program(GIT git)
if((GIT) AND(EXISTS ${PROJECT_SOURCE_DIR}/.git))
execute_process(
COMMAND ${GIT} status
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_QUIET)
execute_process(
COMMAND ${GIT} describe --always
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GITHASH OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
set(GITHASH "n/a")
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
message(STATUS "Compiler is IntelLLVM")
if (CMAKE_HOST_WIN32 AND CMAKE_VERSION VERSION_LESS "3.23.0")
message(FATAL_ERROR "Need at least CMake 3.23 for IntelLLVM support of IntelDPCPP package on Windows")
elseif(CMAKE_VERSION VERSION_LESS "3.23.0")
message(FATAL_ERROR "CMake 3.20.5 is the minimum recommended for IntelLLVM on Linux")
endif()
find_package(IntelSYCL REQUIRED)
endif()
message(STATUS "Git hash: " ${GITHASH})
option(BUILD_CXX "Build C++ library" ON)
message(STATUS "Build C++ library: ${BUILD_CXX}")
option(BUILD_CXX_EXE "Build C++ executable" ON)
message(STATUS "Build C++ executable: ${BUILD_CXX_EXE}")
option(BUILD_TESTING "Build Tests" ON)
option(BUILD_SHARED_EXTRAS_LIB "Build shared extras library" ON)
message(STATUS "Build shared extras library: ${BUILD_SHARED_EXTRAS_LIB}")
option(BUILD_STATIC_EXE "Build static executable" OFF)
if (BUILD_STATIC_EXE)
set (BUILD_SHARED_EXTRAS_LIB OFF)
endif()
set(HIGHS_SHARED_EXTRAS_LIBRARY ${BUILD_SHARED_EXTRAS_LIB})
option(FORTRAN "Build Fortran interface" OFF)
message(STATUS "Build Fortran: ${FORTRAN}")
option(CSHARP "Build CSharp interface" OFF)
message(STATUS "Build CSharp: ${CSHARP}")
if (FORTRAN OR CSHARP)
set(BUILD_SHARED_LIBS ON)
endif()
option(HIPO "Build HIPO" OFF)
message(STATUS "Build HIPO: ${HIPO}")
option(HIPO_PYTHON OFF)
if (HIPO_PYTHON)
set(HIPO ON)
message(STATUS "Build HIPO in Python: ON, setting HIPO=ON")
endif()
include(CMakeDependentOption)
CMAKE_DEPENDENT_OPTION(ALL_TESTS "Build all tests" OFF "BUILD_TESTING;BUILD_CXX" OFF)
message(STATUS "Build all tests: ${ALL_TESTS}")
option(BUILD_EXTRA_UNIT_TESTS "Build extra unit tests" OFF)
if (BUILD_EXTRA_UNIT_TESTS)
message(STATUS "Build extra unit tests: ON")
endif()
CMAKE_DEPENDENT_OPTION(BUILD_EXTRA_UNIT_ONLY "Build extra unit tests ONLY" OFF "BUILD_EXTRA_UNIT_TESTS" OFF)
if (BUILD_EXTRA_UNIT_ONLY)
message(STATUS "Build only extra unit tests: ON")
endif()
CMAKE_DEPENDENT_OPTION(BUILD_EXTRA_PROBLEM_SET "Build extra instance tests" OFF "BUILD_TESTING" OFF)
if (BUILD_EXTRA_PROBLEM_SET)
message(STATUS "Build extra instance tests: ON")
endif()
option(ZLIB "ZLIB" ON)
message(STATUS "ZLIB: ${ZLIB}")
option(BUILD_EXAMPLES "Build examples" ON)
message(STATUS "Build examples: ${BUILD_EXAMPLES}")
option(HIGHS_COVERAGE "Activate the code coverage compilation" OFF)
set(DEBUG_MEMORY "Off" CACHE STRING "Sanitizers")
option(EMSCRIPTEN_HTML "Emscripten HTML output" OFF)
option(CUPDLP_GPU "Build pdlp with GPU" OFF)
message(STATUS "Build pdlp with GPU: ${CUPDLP_GPU}")
option(CUPDLP_FIND_CUDA "Build pdlp with GPU" OFF)
message(STATUS "Use FindCUDAConf: ${CUPDLP_FIND_CUDA}")
option(HIGHS_GPU_LIB "Build highs GPU as a single lib" OFF)
message(STATUS "Build GPU with delayed loading: ${HIGHS_GPU_LIB}")
if (HIGHS_GPU_LIB)
set(CUPDLP_GPU ON)
endif()
if(CUPDLP_GPU AND CMAKE_VERSION VERSION_LESS "3.25.0")
message("CUPDLP FindCUDAConf requires CMake version minumum 3.24. Please use a higher version of CMake.")
endif()
option(BUILD_OPENBLAS "Build OpenBLAS" OFF)
message(STATUS "Build OpenBLAS: ${BUILD_OPENBLAS}")
option(NO_AVX512 "Build OpenBLAS without AVX512" OFF)
if (HIPO_PYTHON OR BUILD_STATIC_EXE)
set(NO_AVX512 ON)
endif()
if (NO_AVX512)
message(STATUS "Build OpenBLAS without AVX512: ON")
endif()
if (HIPO AND CSHARP)
message(ERROR "HIPO is only available in C++. Not yet supported in C#.")
endif()
if (HIPO AND FORTRAN)
message(ERROR "HIPO is only available in C++. Not yet supported in FORTRAN")
endif()
if (HIPO AND NOT FAST_BUILD)
message(ERROR "HIPO is only available with FAST_BUILD=ON.")
endif()
if (CUPDLP_GPU)
if (WIN32)
set(BUILD_SHARED_LIBS ON)
endif()
set (CUPDLP_CPU OFF)
message(NOTICE "Set build cuPDLP with CUDA")
if (CUPDLP_FIND_CUDA)
include(FindCUDAConf)
else()
enable_language(CUDA)
find_package(CUDAToolkit REQUIRED)
set(CUDA_LIBRARY-NOTFOUND, OFF)
set(CUDA_LIBRARY CUDA::cudart CUDA::cublas CUDA::cusparse)
endif()
else()
set (CUPDLP_CPU ON)
set(CUDA_LIBRARY-NOTFOUND true)
endif()
if(BUILD_STATIC_EXE)
set(BUILD_SHARED_LIBS OFF)
if(UNIX AND NOT APPLE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
endif()
endif()
if (BUILD_CXX)
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(isMultiConfig)
if(NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Release;Debug" CACHE STRING
"Choose the type of builds, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release;Debug)"
FORCE)
endif()
message(STATUS "Configuration types: ${CMAKE_CONFIGURATION_TYPES}")
else()
if (CMAKE_BUILD_TYPE STREQUAL Release)
set(HiGHSRELEASE ON)
add_compile_definitions("NDEBUG")
else()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release)"
FORCE)
set(HiGHSRELEASE ON)
add_compile_definitions("NDEBUG")
endif()
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
endif()
include(GNUInstallDirs)
if(UNIX)
option(BUILD_SHARED_LIBS "Build shared libraries (.so or .dyld)." ON)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
endforeach()
else()
option(BUILD_SHARED_LIBS "Build shared libraries (.dll)." OFF)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
endforeach()
endif()
if(BUILD_SHARED_LIBS AND MSVC)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
if (BUILD_TESTING)
include(CTest)
endif()
if(MSVC)
option(STDCALL "Build highs with the __stdcall convention" OFF)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
include(CMakePushCheckState)
cmake_push_check_state(RESET)
set(CMAKE_EXTRA_INCLUDE_FILES "cstdint")
include(CheckTypeSize)
check_type_size("long" SIZEOF_LONG LANGUAGE CXX)
message(STATUS "Found long size: ${SIZEOF_LONG}")
check_type_size("long long" SIZEOF_LONG_LONG LANGUAGE CXX)
message(STATUS "Found long long size: ${SIZEOF_LONG_LONG}")
check_type_size("int64_t" SIZEOF_INT64_T LANGUAGE CXX)
message(STATUS "Found int64_t size: ${SIZEOF_INT64_T}")
check_type_size("unsigned long" SIZEOF_ULONG LANGUAGE CXX)
message(STATUS "Found unsigned long size: ${SIZEOF_ULONG}")
check_type_size("unsigned long long" SIZEOF_ULONG_LONG LANGUAGE CXX)
message(STATUS "Found unsigned long long size: ${SIZEOF_ULONG_LONG}")
check_type_size("uint64_t" SIZEOF_UINT64_T LANGUAGE CXX)
message(STATUS "Found uint64_t size: ${SIZEOF_UINT64_T}")
check_type_size("int *" SIZEOF_INT_P LANGUAGE CXX)
message(STATUS "Found int * size: ${SIZEOF_INT_P}")
cmake_pop_check_state()
if(MSVC AND BUILD_SHARED_LIBS)
set(ipo_supported NO)
message(STATUS "IPO / LTO not supported on MSVC when building a shared library")
elseif(MINGW AND NOT CLANG)
set(ipo_supported NO)
message(STATUS "IPO / LTO not currently supported building HiGHS on MinGW")
else()
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0138 NEW)
endif()
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT check_ipo_support_output)
message(STATUS "IPO / LTO supported by compiler: ${ipo_supported}")
endif()
if(DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION)
message(STATUS "IPO / LTO: ${CMAKE_INTERPROCEDURAL_OPTIMIZATION} as requested by user")
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION AND NOT ipo_supported)
message(SEND_ERROR
"IPO / LTO was requested through CMAKE_INTERPROCEDURAL_OPTIMIZATION, "
"but it is not supported by the compiler. The check failed with this output:\n"
"${check_ipo_support_output}")
endif()
elseif(NOT ipo_supported OR (APPLE AND FORTRAN))
message(STATUS "IPO / LTO: disabled because it is not supported")
elseif(NOT BUILD_SHARED_LIBS)
message(STATUS
"IPO / LTO: disabled by default when building a static library; "
"set CMAKE_INTERPROCEDURAL_OPTIMIZATION=ON to enable")
else()
if(EXISTS "/etc/alpine-release")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
message(STATUS "IPO / LTO: disabled on Alpine to avoid conflicts with fortified functions")
else()
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
message(STATUS "IPO / LTO: enabled")
endif()
endif()
if (CUPDLP_GPU AND CMAKE_INTERPROCEDURAL_OPTIMIZATION)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
message(STATUS "IPO / LTO is not supported at the moment when PDLP is using GPU: LTO disabled.")
endif()
if (LINUX AND CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
message(STATUS "IPO / LTO is not supported for 32-bit linux.")
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
message(STATUS "IPO / LTO: disabled for Debug build")
endif()
endif()
include(CheckCXXSourceCompiles)
check_cxx_source_compiles(
"#include <immintrin.h>
int main () {
_mm_pause();
return 0;
}"
HIGHS_HAVE_MM_PAUSE)
if(MSVC)
check_cxx_source_compiles(
"#include <intrin.h>
#pragma intrinsic(_BitScanReverse)
#pragma intrinsic(_BitScanReverse64)
int main () {
unsigned long x = 5;
unsigned long y;
_BitScanReverse(&y, x);
_BitScanReverse64(&x, y);
return 0;
}"
HIGHS_HAVE_BITSCAN_REVERSE)
else()
check_cxx_source_compiles(
"#include <cstdint>
int main () {
unsigned int x = 5;
unsigned long long y = __builtin_clz(x);
x = __builtin_clzll(y);
return 0;
}"
HIGHS_HAVE_BUILTIN_CLZ)
endif()
set(CMAKE_MACOSX_RPATH TRUE)
if (BUILD_DOTNET)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
else()
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME "cli;libs")
if(NOT FAST_BUILD)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${HIGHS_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${HIGHS_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${HIGHS_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
endif()
include(CheckCXXCompilerFlag)
if (NOT HIGHS_COVERAGE AND NOT APPLE)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ppc64|powerpc64)")
check_cxx_compiler_flag("-mpopcntd" COMPILER_SUPPORTS_POPCNTD)
if(COMPILER_SUPPORTS_POPCNTD)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mpopcntd>")
endif()
else()
check_cxx_compiler_flag("-mpopcnt" COMPILER_SUPPORTS_POPCNT)
if(COMPILER_SUPPORTS_POPCNT)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mpopcnt>")
endif()
endif()
endif()
option(DEBUGSOL "check the debug solution" OFF)
if(DEBUGSOL)
add_definitions("-DHIGHS_DEBUGSOL")
endif()
option(HIGHSINT64 "Use 64 bit integers indexing" OFF)
if(NOT(${HIGHSINT64} STREQUAL "OFF"))
message(STATUS "HIGHSINT64: " ${HIGHSINT64})
endif()
option(HIGHS_NO_DEFAULT_THREADS "Disable multithreading" OFF)
if(NOT(${HIGHS_NO_DEFAULT_THREADS} STREQUAL "OFF"))
message(STATUS "Default multithreading: disabled")
endif()
if (CUPDLP_GPU AND UNIX)
add_compile_options("-Wno-deprecated-declarations")
endif()
if (UNIX)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration")
endif()
if(MSVC)
add_compile_options("$<$<COMPILE_LANGUAGE:C,CXX>:-D_CRT_SECURE_NO_WARNINGS>")
add_compile_options("$<$<COMPILE_LANGUAGE:C,CXX>:/MP>")
if (NOT BUILD_STATIC_EXE)
add_compile_options("$<$<COMPILE_LANGUAGE:C,CXX>:/Z7>")
add_link_options("$<$<COMPILE_LANGUAGE:C,CXX>:/DEBUG:FASTLINK>")
endif()
if(STDCALL)
add_definitions(/Gz)
endif()
endif()
if(NOT FAST_BUILD OR FORTRAN)
include(CheckLanguage)
check_language("Fortran")
if(CMAKE_Fortran_COMPILER)
enable_language(Fortran)
set(FORTRAN_FOUND ON)
else()
set(FORTRAN_FOUND OFF)
endif(CMAKE_Fortran_COMPILER)
endif()
if(NOT FAST_BUILD OR CSHARP)
include(CheckLanguage)
check_language("CSharp")
if(CMAKE_CSharp_COMPILER)
enable_language(CSharp)
set(CSHARP_FOUND ON)
else()
set(CSHARP_FOUND OFF)
endif(CMAKE_CSharp_COMPILER)
endif()
if(ZLIB AND NOT TARGET ZLIB::ZLIB)
find_package(ZLIB 1.2.3)
endif()
if (NOT CMAKE_INSTALL_DOCDIR STREQUAL "" AND BUILD_CXX)
install(FILES
README.md
LICENSE.txt
AUTHORS
CITATION.cff
CODE_OF_CONDUCT.md
CONTRIBUTING.md
FEATURES.md
DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif()
if(WIN32)
set(CPACK_GENERATOR "ZIP")
elseif(APPLE)
set(CPACK_GENERATOR "TGZ")
else()
set(CPACK_GENERATOR "TGZ")
endif()
configure_file(${PROJECT_SOURCE_DIR}/highs/HConfig.h.in ${HIGHS_BINARY_DIR}/HConfig.h)
if (NOT DEBUG_MEMORY STREQUAL "Off")
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options($<$<AND:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>>:-fno-sanitize=function,vptr>)
endif()
endif()
if (DEBUG_MEMORY STREQUAL "Address")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} \
-fsanitize=address,undefined \
-fno-omit-frame-pointer \
-fsanitize-address-use-after-scope")
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} \
-fsanitize=address,undefined \
-fno-omit-frame-pointer \
-fsanitize-address-use-after-scope")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} \
-fsanitize=address,undefined \
-fno-omit-frame-pointer \
-fno-optimize-sibling-calls ")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} \
-fsanitize=address,undefined \
-fno-omit-frame-pointer \
-fno-optimize-sibling-calls ")
elseif (DEBUG_MEMORY STREQUAL "Thread")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fsanitize=thread,undefined \
-fno-omit-frame-pointer")
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -fsanitize=thread,undefined \
-fno-omit-frame-pointer")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=thread \
-fno-omit-frame-pointer ")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=thread \
-fno-omit-frame-pointer ")
elseif (DEBUG_MEMORY STREQUAL "Leak")
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} \
-fsanitize=leak \
-fno-omit-frame-pointer")
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} \
-fsanitize=leak \
-fno-omit-frame-pointer")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=leak \
-fno-omit-frame-pointer ")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=leak \
-fno-omit-frame-pointer ")
else()
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} \
-fsanitize=leak,undefined \
-fno-omit-frame-pointer")
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} \
-fsanitize=leak,undefined \
-fno-omit-frame-pointer")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=leak,undefined \
-fno-omit-frame-pointer ")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=leak,undefined \
-fno-omit-frame-pointer ")
endif()
elseif (DEBUG_MEMORY STREQUAL "Memory")
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} \
-fsanitize=memory \
-fno-omit-frame-pointer")
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} \
-fsanitize=memory \
-fno-omit-frame-pointer")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=memory \
-fno-omit-frame-pointer ")
set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=memory \
-fno-omit-frame-pointer ")
else()
message(FATAL_ERROR "Memory sanitizer only available with clang.")
endif()
endif()
if(FAST_BUILD AND HIGHS_COVERAGE)
if(WIN32)
message(FATAL_ERROR "Error: code coverage analysis is only available under Linux for now.")
endif()
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(FATAL_ERROR "Warning: to enable coverage, you must compile in Debug mode")
endif()
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF)
message(STATUS "Building in coverage mode")
add_compile_options(-O0)
add_compile_options(--coverage)
add_compile_options(-fprofile-update=atomic)
add_link_options(-O0)
add_link_options(--coverage)
find_program(GCOV_PATH gcov)
find_program(LCOV_PATH lcov)
find_program(GENHTML_PATH genhtml)
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Please install lcov and gcov. Aborting...")
endif()
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Please install lcov and gcov. Aborting...")
endif()
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Please install lcov and gcov. Aborting...")
endif()
endif()
if(NOT FAST_BUILD)
option(CI "CI extended tests" ON)
option(HIGHS_COVERAGE "Activate the code coverage compilation" OFF)
if(HIGHS_COVERAGE)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 --coverage")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 --coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O0 --coverage")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -Xclang -coverage-cfg-checksum -Xclang -coverage-no-function-names-in-data -Xclang -coverage-version='408*'")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -Xclang -coverage-cfg-checksum -Xclang -coverage-no-function-names-in-data -Xclang -coverage-version='408*'")
endif()
endif()
if(HIGHS_COVERAGE)
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT CMAKE_BUILD_TYPE STREQUAL "DEBUG")
message(FATAL_ERROR "Warning: to enable coverage, you must compile in DEBUG mode")
endif()
endif()
if(HIGHS_COVERAGE)
if(WIN32)
message(FATAL_ERROR "Error: code coverage analysis is only available under Linux for now.")
endif()
find_program(GCOV_PATH gcov)
find_program(LCOV_PATH lcov)
find_program(GENHTML_PATH genhtml)
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Please install lcov and gcov. Aborting...")
endif()
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Please install lcov and gcov. Aborting...")
endif()
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Please install lcov and gcov. Aborting...")
endif()
if(NOT CI)
add_custom_target(coverage
COMMAND ${LCOV_PATH} --directory ${CMAKE_BINARY_DIR} --zerocounters
COMMAND ${LCOV_PATH} --capture --initial --directory ${CMAKE_BINARY_DIR}/bin --output-file ${CMAKE_BINARY_DIR}/coverage.info
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} ${CMAKE_CTEST_COMMAND} -LE "(LONG|FAIL)" || true
COMMAND ${LCOV_PATH} --capture --directory ${CMAKE_BINARY_DIR}/bin --directory ${CMAKE_BINARY_DIR}/highs --directory ${CMAKE_BINARY_DIR}/app --directory ${CMAKE_BINARY_DIR}/check --output-file ${CMAKE_BINARY_DIR}/coverage.info
COMMAND ${LCOV_PATH} --remove "*/usr/include/*" --output-file ${CMAKE_BINARY_DIR}/coverage.info.cleaned
COMMAND ${GENHTML_PATH} -o ${CMAKE_BINARY_DIR}/coverage ${CMAKE_BINARY_DIR}/coverage.info.cleaned
COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/coverage.info.cleaned
VERBATIM
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Resetting code coverage counters to zero.
Processing code coverage counters and generating report.
You can zip the directory ${CMAKE_BINARY_DIR}/coverage and upload the content to a web server.")
else()
add_custom_target(ci_cov
COMMAND ${LCOV_PATH} --directory ${CMAKE_BINARY_DIR} --zerocounters
COMMAND ${LCOV_PATH} --capture --initial --directory ${CMAKE_BINARY_DIR}/bin --output-file ${CMAKE_BINARY_DIR}/coverage.info
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} ${CMAKE_CTEST_COMMAND} -LE "(LONG|FAIL)" || true
COMMAND ${LCOV_PATH} --capture --directory ${CMAKE_BINARY_DIR}/bin --directory ${CMAKE_BINARY_DIR}/highs --directory ${CMAKE_BINARY_DIR}/app --directory ${CMAKE_BINARY_DIR}/check --output-file ${CMAKE_BINARY_DIR}/coverage.info
VERBATIM
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Resetting code coverage counters to zero.")
endif()
endif()
include_directories(
${HIGHS_BINARY_DIR}
${PROJECT_SOURCE_DIR}/app
${PROJECT_SOURCE_DIR}/extern
${PROJECT_SOURCE_DIR}/extern/zstr
${PROJECT_SOURCE_DIR}/highs
${PROJECT_SOURCE_DIR}/highs/io
${PROJECT_SOURCE_DIR}/highs/pdlp/cupdlp
${PROJECT_SOURCE_DIR}/highs/pdlp/hipdlp
${PROJECT_SOURCE_DIR}/highs/ipm/ipx
${PROJECT_SOURCE_DIR}/highs/ipm/basiclu
${PROJECT_SOURCE_DIR}/highs/lp_data
${PROJECT_SOURCE_DIR}/highs/mip
${PROJECT_SOURCE_DIR}/highs/model
${PROJECT_SOURCE_DIR}/highs/presolve
${PROJECT_SOURCE_DIR}/highs/qpsolver
${PROJECT_SOURCE_DIR}/highs/simplex
${PROJECT_SOURCE_DIR}/highs/test_kkt
${PROJECT_SOURCE_DIR}/highs/util)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_GENERATOR STREQUAL "Ninja")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")
endif()
endif()
add_subdirectory(highs)
add_subdirectory(app)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(check)
endif()
else(FAST_BUILD)
message(STATUS "FAST_BUILD set to on.")
CMAKE_DEPENDENT_OPTION(BUILD_CXX_EXAMPLE "Build cxx example" ON "BUILD_EXAMPLES;BUILD_CXX" OFF)
message(STATUS "Build C++ example: ${BUILD_CXX_EXAMPLE}")
CMAKE_DEPENDENT_OPTION(BUILD_CSHARP_EXAMPLE "Build CSharp example" ON "BUILD_EXAMPLES;CSHARP" OFF)
message(STATUS "Build CSharp example: ${BUILD_CSHARP_EXAMPLE}")
CMAKE_DEPENDENT_OPTION(BUILD_DOTNET "Build dotnet package" OFF "BUILD_EXAMPLES;CSHARP" OFF)
message(STATUS "Build dotnet package: ${BUILD_DOTNET}")
include(cpp-highs)
if(BUILD_CXX AND NOT HIPO_PYTHON)
add_subdirectory(app)
add_subdirectory(examples)
endif()
if(BUILD_TESTING AND NOT HIPO_PYTHON)
enable_testing()
add_subdirectory(check)
endif()
option(USE_DOTNET_STD_21 "Use .Net Standard 2.1 support" ON)
message(STATUS ".Net: Use .Net Framework 2.1 support: ${USE_DOTNET_STD_21}")
include(dotnet)
if(EXP)
add_executable(doctest)
target_sources(doctest PRIVATE check/doctest/TestPresolveIssue.cpp)
if(NOT APPLE)
target_sources(doctest PRIVATE check/doctest/TestGas11.cpp)
endif()
target_include_directories(doctest PRIVATE extern)
target_link_libraries(doctest highs)
endif()
endif()
if (HIPO_PYTHON)
add_subdirectory(highspy)
else()
add_subdirectory(extern)
endif()
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY OFF)
if(UNIX AND NOT APPLE)
set(OS_NAME "linux")
elseif(APPLE)
set(OS_NAME "apple")
elseif(WIN32)
set(OS_NAME "windows")
else()
set(OS_NAME "unknown")
endif()
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
set(ARCH "x86_64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64")
set(ARCH "aarch64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
set(ARCH "arm")
else()
set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
endif()
if(UNIX AND NOT APPLE)
execute_process(
COMMAND ldd --version
OUTPUT_VARIABLE LDD_OUTPUT
ERROR_VARIABLE LDD_OUTPUT
)
if(LDD_OUTPUT MATCHES "musl")
set(LIBC "musl")
else()
set(LIBC "gnu")
endif()
set(PLATFORM "${ARCH}-${OS_NAME}-${LIBC}")
else()
set(PLATFORM "${ARCH}-${OS_NAME}")
endif()
if(BUILD_STATIC_EXE)
if (HIPO)
set(CPACK_PACKAGE_FILE_NAME "highs-${VERSION}-${PLATFORM}-static-apache")
else()
set(CPACK_PACKAGE_FILE_NAME "highs-${VERSION}-${PLATFORM}-static-mit")
endif()
else()
if (HIPO)
set(CPACK_PACKAGE_FILE_NAME "highs-${VERSION}-${PLATFORM}-apache")
else()
set(CPACK_PACKAGE_FILE_NAME "highs-${VERSION}-${PLATFORM}-mit")
endif()
endif()
set(CPACK_PACKAGE_NAME "HiGHS")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR "${HIGHS_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${HIGHS_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${HIGHS_VERSION_PATCH}")
set(CPACK_PACKAGE_VENDOR "University of Edinburgh")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "\
Open source serial and parallel solvers for large-scale sparse \
linear programming (LP), mixed-integer programming (MIP), and \
quadratic programming (QP) models")
set(CPACK_COMPONENTS_ALL cli libs)
set(CPACK_COMPONENT_CLI_DISPLAY_NAME "HiGHS CLI (static)")
set(CPACK_COMPONENT_LIBS_DISPLAY_NAME "HiGHS Libraries")
if(NOT CPack_CMake_INCLUDED)
include(CPack)
endif()