@@ -21,6 +21,8 @@ include(CMakePackageConfigHelpers)
21
21
#######
22
22
option (BUILD_WITHOUT_LAPACK "Do not build LAPACK and LAPACKE (Only BLAS or CBLAS)" OFF )
23
23
24
+ option (BUILD_WITHOUT_LAPACKE "Do not build the C interface to LAPACK)" OFF )
25
+
24
26
option (BUILD_LAPACK_DEPRECATED "When building LAPACK, include also some older, deprecated routines" ON )
25
27
26
28
set (LAPACK_STRLEN "" CACHE STRING "When building LAPACK, use this type (e.g. \" int\" ) for character lengths (defaults to size_t)" )
@@ -60,6 +62,7 @@ option(CPP_THREAD_SAFETY_TEST "Run a massively parallel DGEMM test to confirm th
60
62
61
63
option (CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library (requires OpenMP)" OFF )
62
64
option (BUILD_STATIC_LIBS "Build static library" OFF )
65
+ option (BUILD_SHARED_LIBS "Build shared library" OFF )
63
66
if (NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS )
64
67
set (BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE )
65
68
endif ()
@@ -75,12 +78,27 @@ set(SYMBOLPREFIX "" CACHE STRING "Add a prefix to all exported symbol names in
75
78
76
79
set (SYMBOLSUFFIX "" CACHE STRING "Add a suffix to all exported symbol names in the shared library, e.g. _64 for INTERFACE64 builds" )
77
80
81
+ if (CMAKE_SYSTEM_NAME MATCHES "Windows" AND BUILD_SHARED_LIBS AND NOT ("${SYMBOLPREFIX}${SYMBOLSUFFIX} " STREQUAL "" ))
82
+ set (DELETE_STATIC_LIBS "" )
83
+ if (NOT BUILD_STATIC_LIBS )
84
+ message (STATUS "forcing build of a temporary static library for symbol renaming" )
85
+ set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared library" FORCE )
86
+ set (BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE )
87
+ set (DELETE_STATIC_LIBS file (REMOVE $< TARGET_FILE_DIR:${OpenBLAS_LIBNAME} _static> /${OpenBLAS_LIBNAME}.lib ))
88
+ endif ()
89
+ endif ()
90
+
91
+
78
92
#######
79
93
if (BUILD_WITHOUT_LAPACK )
80
94
set (NO_LAPACK 1 )
81
95
set (NO_LAPACKE 1 )
82
96
endif ()
83
97
98
+ if (BUILD_WITHOUT_LAPACKE )
99
+ set (NO_LAPACKE 1 )
100
+ endif ()
101
+
84
102
if (BUILD_WITHOUT_CBLAS )
85
103
set (NO_CBLAS 1 )
86
104
endif ()
@@ -103,14 +121,15 @@ endif()
103
121
104
122
message (WARNING "CMake support is experimental. It does not yet support all build options and may not produce the same Makefiles that OpenBLAS ships with." )
105
123
106
- if (USE_OPENMP )
107
- find_package (OpenMP REQUIRED )
108
- endif ()
109
-
110
124
include ("${PROJECT_SOURCE_DIR} /cmake/utils.cmake" )
111
125
include ("${PROJECT_SOURCE_DIR} /cmake/system.cmake" )
112
126
113
- set (OpenBLAS_LIBNAME ${LIBNAMEPREFIX} openblas${LIBNAMESUFFIX}${SUFFIX64_UNDERSCORE} )
127
+ string (FIND "${LIBNAMESUFFIX} " "${SUFFIX64_UNDERSCORE} " HAVE64 )
128
+ if (${HAVE64} GREATER -1 )
129
+ set (OpenBLAS_LIBNAME ${LIBNAMEPREFIX} openblas${LIBNAMESUFFIX} )
130
+ else ()
131
+ set (OpenBLAS_LIBNAME ${LIBNAMEPREFIX} openblas${LIBNAMESUFFIX}${SUFFIX64_UNDERSCORE} )
132
+ endif ()
114
133
115
134
set (BLASDIRS interface driver/level2 driver/level3 driver/others )
116
135
@@ -224,6 +243,12 @@ endif ()
224
243
# add objects to the openblas lib
225
244
if (NOT NO_LAPACK )
226
245
add_library (LAPACK_OVERRIDES OBJECT ${LA_SOURCES} )
246
+ if (USE_OPENMP AND (NOT NOFORTRAN ))
247
+ # Disable OpenMP for LAPACK Fortran codes on Windows.
248
+ if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
249
+ target_link_libraries (LAPACK_OVERRIDES OpenMP::OpenMP_Fortran )
250
+ endif ()
251
+ endif ()
227
252
list (APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK_OVERRIDES>" )
228
253
endif ()
229
254
if (NOT NO_LAPACKE )
@@ -265,30 +290,59 @@ endif()
265
290
266
291
if (USE_OPENMP )
267
292
if (BUILD_STATIC_LIBS )
268
- target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C )
293
+ if (NOFORTRAN )
294
+ target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C )
295
+ else ()
296
+ target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C OpenMP::OpenMP_Fortran )
297
+ endif ()
269
298
endif ()
270
299
if (BUILD_SHARED_LIBS )
271
- target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C )
300
+ if (NOFORTRAN )
301
+ target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C )
302
+ else ()
303
+ target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C OpenMP::OpenMP_Fortran )
304
+ endif ()
272
305
endif ()
273
306
endif ()
274
307
275
- # Seems that this hack doesn't required since macOS 11 Big Sur
276
- if (APPLE AND BUILD_SHARED_LIBS AND CMAKE_HOST_SYSTEM_VERSION VERSION_LESS 20 )
277
- set (CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1 )
278
- if (NOT NOFORTRAN )
279
- set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1 )
280
- set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
281
- "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/openblas_shared.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru libopenblas.a && exit 0' "
282
- "sh -c '${CMAKE_AR} -rs libopenblas.a ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' "
283
- "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
284
- "sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,libopenblas.a -Wl,-noall_load dummy.o -o ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /libopenblas.${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION} .dylib'"
285
- "sh -c 'ls -l ${CMAKE_BINARY_DIR} /lib'" )
286
- else ()
287
- set (CMAKE_C_CREATE_SHARED_LIBRARY
288
- "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/openblas_shared.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru libopenblas.a && exit 0' "
289
- "sh -c '${CMAKE_AR} -rs libopenblas.a ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' "
290
- "sh -c '${CMAKE_C_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,libopenblas.a -Wl,-noall_load -o ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /libopenblas.${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION} .dylib'" )
291
- endif ()
308
+ # Fix "Argument list too long" for macOS with Intel CPUs and DYNAMIC_ARCH turned on
309
+ if (APPLE AND DYNAMIC_ARCH AND (NOT CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" ))
310
+ # Use response files
311
+ set (CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1 )
312
+ # Always build static library first
313
+ if (BUILD_STATIC_LIBS )
314
+ set (STATIC_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /lib${OpenBLAS_LIBNAME} .a" )
315
+ else ()
316
+ add_library (${OpenBLAS_LIBNAME} _static STATIC ${TARGET_OBJS} ${OpenBLAS_DEF_FILE} )
317
+ set (STATIC_PATH "lib${OpenBLAS_LIBNAME} .a" )
318
+ endif ()
319
+ set (CREATE_STATIC_LIBRARY_COMMAND
320
+ "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/${OpenBLAS_LIBNAME} _static.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru ${STATIC_PATH} && exit 0' "
321
+ "sh -c '${CMAKE_AR} -rs ${STATIC_PATH} ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' " )
322
+ if (BUILD_SHARED_LIBS )
323
+ add_dependencies (${OpenBLAS_LIBNAME} _shared ${OpenBLAS_LIBNAME} _static )
324
+ set (SHARED_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /libopenblas.${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION} .dylib" )
325
+ endif ()
326
+ if (USE_OPENMP )
327
+ get_target_property (OMP_LIB OpenMP::OpenMP_C INTERFACE_LINK_LIBRARIES )
328
+ else ()
329
+ set (OMP_LIB "" )
330
+ endif ()
331
+ if (NOT NOFORTRAN )
332
+ set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1 )
333
+ set (CMAKE_Fortran_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
334
+ if (BUILD_SHARED_LIBS )
335
+ set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
336
+ "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
337
+ "sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB} '" )
338
+ endif ()
339
+ else ()
340
+ set (CMAKE_C_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
341
+ if (BUILD_SHARED_LIBS )
342
+ set (CMAKE_C_CREATE_SHARED_LIBRARY
343
+ "sh -c '${CMAKE_C_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} -o ${SHARED_PATH} ${OMP_LIB} '" )
344
+ endif ()
345
+ endif ()
292
346
endif ()
293
347
294
348
# Handle MSVC exports
@@ -373,7 +427,7 @@ if (BUILD_SHARED_LIBS AND BUILD_RELAPACK)
373
427
endif ()
374
428
endif ()
375
429
376
- if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
430
+ if (BUILD_SHARED_LIBS OR DELETE_STATIC_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
377
431
if (NOT DEFINED ARCH )
378
432
set (ARCH_IN "x86_64" )
379
433
else ()
@@ -461,10 +515,33 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
461
515
else ()
462
516
set (BZ 0 )
463
517
endif ()
518
+
519
+ if (CMAKE_SYSTEM_NAME MATCHES "Windows" )
520
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
521
+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
522
+ if (CMAKE_BUILD_TYPE MATCHES "Debug" )
523
+ set (CRTLIB msvcrtd )
524
+ set (PDBOPT -debug -pdb:$<TARGET_FILE_DIR:${OpenBLAS_LIBNAME}_static>/${OpenBLAS_LIBNAME}.pdb )
525
+ set (PDB_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
526
+ else ()
527
+ set (CRTLIB msvcrt )
528
+ set (PDBOPT "" )
529
+ endif ()
530
+ #if (USE_PERL)
531
+ message (STATUS "adding postbuild instruction to rename syms" )
532
+ add_custom_command (TARGET ${OpenBLAS_LIBNAME} _static POST_BUILD
533
+ COMMAND perl ${PROJECT_SOURCE_DIR} /exports/gensymbol.pl "win2k" "${ARCH} " "${BU} " "${EXPRECISION_IN} " "${NO_CBLAS_IN} " "${NO_LAPACK_IN} " "${NO_LAPACKE_IN} " "${NEED2UNDERSCORES_IN} " "${ONLY_CBLAS_IN} " "${SYMBOLPREFIX} " "${SYMBOLSUFFIX} " "${BLD} " "${BBF16} " "${BS} " "${BD} " "${BC} " "${BZ} " > ${PROJECT_BINARY_DIR} /renamesyms.def
534
+ COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} -I${PROJECT_SOURCE_DIR} -I${PROJECT_BINARY_DIR} -c -o ${PROJECT_BINARY_DIR} /dllinit.o ${PROJECT_SOURCE_DIR} /exports/dllinit.c
535
+ COMMAND lld-link -nodefaultlib:libcmt -defaultlib:${CRTLIB} ${CMAKE_LINKER_FLAGS} -errorlimit:0 -def:${PROJECT_BINARY_DIR}/renamesyms.def ${PROJECT_BINARY_DIR} /dllinit.o $< TARGET_FILE:${OpenBLAS_LIBNAME} _static> -wholearchive:$<TARGET_FILE:${OpenBLAS_LIBNAME}_static> -dll -out:$<TARGET_FILE_DIR:${OpenBLAS_LIBNAME}_static>/${OpenBLAS_LIBNAME}.dll -implib:$<TARGET_FILE_DIR:${OpenBLAS_LIBNAME}_static>/${OpenBLAS_LIBNAME}.dll.a ${PDBOPT}
536
+ #COMMAND lld-link -nodefaultlib:libcmt -defaultlib:msvcrt ${CMAKE_LINKER_FLAGS} -errorlimit:0 -def:${PROJECT_BINARY_DIR}/renamesyms.def ${PROJECT_BINARY_DIR}/dllinit.o $<TARGET_FILE:${OpenBLAS_LIBNAME}_static> -wholearchive:$<TARGET_FILE:${OpenBLAS_LIBNAME}_static> -dll -out:$<TARGET_FILE_DIR:${OpenBLAS_LIBNAME}_static>/${OpenBLAS_LIBNAME}.dll -implib:$<TARGET_FILE_DIR:${OpenBLAS_LIBNAME}_static>/${OpenBLAS_LIBNAME}.dll.a
537
+ ${REMOVE_STATIC_LIB} VERBATIM
538
+ )
539
+ #endif ()
540
+ else ()
464
541
if (NOT USE_PERL )
465
542
add_custom_command (TARGET ${OpenBLAS_LIBNAME} _shared POST_BUILD
466
- COMMAND ${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} \" " ${BLD} " " ${BBF16} " " ${BS} " " ${BD} " " ${BC} " " ${BZ} " > ${PROJECT_BINARY_DIR} /objcopy.def
467
- COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR} /objcopy.def ${PROJECT_BINARY_DIR} /lib/lib ${OpenBLAS_LIBNAME} .so
543
+ COMMAND sh ${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} \" " ${BLD} " " ${BBF16} " " ${BS} " " ${BD} " " ${BC} " " ${BZ} " > ${PROJECT_BINARY_DIR} /objcopy.def
544
+ COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR} /objcopy.def ${PROJECT_BINARY_DIR} /lib/${OpenBLAS_LIBNAME} .so
468
545
COMMENT " renaming symbols "
469
546
)
470
547
else()
@@ -475,6 +552,7 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
475
552
)
476
553
endif()
477
554
endif()
555
+ endif()
478
556
479
557
if (BUILD_BENCHMARKS)
480
558
#find_package(OpenMP REQUIRED)
@@ -645,3 +723,4 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
645
723
install (EXPORT "${PN}${SUFFIX64} Targets"
646
724
NAMESPACE "${PN}${SUFFIX64} ::"
647
725
DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
726
+
0 commit comments