@@ -34,6 +34,15 @@ set(NO_AFFINITY 1)
34
34
endif ()
35
35
option (CPP_THREAD_SAFETY_TEST "Run a massively parallel DGEMM test to confirm thread safety of the library (requires OpenMP and about 1.3GB of RAM)" OFF )
36
36
option (CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library (requires OpenMP)" OFF )
37
+ option (BUILD_STATIC_LIBS "Build static library" OFF )
38
+ if (NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS )
39
+ set (BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE)
40
+ endif ()
41
+ if ((BUILD_STATIC_LIBS AND BUILD_SHARED_LIBS ) AND MSVC )
42
+ message (WARNING "Could not enable both BUILD_STATIC_LIBS and BUILD_SHARED_LIBS with MSVC,
43
+ Disable BUILD_SHARED_LIBS" )
44
+ set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build static library" FORCE)
45
+ endif ()
37
46
38
47
# Add a prefix or suffix to all exported symbol names in the shared library.
39
48
# Avoids conflicts with other BLAS libraries, especially when using
@@ -183,12 +192,45 @@ if (${DYNAMIC_ARCH})
183
192
endif ()
184
193
185
194
# add objects to the openblas lib
186
- add_library (${OpenBLAS_LIBNAME} ${LA_SOURCES} ${LAPACKE_SOURCES} ${RELA_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE} )
187
- target_include_directories (${OpenBLAS_LIBNAME} INTERFACE $<INSTALL_INTERFACE:include /openblas${SUFFIX64} >)
195
+ if (NOT NO_LAPACK)
196
+ add_library (LAPACK OBJECT ${LA_SOURCES} )
197
+ list (APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK>" )
198
+ endif ()
199
+ if (NOT NO_LAPACKE)
200
+ add_library (LAPACKE OBJECT ${LAPACKE_SOURCES} )
201
+ list (APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACKE>" )
202
+ endif ()
203
+ if (BUILD_RELAPACK)
204
+ add_library (RELAPACK OBJECT ${RELA_SOURCES} )
205
+ list (APPEND TARGET_OBJS "$<TARGET_OBJECTS:RELAPACK>" )
206
+ endif ()
207
+ set (OpenBLAS_LIBS "" )
208
+ if (BUILD_STATIC_LIBS)
209
+ add_library (${OpenBLAS_LIBNAME} _static STATIC ${TARGET_OBJS} ${OpenBLAS_DEF_FILE} )
210
+ target_include_directories (${OpenBLAS_LIBNAME} _static INTERFACE $<INSTALL_INTERFACE:include /openblas${SUFFIX64} >)
211
+ list (APPEND OpenBLAS_LIBS ${OpenBLAS_LIBNAME} _static)
212
+ endif ()
213
+ if (BUILD_SHARED_LIBS )
214
+ add_library (${OpenBLAS_LIBNAME} _shared SHARED ${TARGET_OBJS} ${OpenBLAS_DEF_FILE} )
215
+ target_include_directories (${OpenBLAS_LIBNAME} _shared INTERFACE $<INSTALL_INTERFACE:include /openblas${SUFFIX64} >)
216
+ list (APPEND OpenBLAS_LIBS ${OpenBLAS_LIBNAME} _shared)
217
+ endif ()
218
+ if (BUILD_STATIC_LIBS)
219
+ add_library (${OpenBLAS_LIBNAME} ALIAS ${OpenBLAS_LIBNAME} _static)
220
+ else ()
221
+ add_library (${OpenBLAS_LIBNAME} ALIAS ${OpenBLAS_LIBNAME} _shared)
222
+ endif ()
223
+
224
+ set_target_properties (${OpenBLAS_LIBS} PROPERTIES OUTPUT_NAME ${OpenBLAS_LIBNAME} )
188
225
189
226
# Android needs to explicitly link against libm
190
227
if (ANDROID)
191
- target_link_libraries (${OpenBLAS_LIBNAME} m)
228
+ if (BUILD_STATIC_LIBS)
229
+ target_link_libraries (${OpenBLAS_LIBNAME} _static m)
230
+ endif ()
231
+ if (BUILD_SHARED_LIBS )
232
+ target_link_libraries (${OpenBLAS_LIBNAME} _shared m)
233
+ endif ()
192
234
endif ()
193
235
194
236
# Handle MSVC exports
@@ -197,21 +239,21 @@ if(MSVC AND BUILD_SHARED_LIBS)
197
239
include ("${PROJECT_SOURCE_DIR} /cmake/export.cmake" )
198
240
else ()
199
241
# Creates verbose .def file (51KB vs 18KB)
200
- set_target_properties (${OpenBLAS_LIBNAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true )
242
+ set_target_properties (${OpenBLAS_LIBNAME} _shared PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true )
201
243
endif ()
202
244
endif ()
203
245
204
246
# Set output for libopenblas
205
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
206
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG "${OpenBLAS_LIBNAME} _d" )
207
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES EXPORT_NAME "OpenBLAS" )
247
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
248
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG "${OpenBLAS_LIBNAME} _d" )
249
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES EXPORT_NAME "OpenBLAS" )
208
250
209
251
foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
210
252
string ( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
211
253
212
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
213
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
214
- set_target_properties ( ${OpenBLAS_LIBNAME } PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
254
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
255
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
256
+ set_target_properties ( ${OpenBLAS_LIBS } PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
215
257
endforeach ()
216
258
217
259
enable_testing ()
@@ -220,10 +262,17 @@ if (USE_THREAD)
220
262
# Add threading library to linker
221
263
find_package (Threads)
222
264
if (THREADS_HAVE_PTHREAD_ARG)
223
- set_property (TARGET ${OpenBLAS_LIBNAME} PROPERTY COMPILE_OPTIONS "-pthread" )
224
- set_property (TARGET ${OpenBLAS_LIBNAME} PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread" )
265
+ set_target_properties (${OpenBLAS_LIBS} PROPERTIES
266
+ COMPILE_OPTIONS "-pthread"
267
+ INTERFACE_COMPILE_OPTIONS "-pthread"
268
+ )
269
+ endif ()
270
+ if (BUILD_STATIC_LIBS)
271
+ target_link_libraries (${OpenBLAS_LIBNAME} _static ${CMAKE_THREAD_LIBS_INIT} )
272
+ endif ()
273
+ if (BUILD_SHARED_LIBS )
274
+ target_link_libraries (${OpenBLAS_LIBNAME} _shared ${CMAKE_THREAD_LIBS_INIT} )
225
275
endif ()
226
- target_link_libraries (${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT} )
227
276
endif ()
228
277
229
278
#if (MSVC OR NOT NOFORTRAN)
@@ -244,14 +293,14 @@ if (NOT NOFORTRAN)
244
293
endif ()
245
294
endif ()
246
295
247
- set_target_properties (${OpenBLAS_LIBNAME } PROPERTIES
296
+ set_target_properties (${OpenBLAS_LIBS } PROPERTIES
248
297
VERSION ${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION}
249
298
SOVERSION ${OpenBLAS_MAJOR_VERSION}
250
299
)
251
300
252
301
if (BUILD_SHARED_LIBS AND BUILD_RELAPACK)
253
302
if (NOT MSVC )
254
- target_link_libraries (${OpenBLAS_LIBNAME} "-Wl,-allow-multiple-definition" )
303
+ target_link_libraries (${OpenBLAS_LIBNAME} _shared "-Wl,-allow-multiple-definition" )
255
304
else ()
256
305
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE" )
257
306
endif ()
@@ -314,7 +363,7 @@ endif()
314
363
if (NOT ${SYMBOLSUFFIX} STREQUAL "" )
315
364
message (STATUS "adding suffix ${SYMBOLSUFFIX} to names of exported symbols in ${OpenBLAS_LIBNAME} " )
316
365
endif ()
317
- add_custom_command (TARGET ${OpenBLAS_LIBNAME} POST_BUILD
366
+ add_custom_command (TARGET ${OpenBLAS_LIBNAME} _shared POST_BUILD
318
367
COMMAND perl ${PROJECT_SOURCE_DIR} /exports/gensymbol "objcopy" "${ARCH} " "${BU} " "${EXPRECISION_IN} " "${NO_CBLAS_IN} " "${NO_LAPACK_IN} " "${NO_LAPACKE_IN} " "${NEED2UNDERSCORES_IN} " "${ONLY_CBLAS_IN} " \"${SYMBOLPREFIX} \" \"${SYMBOLSUFFIX} \" "${BUILD_LAPACK_DEPRECATED} " > ${PROJECT_BINARY_DIR} /objcopy.def
319
368
COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR} /objcopy.def ${PROJECT_BINARY_DIR} /lib/lib${OpenBLAS_LIBNAME} .so
320
369
COMMENT "renaming symbols"
@@ -325,7 +374,7 @@ endif()
325
374
# Install project
326
375
327
376
# Install libraries
328
- install (TARGETS ${OpenBLAS_LIBNAME }
377
+ install (TARGETS ${OpenBLAS_LIBS }
329
378
EXPORT "OpenBLAS${SUFFIX64} Targets"
330
379
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
331
380
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
@@ -387,7 +436,12 @@ endif()
387
436
388
437
if (NOT NO_LAPACKE)
389
438
message (STATUS "Copying LAPACKE header files to ${CMAKE_INSTALL_INCLUDEDIR} " )
390
- add_dependencies ( ${OpenBLAS_LIBNAME} genlapacke)
439
+ if (BUILD_STATIC_LIBS)
440
+ add_dependencies ( ${OpenBLAS_LIBNAME} _static genlapacke)
441
+ endif ()
442
+ if (BUILD_SHARED_LIBS )
443
+ add_dependencies ( ${OpenBLAS_LIBNAME} _shared genlapacke)
444
+ endif ()
391
445
FILE (GLOB_RECURSE INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR} /lapack-netlib/LAPACKE/*.h" )
392
446
install (FILES ${INCLUDE_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
393
447
0 commit comments