scs 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +1 -1
  5. data/lib/scs/ffi.rb +2 -2
  6. data/lib/scs/version.rb +1 -1
  7. data/lib/scs.rb +3 -3
  8. data/vendor/scs/CITATION.cff +2 -2
  9. data/vendor/scs/CMakeLists.txt +305 -171
  10. data/vendor/scs/Makefile +44 -19
  11. data/vendor/scs/README.md +1 -1
  12. data/vendor/scs/include/glbopts.h +34 -14
  13. data/vendor/scs/include/linsys.h +8 -8
  14. data/vendor/scs/include/scs.h +6 -2
  15. data/vendor/scs/include/scs_blas.h +4 -0
  16. data/vendor/scs/include/scs_types.h +3 -1
  17. data/vendor/scs/include/scs_work.h +9 -8
  18. data/vendor/scs/include/util.h +1 -1
  19. data/vendor/scs/linsys/cpu/direct/private.c +32 -153
  20. data/vendor/scs/linsys/cpu/direct/private.h +6 -6
  21. data/vendor/scs/linsys/cpu/indirect/private.c +9 -22
  22. data/vendor/scs/linsys/cpu/indirect/private.h +4 -2
  23. data/vendor/scs/linsys/csparse.c +140 -12
  24. data/vendor/scs/linsys/csparse.h +10 -17
  25. data/vendor/scs/linsys/gpu/gpu.c +4 -4
  26. data/vendor/scs/linsys/gpu/gpu.h +1 -1
  27. data/vendor/scs/linsys/gpu/indirect/private.c +15 -26
  28. data/vendor/scs/linsys/mkl/direct/private.c +182 -0
  29. data/vendor/scs/linsys/mkl/direct/private.h +38 -0
  30. data/vendor/scs/linsys/scs_matrix.c +11 -5
  31. data/vendor/scs/scs.mk +40 -27
  32. data/vendor/scs/src/cones.c +17 -161
  33. data/vendor/scs/src/exp_cone.c +399 -0
  34. data/vendor/scs/src/linalg.c +17 -3
  35. data/vendor/scs/src/normalize.c +4 -2
  36. data/vendor/scs/src/rw.c +107 -38
  37. data/vendor/scs/src/scs.c +103 -69
  38. data/vendor/scs/src/util.c +12 -3
  39. data/vendor/scs/test/minunit.h +2 -1
  40. data/vendor/scs/test/problem_utils.h +2 -1
  41. data/vendor/scs/test/problems/hs21_tiny_qp.h +1 -1
  42. data/vendor/scs/test/problems/hs21_tiny_qp_rw.h +8 -3
  43. data/vendor/scs/test/problems/max_ent +0 -0
  44. data/vendor/scs/test/problems/max_ent.h +8 -0
  45. data/vendor/scs/test/problems/mpc_bug.h +19 -0
  46. data/vendor/scs/test/problems/mpc_bug1 +0 -0
  47. data/vendor/scs/test/problems/mpc_bug2 +0 -0
  48. data/vendor/scs/test/problems/mpc_bug3 +0 -0
  49. data/vendor/scs/test/problems/random_prob.h +2 -43
  50. data/vendor/scs/test/problems/rob_gauss_cov_est.h +7 -2
  51. data/vendor/scs/test/problems/test_exp_cone.h +84 -0
  52. data/vendor/scs/test/problems/test_prob_from_data_file.h +73 -0
  53. data/vendor/scs/test/run_from_file.c +7 -1
  54. data/vendor/scs/test/run_tests.c +25 -9
  55. metadata +14 -3
@@ -1,30 +1,36 @@
1
- # CMakeLists.txt file for scs
2
- # This software may be modified and distributed under the terms of the MIT License
1
+ # CMakeLists.txt file for scs. This software may be modified and distributed
2
+ # under the terms of the MIT License
3
3
 
4
4
  cmake_minimum_required(VERSION 3.5)
