@@ -21,6 +21,8 @@ include(CMakePackageConfigHelpers)
2121#######
2222option (BUILD_WITHOUT_LAPACK "Do not build LAPACK and LAPACKE (Only BLAS or CBLAS)" OFF )
2323
24+ option (BUILD_WITHOUT_LAPACKE "Do not build the C interface to LAPACK)" OFF )
25+
2426option (BUILD_LAPACK_DEPRECATED "When building LAPACK, include also some older, deprecated routines" ON )
2527
2628set (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
6062
6163option (CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library (requires OpenMP)" OFF )
6264option (BUILD_STATIC_LIBS "Build static library" OFF )
65+ option (BUILD_SHARED_LIBS "Build shared library" OFF )
6366if (NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS )
6467 set (BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE)
6568endif ()
@@ -75,12 +78,27 @@ set(SYMBOLPREFIX "" CACHE STRING "Add a prefix to all exported symbol names in
7578
7679set (SYMBOLSUFFIX "" CACHE STRING "Add a suffix to all exported symbol names in the shared library, e.g. _64 for INTERFACE64 builds" )
7780
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+
7892#######
7993if (BUILD_WITHOUT_LAPACK)
8094 set (NO_LAPACK 1)
8195 set (NO_LAPACKE 1)
8296endif ()
8397
98+ if (BUILD_WITHOUT_LAPACKE)
99+ set (NO_LAPACKE 1)
100+ endif ()
101+
84102if (BUILD_WITHOUT_CBLAS)
85103 set (NO_CBLAS 1)
86104endif ()
@@ -103,14 +121,15 @@ endif()
103121
104122message (WARNING "CMake support is experimental. It does not yet support all build options and may not produce the same Makefiles that OpenBLAS ships with." )
105123
106- if (USE_OPENMP)
107- find_package (OpenMP REQUIRED)
108- endif ()
109-
110124include ("${PROJECT_SOURCE_DIR} /cmake/utils.cmake" )
111125include ("${PROJECT_SOURCE_DIR} /cmake/system.cmake" )
112126
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 ()
114133
115134set (BLASDIRS interface driver/level2 driver/level3 driver/others)
116135
@@ -224,6 +243,12 @@ endif ()
224243# add objects to the openblas lib
225244if (NOT NO_LAPACK)
226245 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 ()
227252 list (APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK_OVERRIDES>" )
228253endif ()
229254if (NOT NO_LAPACKE)
@@ -265,30 +290,59 @@ endif()
265290
266291if (USE_OPENMP)
267292 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 ()
269298 endif ()
270299 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 ()
272305 endif ()
273306endif ()
274307
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 ()
292346endif ()
293347
294348# Handle MSVC exports
@@ -373,7 +427,7 @@ if (BUILD_SHARED_LIBS AND BUILD_RELAPACK)
373427 endif ()
374428endif ()
375429
376- if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
430+ if (BUILD_SHARED_LIBS OR DELETE_STATIC_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
377431 if (NOT DEFINED ARCH)
378432 set (ARCH_IN "x86_64" )
379433 else ()
@@ -461,10 +515,33 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
461515 else ()
462516 set (BZ 0)
463517 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 ()
464541 if (NOT USE_PERL)
465542 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
468545 COMMENT "renaming symbols"
469546 )
470547 else ()
@@ -475,6 +552,7 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
475552 )
476553 endif ()
477554endif ()
555+ endif ()
478556
479557if (BUILD_BENCHMARKS)
480558 #find_package(OpenMP REQUIRED)
@@ -645,3 +723,4 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
645723install (EXPORT "${PN}${SUFFIX64} Targets"
646724 NAMESPACE "${PN}${SUFFIX64} ::"
647725 DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
726+
0 commit comments