Skip to content

Commit f348506

Browse files
authored
Merge pull request #3411 from MehdiChinoune/both_shared_static
Support building both static and shared libraries
2 parents 481b3dc + 28a77a8 commit f348506

File tree

1 file changed

+71
-18
lines changed

1 file changed

+71
-18
lines changed

CMakeLists.txt

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ set(NO_AFFINITY 1)
3434
endif()
3535
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)
3636
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()
3745

3846
# Add a prefix or suffix to all exported symbol names in the shared library.
3947
# Avoids conflicts with other BLAS libraries, especially when using
@@ -183,12 +191,45 @@ if (${DYNAMIC_ARCH})
183191
endif ()
184192

185193
# 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})
188224

189225
# Android needs to explicitly link against libm
190226
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()
192233
endif()
193234

194235
# Handle MSVC exports
@@ -197,21 +238,21 @@ if(MSVC AND BUILD_SHARED_LIBS)
197238
include("${PROJECT_SOURCE_DIR}/cmake/export.cmake")
198239
else()
199240
# 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)
201242
endif()
202243
endif()
203244

204245
# 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")
208249

209250
foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
210251
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
211252

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} )
215256
endforeach()
216257

217258
enable_testing()
@@ -220,10 +261,17 @@ if (USE_THREAD)
220261
# Add threading library to linker
221262
find_package(Threads)
222263
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})
225274
endif()
226-
target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT})
227275
endif()
228276

229277
#if (MSVC OR NOT NOFORTRAN)
@@ -244,14 +292,14 @@ if (NOT NOFORTRAN)
244292
endif()
245293
endif()
246294

247-
set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES
295+
set_target_properties(${OpenBLAS_LIBS} PROPERTIES
248296
VERSION ${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}
249297
SOVERSION ${OpenBLAS_MAJOR_VERSION}
250298
)
251299

252300
if (BUILD_SHARED_LIBS AND BUILD_RELAPACK)
253301
if (NOT MSVC)
254-
target_link_libraries(${OpenBLAS_LIBNAME} "-Wl,-allow-multiple-definition")
302+
target_link_libraries(${OpenBLAS_LIBNAME}_shared "-Wl,-allow-multiple-definition")
255303
else()
256304
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE")
257305
endif()
@@ -314,7 +362,7 @@ endif()
314362
if (NOT ${SYMBOLSUFFIX} STREQUAL "")
315363
message(STATUS "adding suffix ${SYMBOLSUFFIX} to names of exported symbols in ${OpenBLAS_LIBNAME}")
316364
endif()
317-
add_custom_command(TARGET ${OpenBLAS_LIBNAME} POST_BUILD
365+
add_custom_command(TARGET ${OpenBLAS_LIBNAME}_shared POST_BUILD
318366
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
319367
COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR}/objcopy.def ${PROJECT_BINARY_DIR}/lib/lib${OpenBLAS_LIBNAME}.so
320368
COMMENT "renaming symbols"
@@ -325,7 +373,7 @@ endif()
325373
# Install project
326374

327375
# Install libraries
328-
install(TARGETS ${OpenBLAS_LIBNAME}
376+
install(TARGETS ${OpenBLAS_LIBS}
329377
EXPORT "OpenBLAS${SUFFIX64}Targets"
330378
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
331379
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
@@ -387,7 +435,12 @@ endif()
387435

388436
if(NOT NO_LAPACKE)
389437
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()
391444
FILE(GLOB_RECURSE INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/lapack-netlib/LAPACKE/*.h")
392445
install (FILES ${INCLUDE_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
393446

0 commit comments

Comments
 (0)