5
5
 
6
- project(scs
6
+ project(
7
+ scs
7
8
  LANGUAGES C
8
- VERSION 3.2.0)
9
+ VERSION 3.2.6)
9
10
 
10
- # Defines the CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_BINDIR and many other useful macros.
11
- # See https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
11
+ # Defines the CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_BINDIR and many other useful
12
+ # macros. See https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
12
13
  include(GNUInstallDirs)
13
14
 
14
- # Control where libraries and executables are placed during the build.
15
- # With the following settings executables are placed in <the top level of the
16
- # build tree>/bin and libraries/archives in <top level of the build tree>/lib.
17
- # This is particularly useful to run ctests on libraries built on Windows
18
- # machines: tests, which are executables, are placed in the same folders of
19
- # dlls, which are treated as executables as well, so that they can properly
20
- # find the libraries to run. This is a because of missing RPATH on Windows.
21
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
22
- set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
23
- set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
24
-
25
- # To build shared libraries in Windows, we set CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS to TRUE.
26
- # See https://cmake.org/cmake/help/v3.4/variable/CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS.html
27
- # See https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/
15
+ # Control where libraries and executables are placed during the build. With the
16
+ # following settings executables are placed in <the top level of the build
17
+ # tree>/bin and libraries/archives in <top level of the build tree>/lib. This is
18
+ # particularly useful to run ctests on libraries built on Windows machines:
19
+ # tests, which are executables, are placed in the same folders of dlls, which
20
+ # are treated as executables as well, so that they can properly find the
21
+ # libraries to run. This is a because of missing RPATH on Windows.
22
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
23
+ "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
24
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
25
+ "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
26
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
27
+ "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
28
+
29
+ # To build shared libraries in Windows, we set CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
30
+ # to TRUE. See
31
+ # https://cmake.org/cmake/help/v3.4/variable/CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS.html
32
+ # See
33
+ # https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/
28
34
  set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
29
35
 
30
36
  # Under MSVC, we set CMAKE_DEBUG_POSTFIX to "d" to add a trailing "d" to library
@@ -35,45 +41,45 @@ if(MSVC)
35
41
  set(CMAKE_DEBUG_POSTFIX "d")
36
42
  endif()
37
43
 
38
- # Build position independent code.
39
- # Position Independent Code (PIC) is commonly used for shared libraries so that
40
- # the same shared library code can be loaded in each program address space in a
41
- # location where it will not overlap with any other uses of such memory.
42
- # In particular, this option avoids problems occurring when a process wants to
43
- # load more than one shared library at the same virtual address.
44
- # Since shared libraries cannot predict where other shared libraries could be
45
- # loaded, this is an unavoidable problem with the traditional shared library
46
- # concept.
47
- # Generating position-independent code is often the default behavior for most
48
- # modern compilers.
49
- # Moreover linking a static library that is not built with PIC from a shared
50
- # library will fail on some compiler/architecture combinations.
51
- # Further details on PIC can be found here:
44
+ # Build position independent code. Position Independent Code (PIC) is commonly
45
+ # used for shared libraries so that the same shared library code can be loaded
46
+ # in each program address space in a location where it will not overlap with any
47
+ # other uses of such memory. In particular, this option avoids problems
48
+ # occurring when a process wants to load more than one shared library at the
49
+ # same virtual address. Since shared libraries cannot predict where other shared
50
+ # libraries could be loaded, this is an unavoidable problem with the traditional
51
+ # shared library concept. Generating position-independent code is often the
52
+ # default behavior for most modern compilers. Moreover linking a static library
53
+ # that is not built with PIC from a shared library will fail on some
54
+ # compiler/architecture combinations. Further details on PIC can be found here:
52
55
  # https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
53
56
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
54
57
 
