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