Skip to content

Commit 639000e

Browse files
authored
Merge pull request #1211 from neilsh-msft/develop
Add 64bit support for Microsoft Visual Studio
2 parents 8f0d6c0 + 5de7727 commit 639000e

6 files changed

Lines changed: 76 additions & 22 deletions

File tree

CMakeLists.txt

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,12 @@ if (${NO_STATIC} AND ${NO_SHARED})
120120
endif ()
121121

122122
#Set default output directory
123-
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib )
124-
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib )
125-
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 ()
126129
# 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)
127130
set(TARGET_OBJS "")
128131
foreach (SUBDIR ${SUBDIRS})
@@ -142,9 +145,12 @@ if (NOT NO_LAPACKE)
142145
endif ()
143146
endif ()
144147

145-
#Only generate .def for dll on MSVC
148+
# Only generate .def for dll on MSVC and always produce pdb files for debug and release
146149
if(MSVC)
147150
set(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")
148154
endif()
149155

150156
# add objects to the openblas lib
@@ -159,15 +165,15 @@ set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG
159165
foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
160166
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
161167

162-
set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib)
163-
set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib)
164-
set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib)
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} )
165171
endforeach()
166172

167173
enable_testing()
168174
add_subdirectory(utest)
169175

170-
if(NOT MSVC)
176+
if (NOT MSVC)
171177
#only build shared library for MSVC
172178

173179
add_library(${OpenBLAS_LIBNAME}_static STATIC ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS})
@@ -224,34 +230,38 @@ install(TARGETS ${OpenBLAS_LIBNAME}
224230
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} )
225231