55
- # Disable C and C++ compiler extensions.
56
- # C/CXX_EXTENSIONS are ON by default to allow the compilers to use extended
57
- # variants of the C/CXX language.
58
- # However, this could expose cross-platform bugs in user code or in the headers
59
- # of third-party dependencies and thus it is strongly suggested to turn
60
- # extensions off.
58
+ # Disable C and C++ compiler extensions. C/CXX_EXTENSIONS are ON by default to
59
+ # allow the compilers to use extended variants of the C/CXX language. However,
60
+ # this could expose cross-platform bugs in user code or in the headers of
61
+ # third-party dependencies and thus it is strongly suggested to turn extensions
62
+ # off.
61
63
  set(CMAKE_C_EXTENSIONS OFF)
62
64
  set(CMAKE_CXX_EXTENSIONS OFF)
63
65
  list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
64
66
 
65
- ### Options
66
- # Shared/Dynamic or Static library?
67
+ # Options Shared/Dynamic or Static library?
67
68
  option(BUILD_SHARED_LIBS "Build libraries as shared as opposed to static" ON)
68
69
 
69
70
  # Enable RPATH support for installed binaries and libraries
70
71
  include(AddInstallRPATHSupport)
71
- add_install_rpath_support(BIN_DIRS "${CMAKE_INSTALL_FULL_BINDIR}"
72
- LIB_DIRS "${CMAKE_INSTALL_FULL_LIBDIR}"
73
- INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}"
72
+ add_install_rpath_support(
73
+ BIN_DIRS
74
+ "${CMAKE_INSTALL_FULL_BINDIR}"
75
+ LIB_DIRS
76
+ "${CMAKE_INSTALL_FULL_LIBDIR}"
77
+ INSTALL_NAME_DIR
78
+ "${CMAKE_INSTALL_FULL_LIBDIR}"
74
79
  USE_LINK_PATH)
75
80
 
76
- # Encourage user to specify a build type (e.g. Release, Debug, etc.), otherwise set it to Release.
81
+ # Encourage user to specify a build type (e.g. Release, Debug, etc.), otherwise
82
+ # set it to Release.
77
83
  if(NOT CMAKE_CONFIGURATION_TYPES)
78
84
  if(NOT CMAKE_BUILD_TYPE)
79
85
  message(STATUS "Setting build type to 'Release' as none was specified.")
@@ -81,19 +87,17 @@ if(NOT CMAKE_CONFIGURATION_TYPES)
81
87
  endif()
82
88
  endif()
83
89
 
84
-
85
90
  # Build test related commands?
86
91
  option(BUILD_TESTING "Create tests using CMake" OFF)
87
92
  if(BUILD_TESTING)
88
93
  enable_testing()
89
94
  endif()
90
95
 
91
- # Add uninstall target
92
- # After 'make install' can run 'make uninstall' to remove.
96
+ # Add uninstall target After 'make install' can run 'make uninstall' to remove.
93
97
  include(AddUninstallTarget)
94
98
 
95
- ### Some variables useful for sampling the building process
96
- # Note that the GPU profile is not compiled.
99
+ # Some variables useful for sampling the building process. Note that the GPU
100
+ # profile is not compiled.
97
101
  set(LINSYS linsys)
98
102
  set(DIRSRC ${LINSYS}/cpu/direct)
99
103
  set(INDIRSRC ${LINSYS}/cpu/indirect)
@@ -109,8 +113,23 @@ message(STATUS "Single precision floats (32bit) are ${SFLOAT}")
109
113
  option(DLONG "Use long integers (64bit) for indexing" OFF)
110
114
  message(STATUS "Long integers (64bit) are ${DLONG}")
111
115
 
116
+ # Disable all printing
117
+ option(NO_PRINTING "Disables all printing" OFF)
118
+ message(STATUS "Printing is NOT ${NO_PRINTING}")
119
+
120
+ # Disable all read/write functionality
121
+ option(NO_READ_WRITE "Disables all read/write functionality" OFF)
122
+ message(STATUS "Read/write functionality is NOT ${NO_READ_WRITE}")
123
+
124
+ option(USE_LAPACK "Whether to use BLAS/LAPACK" ON)
125
+ message(STATUS "BLAS/LAPACK usage is ${USE_LAPACK}")
112
126
 
