@@ -77,6 +77,17 @@ set(SYMBOLPREFIX "" CACHE STRING "Add a prefix to all exported symbol names in
7777
7878set (SYMBOLSUFFIX "" CACHE STRING "Add a suffix to all exported symbol names in the shared library, e.g. _64 for INTERFACE64 builds" )
7979
80+ if (CMAKE_SYSTEM_NAME MATCHES "Windows" AND BUILD_SHARED_LIBS AND NOT ("${SYMBOLPREFIX}${SYMBOLSUFFIX} " STREQUAL "" ))
81+ set (DELETE_STATIC_LIBS "" )
82+ if (NOT BUILD_STATIC_LIBS)
83+ message (STATUS "forcing build of a temporary static library for symbol renaming" )
84+ set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared library" FORCE )
85+ set (BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE )
86+ set (DELETE_STATIC_LIBS file (REMOVE $<TARGET_FILE_DIR :${OpenBLAS_LIBNAME} _static >/${OpenBLAS_LIBNAME} .lib))
87+ endif ()
88+ endif ()
89+
90+
8091#######
8192if (BUILD_WITHOUT_LAPACK)
8293 set (NO_LAPACK 1)
@@ -109,10 +120,6 @@ endif()
109120
110121message (WARNING "CMake support is experimental. It does not yet support all build options and may not produce the same Makefiles that OpenBLAS ships with." )
111122
112- if (USE_OPENMP)
113- find_package (OpenMP REQUIRED )
114- endif ()
115-
116123include ("${PROJECT_SOURCE_DIR} /cmake/utils.cmake" )
117124include ("${PROJECT_SOURCE_DIR} /cmake/system.cmake" )
118125
@@ -230,6 +237,12 @@ endif ()
230237# add objects to the openblas lib
231238if (NOT NO_LAPACK)
232239 add_library (LAPACK_OVERRIDES OBJECT ${LA_SOURCES} )
240+ if (USE_OPENMP AND (NOT NOFORTRAN))
241+ # Disable OpenMP for LAPACK Fortran codes on Windows.
242+ if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
243+ target_link_libraries (LAPACK_OVERRIDES OpenMP::OpenMP_Fortran )
244+ endif ()
245+ endif ()
233246 list (APPEND TARGET_OBJS "$<TARGET_OBJECTS :LAPACK_OVERRIDES >" )
234247endif ()
235248if (NOT NO_LAPACKE)
@@ -271,30 +284,59 @@ endif()
271284
272285if (USE_OPENMP)
273286 if (BUILD_STATIC_LIBS)
274- target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C )
287+ if (NOFORTRAN)
288+ target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C )
289+ else ()
290+ target_link_libraries (${OpenBLAS_LIBNAME} _static OpenMP::OpenMP_C OpenMP::OpenMP_Fortran )
291+ endif ()
275292 endif ()
276293 if (BUILD_SHARED_LIBS )
277- target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C )
294+ if (NOFORTRAN)
295+ target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C )
296+ else ()
297+ target_link_libraries (${OpenBLAS_LIBNAME} _shared OpenMP::OpenMP_C OpenMP::OpenMP_Fortran )
298+ endif ()
278299 endif ()
279300endif ()
280301
281- # Seems that this hack doesn't required since macOS 11 Big Sur
282- if (APPLE AND BUILD_SHARED_LIBS AND CMAKE_HOST_SYSTEM_VERSION VERSION_LESS 20)
283- set (CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
284- if (NOT NOFORTRAN)
285- set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1)
286- set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
287- "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/openblas_shared.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru libopenblas.a && exit 0' "
288- "sh -c '${CMAKE_AR} -rs libopenblas.a ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' "
289- "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
290- "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'"
291- "sh -c 'ls -l ${CMAKE_BINARY_DIR} /lib'" )
292- else ()
293- set (CMAKE_C_CREATE_SHARED_LIBRARY
294- "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/openblas_shared.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru libopenblas.a && exit 0' "
295- "sh -c '${CMAKE_AR} -rs libopenblas.a ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' "
296- "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'" )
297- endif ()
302+ # Fix "Argument list too long" for macOS with Intel CPUs and DYNAMIC_ARCH turned on
303+ if (APPLE AND DYNAMIC_ARCH AND (NOT CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" ))
304+ # Use response files
305+ set (CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
306+ # Always build static library first
307+ if (BUILD_STATIC_LIBS)
308+ set (STATIC_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /lib${OpenBLAS_LIBNAME} .a" )
309+ else ()
310+ add_library (${OpenBLAS_LIBNAME} _static STATIC ${TARGET_OBJS} ${OpenBLAS_DEF_FILE} )
311+ set (STATIC_PATH "lib${OpenBLAS_LIBNAME} .a" )
312+ endif ()
313+ set (CREATE_STATIC_LIBRARY_COMMAND
314+ "sh -c 'cat ${CMAKE_BINARY_DIR} /CMakeFiles/${OpenBLAS_LIBNAME} _static.dir/objects*.rsp | xargs -n 1024 ${CMAKE_AR} -ru ${STATIC_PATH} && exit 0' "
315+ "sh -c '${CMAKE_AR} -rs ${STATIC_PATH} ${CMAKE_BINARY_DIR} /driver/others/CMakeFiles/driver_others.dir/xerbla.c.o && exit 0' " )
316+ if (BUILD_SHARED_LIBS )
317+ add_dependencies (${OpenBLAS_LIBNAME} _shared ${OpenBLAS_LIBNAME} _static )
318+ set (SHARED_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY} /libopenblas.${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION} .dylib" )
319+ endif ()
320+ if (USE_OPENMP)
321+ get_target_property (OMP_LIB OpenMP::OpenMP_C INTERFACE_LINK_LIBRARIES )
322+ else ()
323+ set (OMP_LIB "" )
324+ endif ()
325+ if (NOT NOFORTRAN)
326+ set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS 1)
327+ set (CMAKE_Fortran_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
328+ if (BUILD_SHARED_LIBS )
329+ set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
330+ "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
331+ "sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB} '" )
332+ endif ()
333+ else ()
334+ set (CMAKE_C_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
335+ if (BUILD_SHARED_LIBS )
336+ set (CMAKE_C_CREATE_SHARED_LIBRARY
337+ "sh -c '${CMAKE_C_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} -o ${SHARED_PATH} ${OMP_LIB} '" )
338+ endif ()
339+ endif ()
298340endif ()
299341
300342# Handle MSVC exports
@@ -379,7 +421,7 @@ if (BUILD_SHARED_LIBS AND BUILD_RELAPACK)
379421 endif ()
380422endif ()
381423
382- if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
424+ if (BUILD_SHARED_LIBS OR DELETE_STATIC_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "" )
383425 if (NOT DEFINED ARCH)
384426 set (ARCH_IN "x86_64" )
385427 else ()
@@ -467,10 +509,33 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
467509 else ()
468510 set (BZ 0)
469511 endif ()
512+
513+ if (CMAKE_SYSTEM_NAME MATCHES "Windows" )
514+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
515+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
516+ if (CMAKE_BUILD_TYPE MATCHES "Debug" )
517+ set (CRTLIB msvcrtd)
518+ set (PDBOPT -debug -pdb:$<TARGET_FILE_DIR :${OpenBLAS_LIBNAME} _static >/${OpenBLAS_LIBNAME} .pdb)
519+ set (PDB_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
520+ else ()
521+ set (CRTLIB msvcrt)
522+ set (PDBOPT "" )
523+ endif ()
524+ #if (USE_PERL)
525+ message (STATUS "adding postbuild instruction to rename syms" )
526+ add_custom_command (TARGET ${OpenBLAS_LIBNAME} _static POST_BUILD
527+ 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
528+ 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
529+ 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}
530+ #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
531+ ${REMOVE_STATIC_LIB} VERBATIM
532+ )
533+ #endif ()
534+ else ()
470535 if (NOT USE_PERL)
471536 add_custom_command (TARGET ${OpenBLAS_LIBNAME} _shared POST_BUILD
472- 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
473- COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR} /objcopy.def ${PROJECT_BINARY_DIR} /lib/lib ${OpenBLAS_LIBNAME} .so
537+ 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
538+ COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR} /objcopy.def ${PROJECT_BINARY_DIR} /lib/${OpenBLAS_LIBNAME} .so
474539 COMMENT " renaming symbols "
475540 )
476541 else()
@@ -481,6 +546,7 @@ if (BUILD_SHARED_LIBS AND NOT ${SYMBOLPREFIX}${SYMBOLSUFFIX} STREQUAL "")
481546 )
482547 endif()
483548endif()
549+ endif()
484550
485551if (BUILD_BENCHMARKS)
486552 #find_package(OpenMP REQUIRED)
@@ -650,4 +716,4 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PN}ConfigVersion.cmake
650716 DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
651717install (EXPORT "${PN}${SUFFIX64} Targets"
652718 NAMESPACE "${PN}${SUFFIX64} ::"
653- DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
719+ DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
0 commit comments