226232
# Install include files
227-
add_executable(gen_config_h gen_config_h.c)
228-
target_compile_definitions(gen_config_h PRIVATE VERSION=\"${OpenBLAS_VERSION}\")
229-
message (STATUS "Generating openblas_config.h in ${CMAKE_BINARY_DIR}")
230-
GET_TARGET_PROPERTY(GENCONFIG_BIN gen_config_h LOCATION)
233+
set (GENCONFIG_BIN ${CMAKE_BINARY_DIR}/gen_config_h${CMAKE_EXECUTABLE_SUFFIX})
231234
ADD_CUSTOM_COMMAND(
232235
OUTPUT ${CMAKE_BINARY_DIR}/openblas_config.h
233236
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/config.h
234237
COMMAND ${GENCONFIG_BIN} ${CMAKE_CURRENT_SOURCE_DIR}/config.h ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h > ${CMAKE_BINARY_DIR}/openblas_config.h
235238
)
236239
ADD_CUSTOM_TARGET(genconfig DEPENDS openblas_config.h)
237-
add_dependencies( ${OpenBLAS_LIBNAME} genconfig genf77blas)
240+
add_dependencies(genconfig ${OpenBLAS_LIBNAME})
241+
238242
install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
239243

240244
message(STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR}")
245+
241246
ADD_CUSTOM_TARGET(genf77blas
242247
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
243-
244248
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/config.h
245249
)
250+
add_dependencies(genf77blas ${OpenBLAS_LIBNAME})
251+
246252
install (FILES ${CMAKE_BINARY_DIR}/f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
247253
248254
if(NOT NO_CBLAS)
249255
message (STATUS "Generating cblas.h in ${CMAKE_INSTALL_INCLUDEDIR}")
256+
250257
ADD_CUSTOM_TARGET(gencblas
251-
COMMAND sed 's/common/openblas_config/g' ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h > "${CMAKE_BINARY_DIR}/cblas.h"
258+
COMMAND ${SED} 's/common/openblas_config/g' ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h > "${CMAKE_BINARY_DIR}/cblas.tmp"
259+
COMMAND cp "${CMAKE_BINARY_DIR}/cblas.tmp" "${CMAKE_BINARY_DIR}/cblas.h"
252260
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h
253261
)
254-
add_dependencies( ${OpenBLAS_LIBNAME} gencblas)
262+
263+
add_dependencies(gencblas ${OpenBLAS_LIBNAME})
264+
255265
install (FILES ${CMAKE_BINARY_DIR}/cblas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
256266
endif()
257267
@@ -261,7 +271,6 @@ if(NOT NO_LAPACKE)
261271
FILE(GLOB_RECURSE INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/lapack-netlib/LAPACKE/*.h")
262272
install (FILES ${INCLUDE_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
263273
264-
265274
ADD_CUSTOM_TARGET(genlapacke
266275
COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/lapack-netlib/LAPACKE/include/lapacke_mangling_with_flags.h.in "${CMAKE_BINARY_DIR}/lapacke_mangling.h"
267276
)

cmake/prebuild.cmake

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
## This is triggered by system.cmake and runs before any of the code is built.
55
## Creates config.h and Makefile.conf by first running the c_check perl script (which creates those files).
66
## Next it runs f_check and appends some fortran information to the files.
7-
## Finally it runs getarch and getarch_2nd for even more environment information.
7+
## Then it runs getarch and getarch_2nd for even more environment information.
8+
## Finally it builds gen_config_h for use at build time to generate config.h.
89

910
# CMake vars set by this file:
1011
# CORE
@@ -81,6 +82,10 @@ try_compile(GETARCH_RESULT ${GETARCH_DIR}
8182
COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN}
8283
)
8384

85+
if (NOT ${GETARCH_RESULT})
86+
MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}")
87+
endif ()
88+
8489
message(STATUS "Running getarch")
8590

8691
# use the cmake binary w/ the -E param to run a shell command in a cross-platform way
@@ -103,6 +108,10 @@ try_compile(GETARCH2_RESULT ${GETARCH2_DIR}
103108
COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN}
104109
)
105110

111+
if (NOT ${GETARCH2_RESULT})
112+
MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}")
113+
endif ()
114+
106115
# use the cmake binary w/ the -E param to run a shell command in a cross-platform way
107116
execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT)
108117
execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT)
@@ -111,3 +120,19 @@ execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 1 OUTPUT_VARIABLE
111120
file(APPEND ${TARGET_CONF} ${GETARCH2_CONF_OUT})
112121
ParseGetArchVars(${GETARCH2_MAKE_OUT})
113122

123+
# compile get_config_h
124+
set(GEN_CONFIG_H_DIR "${PROJECT_BINARY_DIR}/genconfig_h_build")
125+
set(GEN_CONFIG_H_BIN "gen_config_h${CMAKE_EXECUTABLE_SUFFIX}")
126+
set(GEN_CONFIG_H_FLAGS "-DVERSION=\"${OpenBLAS_VERSION}\"")
127+
file(MAKE_DIRECTORY ${GEN_CONFIG_H_DIR})
128+
129+
try_compile(GEN_CONFIG_H_RESULT ${GEN_CONFIG_H_DIR}
130+
SOURCES ${PROJECT_SOURCE_DIR}/gen_config_h.c
131+
COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GEN_CONFIG_H_FLAGS} -I${PROJECT_SOURCE_DIR}
132+
OUTPUT_VARIABLE GEN_CONFIG_H_LOG
133+
COPY_FILE ${PROJECT_BINARY_DIR}/${GEN_CONFIG_H_BIN}
134+
)
135+
136+
if (NOT ${GEN_CONFIG_H_RESULT})
137+
MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}")
138+
endif ()

cmake/system.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ endif ()
312312

313313
set(AWK awk)
314314

315+
set(SED sed)
316+
315317
set(REVISION "-r${OpenBLAS_VERSION}")
316318
set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
317319

driver/others/memory.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,12 +1479,30 @@ static int on_process_term(void)
14791479
#else
14801480
#pragma comment(linker, "/INCLUDE:__tls_used")
14811481
#endif
1482-
#pragma data_seg(push, old_seg)
1482+
1483+
#ifdef _WIN64
1484+
#pragma const_seg(".CRT$XLB")
1485+
#else
14831486
#pragma data_seg(".CRT$XLB")
1487+
#endif
14841488
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain;
1489+
#ifdef _WIN64
1490+
#pragma const_seg()
1491+
#else
1492+
#pragma data_seg()
1493+
#endif
1494+
1495+
#ifdef _WIN64
1496+
#pragma const_seg(".CRT$XTU")
1497+
#else
14851498
#pragma data_seg(".CRT$XTU")
1499+
#endif
14861500
static int(*p_process_term)(void) = on_process_term;
1487-
#pragma data_seg(pop, old_seg)
1501+
#ifdef _WIN64
1502+
#pragma const_seg()
1503+
#else
1504+
#pragma data_seg()
1505+
#endif
14881506
#endif
14891507

14901508
#if (defined(C_PGI) || (!defined(C_SUN) && defined(F_INTERFACE_SUN))) && (defined(ARCH_X86) || defined(ARCH_X86_64))

gen_config_h.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ s=fgets(line,80,fp);
1616
if (s== NULL) break;
1717
memset(line2,0,80);
1818
i=sscanf(line,"#define %70c",line2);
19-
if (i>0) {
19+
if (i!=0) {
2020
fprintf(stdout,"#define OPENBLAS_%s",line2);
2121
} else {
2222
fprintf(stdout,"\n");

utest/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ endforeach()
3131
if (MSVC)
3232
add_custom_command(TARGET ${OpenBLAS_utest_bin}
3333
POST_BUILD
34-
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/lib/${OpenBLAS_LIBNAME}.dll ${CMAKE_CURRENT_BINARY_DIR}/.
34+
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/lib/$<CONFIG>/${OpenBLAS_LIBNAME}.dll ${CMAKE_CURRENT_BINARY_DIR}/.
3535
)
3636
endif()
3737

0 commit comments

Comments
 (0)