113
- set(COMPILER_OPTS "-DUSE_LAPACK -DCTRLC")
127
+ # Enable OpenMP support
128
+ option(USE_OPENMP "Compile with OpenMP support" OFF)
129
+ message(STATUS "OpenMP parallelization is ${USE_OPENMP}")
130
+
131
+ set(COMPILER_OPTS "-DCTRLC")
132
+ set(LAPACK_LINK_LIBRARIES "")
114
133
 
115
134
  # Primitive types
116
135
  if(SFLOAT)
@@ -127,70 +146,81 @@ else()
127
146
  set(SCS_INT_TYPE "int")
128
147
  endif()
129
148
 
149
+ if(NO_PRINTING)
150
+ set(COMPILER_OPTS "-DNO_PRINTING=1 ${COMPILER_OPTS}")
151
+ endif()
152
+
153
+ if(NO_READ_WRITE)
154
+ set(COMPILER_OPTS "-DNO_READ_WRITE=1 ${COMPILER_OPTS}")
155
+ endif()
156
+
157
+ if (USE_LAPACK)
158
+ set(COMPILER_OPTS "-DUSE_LAPACK ${COMPILER_OPTS}")
159
+ list(APPEND LAPACK_LINK_LIBRARIES "blas" "lapack")
160
+ endif()
161
+
162
+ if(USE_OPENMP)
163
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
164
+ endif()
165
+
130
166
  message(STATUS "COMPILER_OPTS = ${COMPILER_OPTS}")
167
+ message(STATUS "CMAKE_C_FLAGS = ${CMAKE_C_FLAGS}")
131
168
 
132
- # TODO this is a hack that overwrites the scs_types.h file, we should
133
- # find a way to do this that doesn't pollute the master directory.
169
+ # TODO this is a hack that overwrites the scs_types.h file, we should find a way
170
+ # to do this that doesn't pollute the master directory.
134
171
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/scs_types.h.in
135
- ${CMAKE_CURRENT_SOURCE_DIR}/include/scs_types.h
136
- NEWLINE_STYLE LF)
172
+ ${CMAKE_CURRENT_SOURCE_DIR}/include/scs_types.h NEWLINE_STYLE LF)
137
173
 
138
- # Public headers
139
- set(${PROJECT_NAME}_PUBLIC_HDR
140
- include/scs_types.h
141
- include/scs.h)
174
+ # Public headers
175
+ set(${PROJECT_NAME}_PUBLIC_HDR include/scs_types.h include/scs.h)
142
176
 
143
177
  # Common source files
144
178
  set(${PROJECT_NAME}_SRC
145
- src/aa.c
146
- src/cones.c
147
- src/ctrlc.c
148
- src/linalg.c
149
- src/normalize.c
150
- src/rw.c
151
- src/scs.c
152
- src/scs_version.c
153
- src/util.c
154
- ${LINSYS}/csparse.c
155
- ${LINSYS}/scs_matrix.c)
179
+ src/aa.c
180
+ src/cones.c
181
+ src/ctrlc.c
182
+ src/exp_cone.c
183
+ src/linalg.c
184
+ src/normalize.c
185
+ src/rw.c
186
+ src/scs.c
187
+ src/scs_version.c
188
+ src/util.c
189
+ ${LINSYS}/csparse.c
190
+ ${LINSYS}/scs_matrix.c)
156
191
 
157
192
  # Common header files
