Squashed 'third_party/osqp/' content from commit 33454b3e23
Change-Id: I056df0582ca06664e86554c341a94c47ab932001
git-subtree-dir: third_party/osqp
git-subtree-split: 33454b3e236f1f44193bfbbb6b8c8e71f8f04e9a
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..afd7bb9
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,452 @@
+# Minimum version required
+cmake_minimum_required (VERSION 3.2)
+
+# Project name
+project (osqp)
+
+set(OSQP_VERSION "0.0.0" CACHE STRING "The version number of OSQP")
+if(NOT OSQP_VERSION STREQUAL "0.0.0")
+ configure_file (
+ "${PROJECT_SOURCE_DIR}/configure/version.h.in"
+ "${PROJECT_SOURCE_DIR}/include/version.h"
+ )
+endif()
+
+# Export compile commands
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+# Set the output folder where your program will be created
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/out)
+set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/out)
+
+# Some non-standard CMake modules
+LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/configure/cmake)
+INCLUDE(FindPythonModule)
+INCLUDE(Utils)
+# include(FindMKL) # Find MKL module
+
+
+# Detect operating system
+# ----------------------------------------------
+message(STATUS "We are on a ${CMAKE_SYSTEM_NAME} system")
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+ set(IS_LINUX ON)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+ set(IS_MAC ON)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+ set(IS_WINDOWS ON)
+endif()
+
+
+
+# Set options
+# ----------------------------------------------
+
+# Are unittests generated?
+option (UNITTESTS "Enable unittests generation" OFF)
+
+# Is the code generated for embedded platforms?
+# 1 : Yes. Matrix update not allowed.
+# 2 : Yes. Matrix update allowed.
+if (NOT DEFINED EMBEDDED)
+ message(STATUS "Embedded is OFF")
+else()
+ message(STATUS "Embedded is ${EMBEDDED}")
+endif()
+
+# Is printing enabled?
+option (PRINTING "Enable solver printing" ON)
+if (DEFINED EMBEDDED)
+ message(STATUS "Disabling printing for embedded")
+ set(PRINTING OFF)
+endif()
+message(STATUS "Printing is ${PRINTING}")
+
+
+# Is profiling enabled?
+option (PROFILING "Enable solver profiling (timing)" ON)
+if (DEFINED EMBEDDED)
+ message(STATUS "Disabling profiling for embedded")
+ set(PROFILING OFF)
+endif()
+message(STATUS "Profiling is ${PROFILING}")
+
+# Is user interrupt enabled?
+option (CTRLC "Enable user interrupt (Ctrl-C)" ON)
+if (DEFINED EMBEDDED)
+ message(STATUS "Disabling user interrupt for embedded")
+ set(CTRLC OFF)
+endif()
+message(STATUS "User interrupt is ${CTRLC}")
+
+# Use floats instead of integers
+option (DFLOAT "Use float numbers instead of doubles" OFF)
+message(STATUS "Floats are ${DFLOAT}")
+
+# Use long integers for indexing
+option (DLONG "Use long integers (64bit) for indexing" ON)
+if (NOT (CMAKE_SIZEOF_VOID_P EQUAL 8))
+ message(STATUS "Disabling long integers (64bit) on 32bit machine")
+ set(DLONG OFF)
+endif()
+message(STATUS "Long integers (64bit) are ${DLONG}")
+
+
+option (DEBUG "Debug mode" OFF)
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set (DEBUG ON)
+ message(STATUS "Debug mode is ${DEBUG}")
+endif()
+
+# Add code coverage
+option (COVERAGE "Perform code coverage" OFF)
+message(STATUS "Code coverage is ${COVERAGE}")
+
+
+# Memory allocators
+# ----------------------------------------------
+
+#Report on custom user header options. This is intended to allow
+#users to provide definitions of their own memory functions
+# The header should define the functions as follows
+#
+# define c_malloc mymalloc
+# define c_calloc mycalloc
+# define c_realloc myrealloc
+# define c_free myfree
+
+if(OSQP_CUSTOM_MEMORY)
+ message(STATUS "User custom memory management header: ${OSQP_CUSTOM_MEMORY}")
+endif()
+
+
+
+# Linear solvers dependencies
+# ---------------------------------------------
+option (ENABLE_MKL_PARDISO "Enable MKL Pardiso solver" ON)
+if (DFLOAT)
+ message(STATUS "Disabling MKL Pardiso Solver with floats")
+ set(ENABLE_MKL_PARDISO OFF)
+elseif(DEFINED EMBEDDED)
+ message(STATUS "Disabling MKL Pardiso Solver for embedded")
+ set(ENABLE_MKL_PARDISO OFF)
+endif()
+message(STATUS "MKL Pardiso: ${ENABLE_MKL_PARDISO}")
+
+
+# Generate header file with the global options
+# ---------------------------------------------
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure/osqp_configure.h.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/include/osqp_configure.h
+ NEWLINE_STYLE LF)
+
+# Set Compiler flags
+# ----------------------------------------------
+set(CMAKE_POSITION_INDEPENDENT_CODE ON) # -fPIC
+
+
+if (NOT MSVC)
+
+ if (COVERAGE)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
+ if(FORTRAN)
+ set(CMAKE_FORTRAN_FLAGS "${CMAKE_FORTRAN_FLAGS} --coverage")
+ endif(FORTRAN)
+ endif()
+
+ if (DEBUG)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
+ else()
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
+ endif()
+
+ set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lm") # Include math
+ # Include real time library in linux
+ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+ set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lrt -ldl")
+ endif()
+endif (NOT MSVC)
+
+# Set sources and includes
+# ----------------------------------------------
+add_subdirectory (src)
+add_subdirectory (include)
+
+
+# if we are building the Python interface, let's look for Python
+# and set some options
+# -----------------------------------------------------------------
+if (PYTHON)
+
+ # Python include directories need to be passed by the python compilation process
+ if (NOT PYTHON_INCLUDE_DIRS)
+ message( FATAL_ERROR "You need Python include directories to build the Python interface" )
+ endif (NOT PYTHON_INCLUDE_DIRS)
+
+ # Include directories for Python headers
+ include_directories(${PYTHON_INCLUDE_DIRS})
+
+ # Pass PYTHON flag to C compiler
+ add_definitions(-DPYTHON)
+
+ if (UNITTESTS)
+ # Disable unittests
+ message(STATUS "Disabling UNITTESTS because we are building Python interface")
+ set(UNITTESTS OFF)
+ endif (UNITTESTS)
+
+endif (PYTHON)
+
+
+# if we are building the Matlab interface, let's look for Matlab
+# and set some options
+# -----------------------------------------------------------------
+if (MATLAB)
+
+ find_package(Matlab)
+
+ if (NOT Matlab_FOUND)
+ message( FATAL_ERROR "You need Matlab libraries to build the Matlab interface" )
+ endif (NOT Matlab_FOUND)
+
+ # Include directories for Matlab headers
+ include_directories(${Matlab_INCLUDE_DIRS})
+
+ message(STATUS "Matlab root is " ${Matlab_ROOT_DIR})
+
+ # Pass MATLAB flag to C compiler
+ add_definitions(-DMATLAB)
+
+ # Insist on the pre 2018 complex data API
+ # so that mxGetPr will work correctly
+ add_definitions(-DMATLAB_MEXSRC_RELEASE=R2017b)
+
+ message(STATUS "Using Matlab pre-2018a API for mxGetPr compatibility")
+
+ if (UNITTESTS)
+ # Disable unittests
+ message(STATUS "Disabling UNITTESTS because we are building Matlab interface")
+ set(UNITTESTS OFF)
+ endif (UNITTESTS)
+
+endif (MATLAB)
+
+# if we are building the R interface, let's look for R
+# and set some options
+# -----------------------------------------------------------------
+if (R_LANG)
+
+ message(STATUS "We are building the R interface")
+
+ # Look for R libraries
+ find_package(R)
+
+ if (NOT R_FOUND)
+ message( FATAL_ERROR "You need R libraries to build the R interface" )
+ endif (NOT R_FOUND)
+
+ message(STATUS "R exec is: " ${R_EXEC})
+ message(STATUS "R root dir is: " ${R_ROOT_DIR})
+ message(STATUS "R includes are in: " ${R_INCLUDE_DIRS})
+
+ # Include directories for R headers
+ include_directories(${R_INCLUDE_DIRS})
+
+ # Pass R_LANG flag to C compiler
+ add_definitions(-DR_LANG)
+
+ if (UNITTESTS)
+ # Disable unittests
+ message(STATUS "Disabling UNITTESTS because we are building the R interface")
+ set(UNITTESTS OFF)
+ endif (UNITTESTS)
+
+endif (R_LANG)
+
+
+# Create Static Library
+# ----------------------------------------------
+
+# Add linear system solvers cumulative library
+add_subdirectory(lin_sys)
+
+# Static library
+add_library (osqpstatic STATIC ${osqp_src} ${osqp_headers} ${linsys_solvers})
+# Give same name to static library output
+set_target_properties(osqpstatic PROPERTIES OUTPUT_NAME osqp)
+
+# Include directories for linear system solvers
+target_include_directories(osqpstatic PRIVATE ${linsys_solvers_includes})
+
+# Declare include directories for the cmake exported target
+target_include_directories(osqpstatic
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/osqp>")
+
+# Install Static Library
+# ----------------------------------------------
+
+include(GNUInstallDirs)
+
+install(TARGETS osqpstatic
+ EXPORT ${PROJECT_NAME}
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+
+# Install Headers
+# ----------------------------------------------
+
+install(FILES ${osqp_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/osqp")
+
+
+
+if (MATLAB)
+target_link_libraries (osqpstatic ${Matlab_LIBRARIES})
+endif (MATLAB)
+
+# If we are building Python/Matlab/R interface:
+# - do not build shared library
+# - do not build demo
+if (NOT PYTHON AND NOT MATLAB AND NOT R_LANG AND NOT EMBEDDED)
+ # Create osqp shared library
+ # NB: Add all the linear system solvers here
+ add_library (osqp SHARED ${osqp_src} ${osqp_headers} ${linsys_solvers})
+
+ # Include directories for linear system solvers
+ target_include_directories(osqp PRIVATE ${linsys_solvers_includes})
+
+ # Declare include directories for the cmake exported target
+ target_include_directories(osqp
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+ "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/osqp>")
+
+ # Install osqp shared library
+ install(TARGETS osqp
+ EXPORT ${PROJECT_NAME}
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+ # Create demo executable (linked to static library)
+ add_executable (osqp_demo ${PROJECT_SOURCE_DIR}/examples/osqp_demo.c)
+ target_link_libraries (osqp_demo osqpstatic)
+
+endif (NOT PYTHON AND NOT MATLAB AND NOT R_LANG AND NOT EMBEDDED)
+
+# Create CMake packages for the build directory
+# ----------------------------------------------
+include(CMakePackageConfigHelpers)
+
+export(EXPORT ${PROJECT_NAME}
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/osqp-targets.cmake"
+ NAMESPACE osqp::)
+
+if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/osqp-config.cmake)
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/osqp-config.cmake "include(\"\${CMAKE_CURRENT_LIST_DIR}/osqp-targets.cmake\")\n")
+endif()
+
+
+# Create CMake packages for the install directory
+# ----------------------------------------------
+
+set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/osqp)
+
+install(EXPORT ${PROJECT_NAME}
+ FILE osqp-targets.cmake
+ NAMESPACE osqp::
+ DESTINATION ${ConfigPackageLocation})
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/osqp-config.cmake
+ DESTINATION ${ConfigPackageLocation})
+
+
+
+# Add uninstall command
+# ----------------------------------------------
+if(NOT TARGET uninstall)
+ configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/configure/cmake/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+
+ add_custom_target(uninstall
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+endif()
+
+
+
+# Add testing
+# ----------------------------------------------
+# Add custom command to generate tests
+if (UNITTESTS)
+ find_package(PythonInterp)
+ if(NOT PYTHONINTERP_FOUND)
+ message( FATAL_ERROR "You need python installed to generate unittests. If you do not want to compile the unittests pass -DUNITTESTS=OFF to cmake." )
+ endif()
+
+ INCLUDE(FindPythonModule)
+ find_python_module(numpy)
+ IF(NOT NUMPY_FOUND)
+ message( FATAL_ERROR "You need numpy python module installed to generate unittests. If you do not want to compile the unittests pass -DUNITTESTS=OFF to cmake." )
+ ENDIF()
+
+ find_python_module(scipy)
+ # Check scipy version for sparse.random functionalities
+ IF((NOT SCIPY_FOUND) OR (SCIPY_VERSION VERSION_LESS 0.17.0))
+ message( FATAL_ERROR "You need scipy python module installed to generate unittests. If you do not want to compile the unittests pass -DUNITTESTS=OFF to cmake." )
+ ENDIF()
+
+ find_python_module(__future__)
+ IF(NOT __FUTURE___FOUND)
+ message( FATAL_ERROR "You need future python module installed to generate unittests. If you do not want to compile the unittests pass -DUNITTESTS=OFF to cmake." )
+ ENDIF()
+
+ # Add test_headers and codegen_test_headers
+ add_subdirectory(tests)
+
+ # Generating tests.stamp so that the test data are not always generated
+ # set(data_timestamp ${PROJECT_SOURCE_DIR}/tests/tests_data.stamp)
+ add_custom_command(
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests
+ COMMAND ${PYTHON_EXECUTABLE} generate_tests_data.py
+ DEPENDS ${PROJECT_SOURCE_DIR}/tests/generate_tests_data.py
+ OUTPUT ${codegen_test_headers}
+ COMMENT "Generating unittests data files using Python"
+ )
+
+ # Direct linear solver testing
+ include_directories(tests)
+ add_executable(osqp_tester
+ ${PROJECT_SOURCE_DIR}/tests/osqp_tester.cpp
+ ${PROJECT_SOURCE_DIR}/tests/osqp_tester.h
+ ${test_headers}
+ ${codegen_test_headers}
+ )
+ set_target_properties(osqp_tester
+ PROPERTIES
+ CXX_STANDARD 11
+ CXX_STANDARD_REQUIRED YES
+ CXX_EXTENSIONS NO
+ )
+ target_link_libraries (osqp_tester osqpstatic ${CMAKE_DL_LIBS})
+
+ # Add custom memory target
+ add_executable(osqp_tester_custom_memory
+ EXCLUDE_FROM_ALL
+ ${PROJECT_SOURCE_DIR}/tests/osqp_tester.cpp
+ ${PROJECT_SOURCE_DIR}/tests/osqp_tester.h
+ ${test_headers}
+ ${codegen_test_headers}
+ ${PROJECT_SOURCE_DIR}/tests/custom_memory/custom_memory.c
+ ${PROJECT_SOURCE_DIR}/tests/custom_memory/custom_memory.h
+ )
+ target_link_libraries (osqp_tester_custom_memory osqpstatic ${CMAKE_DL_LIBS})
+
+ # Add testing
+ include(CTest)
+ enable_testing()
+ add_test(NAME tester COMMAND $<TARGET_FILE:osqp_tester>)
+endif()