22## Author: Hank Anderson <hank@statease.com>
33##
44
5- cmake_minimum_required (VERSION 2.8.4 )
5+ cmake_minimum_required (VERSION 2.8.5 )
66project (OpenBLAS)
77set (OpenBLAS_MAJOR_VERSION 0)
88set (OpenBLAS_MINOR_VERSION 2)
9- set (OpenBLAS_PATCH_VERSION 19 )
9+ set (OpenBLAS_PATCH_VERSION 20 )
1010set (OpenBLAS_VERSION "${OpenBLAS_MAJOR_VERSION} .${OpenBLAS_MINOR_VERSION} .${OpenBLAS_PATCH_VERSION} " )
1111
1212enable_language (ASM )
1313enable_language (C )
1414
15+ # Adhere to GNU filesystem layout conventions
16+ include (GNUInstallDirs )
17+
1518if (MSVC )
1619set (OpenBLAS_LIBNAME libopenblas)
1720else ()
@@ -30,10 +33,20 @@ set(NO_LAPACK 1)
3033set (NO_LAPACKE 1)
3134endif ()
3235
33- if (BUILD_DEBUG)
34- set (CMAKE_BUILD_TYPE Debug)
36+ if (CMAKE_CONFIGURATION_TYPES ) # multiconfig generator?
37+ set (CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE )
38+ set (CMAKE_BUILD_TYPE
39+ Debug Debug
40+ Release Release
41+ )
3542else ()
36- set (CMAKE_BUILD_TYPE Release)
43+ if ( NOT CMAKE_BUILD_TYPE )
44+ if (BUILD_DEBUG)
45+ set (CMAKE_BUILD_TYPE Debug)
46+ else ()
47+ set (CMAKE_BUILD_TYPE Release)
48+ endif ()
49+ endif ()
3750endif ()
3851
3952if (BUILD_WITHOUT_CBLAS)
@@ -107,9 +120,12 @@ if (${NO_STATIC} AND ${NO_SHARED})
107120endif ()
108121
109122#Set default output directory
110- set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
111- set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
112-
123+ set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
124+ set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib)
125+ if (MSVC )
126+ set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR} /lib/Debug)
127+ set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR} /lib/Release)
128+ endif ()
113129# get obj vars into format that add_library likes: $<TARGET_OBJS:objlib> (see http://www.cmake.org/cmake/help/v3.0/command/add_library.html)
114130set (TARGET_OBJS "" )
115131foreach (SUBDIR ${SUBDIRS} )
@@ -129,9 +145,12 @@ if (NOT NO_LAPACKE)
129145endif ()
130146endif ()
131147
132- #Only generate .def for dll on MSVC
148+ # Only generate .def for dll on MSVC and always produce pdb files for debug and release
133149if (MSVC )
134150set (OpenBLAS_DEF_FILE "${PROJECT_BINARY_DIR} /openblas.def" )
151+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi" )
152+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi" )
153+ set (CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" )
135154endif ()
136155
137156# add objects to the openblas lib
@@ -141,25 +160,29 @@ include("${PROJECT_SOURCE_DIR}/cmake/export.cmake")
141160
142161# Set output for libopenblas
143162set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} /lib )
163+ set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG "${OpenBLAS_LIBNAME} _d" )
164+
144165foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
145166 string ( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
146- set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib )
147- set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib )
148- set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib )
167+
168+ set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
169+ set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
170+ set_target_properties ( ${OpenBLAS_LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR} /lib/${OUTPUTCONFIG} )
149171endforeach ()
150172
151173enable_testing ()
152174add_subdirectory (utest )
153175
154- if (NOT MSVC )
155- #only build shared library for MSVC
156- add_library (${OpenBLAS_LIBNAME} _static STATIC ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS} )
157- set_target_properties (${OpenBLAS_LIBNAME} _static PROPERTIES OUTPUT_NAME ${OpenBLAS_LIBNAME} )
158- set_target_properties (${OpenBLAS_LIBNAME} _static PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
159-
160- if (SMP)
161- target_link_libraries (${OpenBLAS_LIBNAME} pthread )
162- target_link_libraries (${OpenBLAS_LIBNAME} _static pthread )
176+ if (NOT MSVC )
177+ #only build shared library for MSVC
178+
179+ add_library (${OpenBLAS_LIBNAME} _static STATIC ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS} )
180+ set_target_properties (${OpenBLAS_LIBNAME} _static PROPERTIES OUTPUT_NAME ${OpenBLAS_LIBNAME} )
181+ set_target_properties (${OpenBLAS_LIBNAME} _static PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
182+
183+ if (SMP)
184+ target_link_libraries (${OpenBLAS_LIBNAME} pthread )
185+ target_link_libraries (${OpenBLAS_LIBNAME} _static pthread )
163186endif ()
164187
165188#build test and ctest
@@ -198,3 +221,73 @@ set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES
198221#endif
199222# @touch lib.grd
200223
224+ # Install project
225+
226+ # Install libraries
227+ install (TARGETS ${OpenBLAS_LIBNAME}
228+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
229+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
230+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} )
231+
232+ # Install include files
233+ set (GENCONFIG_BIN ${CMAKE_BINARY_DIR} /gen_config_h${CMAKE_EXECUTABLE_SUFFIX} )
234+ ADD_CUSTOM_COMMAND (
235+ OUTPUT ${CMAKE_BINARY_DIR} /openblas_config.h
236+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /config.h
237+ COMMAND ${GENCONFIG_BIN} ${CMAKE_CURRENT_SOURCE_DIR} /config.h ${CMAKE_CURRENT_SOURCE_DIR} /openblas_config_template.h > ${CMAKE_BINARY_DIR} /openblas_config.h
238+ )
239+
240+ ADD_CUSTOM_TARGET (genconfig
241+ ALL
242+ DEPENDS openblas_config.h
243+ )
244+ add_dependencies (genconfig ${OpenBLAS_LIBNAME} )
245+
246+ install (FILES ${CMAKE_BINARY_DIR} /openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
247+
248+ message (STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR} " )
249+
250+ ADD_CUSTOM_TARGET (genf77blas
251+ ALL
252+ COMMAND ${AWK} 'BEGIN{print \"\# ifndef OPENBLAS_F77BLAS_H\" \; print \"\# define OPENBLAS_F77BLAS_H\" \; print \"\# include \\ " openblas_config.h \\" \" }; NF {print}; END{print \"\# endif\" }' ${CMAKE_CURRENT_SOURCE_DIR} /common_interface.h > ${CMAKE_BINARY_DIR} /f77blas.h
253+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /config.h
254+ )
255+ add_dependencies(genf77blas ${OpenBLAS_LIBNAME} )
256+
257+ install (FILES ${CMAKE_BINARY_DIR} /f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
258+
259+ if(NOT NO_CBLAS)
260+ message (STATUS " Generating cblas.h in ${CMAKE_INSTALL_INCLUDEDIR} ")
261+
262+ ADD_CUSTOM_TARGET(gencblas
263+ ALL
264+ COMMAND ${SED} 's/common/openblas_config/g' ${CMAKE_CURRENT_SOURCE_DIR} /cblas.h > " ${CMAKE_BINARY_DIR} /cblas.tmp "
265+ COMMAND cp " ${CMAKE_BINARY_DIR} /cblas.tmp " " ${CMAKE_BINARY_DIR} /cblas.h "
266+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /cblas.h
267+ )
268+ add_dependencies(gencblas ${OpenBLAS_LIBNAME} )
269+
270+ install (FILES ${CMAKE_BINARY_DIR} /cblas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
271+ endif()
272+
273+ if(NOT NO_LAPACKE)
274+ message (STATUS " Copying LAPACKE header files to ${CMAKE_INSTALL_INCLUDEDIR} ")
275+ add_dependencies( ${OpenBLAS_LIBNAME} genlapacke)
276+ FILE(GLOB_RECURSE INCLUDE_FILES " ${CMAKE_CURRENT_SOURCE_DIR} /lapack-netlib/LAPACKE/*.h ")
277+ install (FILES ${INCLUDE_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
278+
279+ ADD_CUSTOM_TARGET(genlapacke
280+ COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR} /lapack-netlib/LAPACKE/include/lapacke_mangling_with_flags.h.in " ${CMAKE_BINARY_DIR} /lapacke_mangling.h "
281+ )
282+ install (FILES ${CMAKE_BINARY_DIR} /lapacke_mangling.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
283+ endif()
284+
285+ if(NOT MSVC)
286+ install (TARGETS ${OpenBLAS_LIBNAME} _static DESTINATION ${CMAKE_INSTALL_LIBDIR} )
287+ endif()
288+
289+ include(FindPkgConfig QUIET)
290+ if(PKG_CONFIG_FOUND)
291+ configure_file(${PROJECT_SOURCE_DIR} /cmake/openblas.pc.in ${PROJECT_BINARY_DIR} /openblas.pc @ONLY)
292+ install (FILES ${PROJECT_BINARY_DIR} /openblas.pc DESTINATION ${CMAKE_INSTALL_LIBDIR} /pkgconfig/)
293+ endif()
0 commit comments