158
193
  set(${PROJECT_NAME}_HDR
159
- include/aa.h
160
- include/cones.h
161
- include/ctrlc.h
162
- include/glbopts.h
163
- include/linalg.h
164
- include/linsys.h
165
- include/normalize.h
166
- include/rw.h
167
- include/scs.h
168
- include/scs_blas.h
169
- include/scs_types.h
170
- include/scs_work.h
171
- include/util.h
172
- ${LINSYS}/csparse.h
173
- ${LINSYS}/scs_matrix.h)
194
+ include/aa.h
195
+ include/cones.h
196
+ include/ctrlc.h
197
+ include/glbopts.h
198
+ include/linalg.h
199
+ include/linsys.h
200
+ include/normalize.h
201
+ include/rw.h
202
+ include/scs.h
203
+ include/scs_blas.h
204
+ include/scs_types.h
205
+ include/scs_work.h
206
+ include/util.h
207
+ ${LINSYS}/csparse.h
208
+ ${LINSYS}/scs_matrix.h)
174
209
 
175
210
  # get all the c file in amd/external
176
- file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_SRC
177
- ${EXTERNAL}/amd/*.c
178
- )
211
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_SRC ${EXTERNAL}/amd/*.c)
179
212
 
180
213
  # get all the h file in amd/external
181
- file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_HDR
182
- ${EXTERNAL}/amd/*.h
183
- )
214
+ file(GLOB ${PROJECT_NAME}_AMD_EXTERNAL_HDR ${EXTERNAL}/amd/*.h)
184
215
 
185
216
  # get all the c file in amd/external
186
- file(GLOB ${PROJECT_NAME}_LDL_EXTERNAL_HDR
187
- ${EXTERNAL}/qdldl/*.h
188
- )
217
+ file(GLOB ${PROJECT_NAME}_LDL_EXTERNAL_HDR ${EXTERNAL}/qdldl/*.h)
189
218
 
190
- ### Direct method
191
- # Here we compile the direct method library
219
+ # ##############################################################################
220
+ # Direct method. Here we compile the direct method library.
192
221
  set(${PROJECT_NAME}_DIRECT ${PROJECT_NAME}dir)
193
- add_library(${${PROJECT_NAME}_DIRECT}
222
+ add_library(
223
+ ${${PROJECT_NAME}_DIRECT}
194
224
  ${${PROJECT_NAME}_HDR}
195
225
  ${${PROJECT_NAME}_SRC}
196
226
  ${DIRSRC}/private.c
@@ -200,121 +230,225 @@ add_library(${${PROJECT_NAME}_DIRECT}
200
230
  ${${PROJECT_NAME}_AMD_EXTERNAL_HDR}
201
231
  ${${PROJECT_NAME}_LDL_EXTERNAL_HDR})
202
232
 
203
- target_include_directories(${${PROJECT_NAME}_DIRECT} PRIVATE
204
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${DIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
233
+ target_include_directories(
234
+ ${${PROJECT_NAME}_DIRECT}
235
+ PRIVATE
236
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${DIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
237
+ )
205
238
 
206
- target_include_directories(${${PROJECT_NAME}_DIRECT} PUBLIC
207
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
208
- "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
239
+ target_include_directories(
240
+ ${${PROJECT_NAME}_DIRECT}
241
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
242
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
209
243
 
210
244
  # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
211
245
  target_compile_definitions(${${PROJECT_NAME}_DIRECT} PRIVATE ${COMPILER_OPTS})
212
246
 
213
- # The library depends on math (m) blas and lapack
214
- target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE
215
- m
216
- blas
217
- lapack)
247
+ # The library depends on math (m) and (optionally) blas and lapack
248
+ target_link_libraries(${${PROJECT_NAME}_DIRECT} PRIVATE m ${LAPACK_LINK_LIBRARIES})
218
249
 
219
250
  # Set some properties
220
- set_target_properties(${${PROJECT_NAME}_DIRECT} PROPERTIES
221
- VERSION ${scs_VERSION}
222
- PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
251
+ set_target_properties(
252
+ ${${PROJECT_NAME}_DIRECT}
253
+ PROPERTIES VERSION ${scs_VERSION} PUBLIC_HEADER
254
+ "${${PROJECT_NAME}_PUBLIC_HDR}")
223
255
 
224
256
  add_library(scs::${${PROJECT_NAME}_DIRECT} ALIAS ${${PROJECT_NAME}_DIRECT})
225
257
 
226
258
  # Install the library
227
- install(TARGETS ${${PROJECT_NAME}_DIRECT}
228
- EXPORT ${PROJECT_NAME}
259
+ install(
260
+ TARGETS ${${PROJECT_NAME}_DIRECT}
261
+ EXPORT ${PROJECT_NAME}
229
262
  COMPONENT runtime
230
- LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
231
- ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
232
- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
233
- PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
263
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
264
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
265
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
266
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
234
267
 
235
268
  # Add the direct method to the set of the compiled targets
236
- set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_DIRECT})
269
+ set_property(GLOBAL APPEND PROPERTY SCS_TARGETS ${${PROJECT_NAME}_DIRECT})
237
270
 
238
- ### Indirect method
239
- # Here we compile the indirect method library
240
- set(${PROJECT_NAME}_INDIRECT ${PROJECT_NAME}indir)
241
- add_library(${${PROJECT_NAME}_INDIRECT}
242
- ${${PROJECT_NAME}_HDR}
243
- ${${PROJECT_NAME}_SRC}
244
- ${INDIRSRC}/private.c
245
- ${INDIRSRC}/private.h
246
- ${${${PROJECT_NAME}_INDIRECT}_HDR}
247
- )
271
+ # ##############################################################################
248
272
 
249
-
250
- target_include_directories(${${PROJECT_NAME}_INDIRECT} PRIVATE
251
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/amd;${CMAKE_CURRENT_SOURCE_DIR}/${EXTERNAL}/qdldl;${CMAKE_CURRENT_SOURCE_DIR}/${INDIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>")
252
-
253
- target_include_directories(${${PROJECT_NAME}_INDIRECT} PUBLIC
254
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
255
- "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
273
+ # Indirect method. Here we compile the indirect method library.
274
+ set(${PROJECT_NAME}_INDIRECT ${PROJECT_NAME}indir)
275
+ add_library(
276
+ ${${PROJECT_NAME}_INDIRECT}
277
+ ${${PROJECT_NAME}_HDR} ${${PROJECT_NAME}_SRC} ${INDIRSRC}/private.c
278
+ ${INDIRSRC}/private.h ${${${PROJECT_NAME}_INDIRECT}_HDR})
279
+
280
+ target_include_directories(
281
+ ${${PROJECT_NAME}_INDIRECT}
282
+ PRIVATE
283
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INDIRSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
284
+ )
285
+
286
+ target_include_directories(
287
+ ${${PROJECT_NAME}_INDIRECT}
288
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
289
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
256
290
 
257
291
  # Compiled with blas and lapack, can solve LPs, SOCPs, SDPs, ECPs, and PCPs
258
- target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE ${COMPILER_OPTS} -DINDIRECT)
292
+ target_compile_definitions(${${PROJECT_NAME}_INDIRECT} PRIVATE ${COMPILER_OPTS}
293
+ -DINDIRECT)
259
294
 
260
- # The library depends on math (m) blas and lapack
261
- target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC
262
- m
263
- blas
264
- lapack)
295
+ # The library depends on math (m) and (optionally) blas and lapack
296
+ target_link_libraries(${${PROJECT_NAME}_INDIRECT} PUBLIC m ${LAPACK_LINK_LIBRARIES})
265
297
 
266
298
  # Set some properties
267
- set_target_properties(${${PROJECT_NAME}_INDIRECT} PROPERTIES
268
- VERSION ${scs_VERSION}
269
- PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HDR}")
299
+ set_target_properties(
300
+ ${${PROJECT_NAME}_INDIRECT}
301
+ PROPERTIES VERSION ${scs_VERSION} PUBLIC_HEADER
302
+ "${${PROJECT_NAME}_PUBLIC_HDR}")
270
303
 
271
304
  add_library(scs::${${PROJECT_NAME}_INDIRECT} ALIAS ${${PROJECT_NAME}_INDIRECT})
272
305
 
273
306
  # Install the library
274
- install(TARGETS ${${PROJECT_NAME}_INDIRECT}
275
- EXPORT ${PROJECT_NAME}
307
+ install(
308
+ TARGETS ${${PROJECT_NAME}_INDIRECT}
309
+ EXPORT ${PROJECT_NAME}
276
310
  COMPONENT runtime
277
- LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
278
- ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
279
- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
311
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
312
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
313
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
280
314
  PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
281
315
 
282
316
  # Add the indirect method to the set of the compiled targets
283
- set_property(GLOBAL APPEND PROPERTY scs_TARGETS ${${PROJECT_NAME}_INDIRECT})
317
+ set_property(GLOBAL APPEND PROPERTY SCS_TARGETS ${${PROJECT_NAME}_INDIRECT})
318
+
319
+ # ##############################################################################
320
+
321
+ # If MKLROOT is defined, then we install the MKL version.
322
+ if(DEFINED ENV{MKLROOT})
323
+
324
+ message(STATUS "MKLROOT set to $ENV{MKLROOT}")
325
+ message(STATUS "Will install SCS-MKL (libscsmkl).")
326
+
327
+ set(MKLSRC ${LINSYS}/mkl/direct)
328
+
329
+ # Here we compile the direct MKL pardiso library
330
+ set(${PROJECT_NAME}_MKL ${PROJECT_NAME}mkl)
331
+ add_library(
332
+ ${${PROJECT_NAME}_MKL}
333
+ ${${PROJECT_NAME}_HDR} ${${PROJECT_NAME}_SRC} ${MKLSRC}/private.c
334
+ ${MKLSRC}/private.h ${${${PROJECT_NAME}_MKL}_HDR})
335
+
336
+ target_include_directories(
337
+ ${${PROJECT_NAME}_MKL}
338
+ PRIVATE
339
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${MKLSRC};${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
340
+ )
284
341
 
285
- ### Install the .cmake file.
286
- # Thanks to thanks file it will be possible to link scs to consumer libraries
342
+ target_include_directories(
343
+ ${${PROJECT_NAME}_MKL}
344
+ PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
345
+ "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/scs>")
346
+
347
+ target_compile_definitions(${${PROJECT_NAME}_MKL} PRIVATE ${COMPILER_OPTS})
348
+ # See:
349
+ # https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-link-line-advisor.html
350
+ # This is probably not correct for other systems. TODO: make SCS-MKL
351
+ # work for all combinations of platform / compiler / threading options.
352
+ target_link_options(${${PROJECT_NAME}_MKL} PRIVATE "LINKER:--no-as-needed")
353
+ target_link_directories(${${PROJECT_NAME}_MKL} PRIVATE $ENV{MKLROOT}/lib)
354
+ target_link_libraries(
355
+ ${${PROJECT_NAME}_MKL}
356
+ PRIVATE m
357
+ mkl_rt
358
+ mkl_gnu_thread
359
+ mkl_core
360
+ gomp
361
+ pthread
362
+ dl)
363
+
364
+ # Set some properties
365
+ set_target_properties(
366
+ ${${PROJECT_NAME}_MKL}
367
+ PROPERTIES VERSION ${scs_VERSION} PUBLIC_HEADER
368
+ "${${PROJECT_NAME}_PUBLIC_HDR}")
369
+
370
+ add_library(scs::${${PROJECT_NAME}_MKL} ALIAS ${${PROJECT_NAME}_MKL})
371
+
372
+ # Install the library
373
+ install(
374
+ TARGETS ${${PROJECT_NAME}_MKL}
375
+ EXPORT ${PROJECT_NAME}
376
+ COMPONENT runtime
377
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
378
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
379
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
380
+ PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/scs")
381
+
382
+ # Add the mkl method to the set of the compiled targets
383
+ set_property(GLOBAL APPEND PROPERTY SCS_TARGETS ${${PROJECT_NAME}_MKL})
384
+ else()
385
+ message(
386
+ STATUS "MKLROOT environment variable is undefined, skipping SCS-MKL install"
387
+ )
388
+ endif()
389
+
390
+ # ##############################################################################
391
+
392
+ # Install the .cmake file. It is possible to link scs o consumer libraries.
287
393
  include(InstallBasicPackageFiles)
288
- install_basic_package_files(${PROJECT_NAME}
289
- NAMESPACE scs::
290
- VERSION ${${PROJECT_NAME}_VERSION}
291
- TARGETS_PROPERTY scs_TARGETS
292
- COMPATIBILITY SameMajorVersion
293
- VARS_PREFIX ${PROJECT_NAME}
394
+ install_basic_package_files(
395
+ ${PROJECT_NAME}
396
+ NAMESPACE
397
+ scs::
398
+ VERSION
399
+ ${${PROJECT_NAME}_VERSION}
400
+ TARGETS_PROPERTY
401
+ SCS_TARGETS
402
+ COMPATIBILITY
403
+ SameMajorVersion
404
+ VARS_PREFIX
405
+ ${PROJECT_NAME}
294
406
  NO_CHECK_REQUIRED_COMPONENTS_MACRO)
295
407
 
296
- ### Add the tests
408
+ # Add the tests
297
409
  if(BUILD_TESTING)
298
- add_executable(run_tests_direct test/run_tests.c)
410
+ add_executable(run_tests_direct test/run_tests.c)
299
411
  target_compile_definitions(run_tests_direct PRIVATE ${COMPILER_OPTS})
300
- target_link_libraries(run_tests_direct PRIVATE
301
- scs::scsdir)
302
- target_include_directories(run_tests_direct PRIVATE
303
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
412
+ target_link_libraries(run_tests_direct PRIVATE scs::scsdir)
413
+ target_include_directories(
414
+ run_tests_direct
415
+ PRIVATE
416
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
417
+ )
304
418
 
305
- add_test(NAME run_tests_direct
419
+ add_test(
420
+ NAME run_tests_direct
306
421
  COMMAND run_tests_direct
307
422
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
308
423
 
309
- add_executable(run_tests_indirect test/run_tests.c)
424
+ add_executable(run_tests_indirect test/run_tests.c)
310
425
  target_compile_definitions(run_tests_indirect PRIVATE ${COMPILER_OPTS})
311
- target_link_libraries(run_tests_indirect PRIVATE
312
- scs::scsindir)
313
- target_include_directories(run_tests_indirect PRIVATE
314
- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>" )
426
+ target_link_libraries(run_tests_indirect PRIVATE scs::scsindir)
427
+ target_include_directories(
428
+ run_tests_indirect
429
+ PRIVATE
430
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
431
+ )
315
432
 
316
- add_test(NAME run_tests_indirect
433
+ add_test(
434
+ NAME run_tests_indirect
317
435
  COMMAND run_tests_indirect
318
436
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
319
437
 
438
+ if(DEFINED ENV{MKLROOT})
439
+ add_executable(run_tests_mkl test/run_tests.c)
440
+ target_compile_definitions(run_tests_mkl PRIVATE ${COMPILER_OPTS})
441
+ target_link_libraries(run_tests_mkl PRIVATE scs::scsmkl)
442
+ target_include_directories(
443
+ run_tests_mkl
444
+ PRIVATE
445
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/test;${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/${LINSYS}>"
446
+ )
447
+
448
+ add_test(
449
+ NAME run_tests_mkl
450
+ COMMAND run_tests_mkl
451
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
452
+ endif()
453
+
320
454
  endif()