Skip to content

Commit 65e56cb

Browse files
committed
Add 64bit support for Microsoft Visual Studio
1 parent 8f0d6c0 commit 65e56cb

File tree

6 files changed

+92
-19
lines changed

6 files changed

+92
-19
lines changed

Diff for: CMakeLists.txt

+42-14
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,10 +230,7 @@ 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
@@ -238,19 +241,32 @@ install(TARGETS ${OpenBLAS_LIBNAME}
238241
install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
239242

240243
message(STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR}")
244+
if (NOT MSVC)
241245
ADD_CUSTOM_TARGET(genf77blas
242246
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-
244247
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/config.h
245248
)
249+
else ()
250+
ADD_CUSTOM_TARGET(genf77blas
251+
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
252+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/config.h
253+
)
254+
endif ()
246255
install (FILES ${CMAKE_BINARY_DIR}/f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
247256

248257
if(NOT NO_CBLAS)
249258
message (STATUS "Generating cblas.h in ${CMAKE_INSTALL_INCLUDEDIR}")
259+
if(NOT MSVC)
250260
ADD_CUSTOM_TARGET(gencblas
251-
COMMAND sed 's/common/openblas_config/g' ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h > "${CMAKE_BINARY_DIR}/cblas.h"
261+
COMMAND ${SED} 's/common/openblas_config/g' ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h > "${CMAKE_BINARY_DIR}/cblas.h"
252262
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h
253263
)
264+
else ()
265+
ADD_CUSTOM_TARGET(gencblas
266+
COMMAND ${SED} "s/common/openblas_config/g" ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h > "${CMAKE_BINARY_DIR}/cblas.h"
267+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cblas.h
268+
)
269+
endif ()
254270
add_dependencies( ${OpenBLAS_LIBNAME} gencblas)
255271
install (FILES ${CMAKE_BINARY_DIR}/cblas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
256272
endif()
@@ -277,3 +293,15 @@ if(PKG_CONFIG_FOUND)
277293
configure_file(${PROJECT_SOURCE_DIR}/cmake/openblas.pc.in ${PROJECT_BINARY_DIR}/openblas.pc @ONLY)
278294
install (FILES ${PROJECT_BINARY_DIR}/openblas.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/)
279295
endif()
296+
297+
# build dependencies graph
298+
# add_dependencies(genconfig gen_config_h genf77blas gencblas)
299+
add_dependencies(genconfig genf77blas gencblas)
300+
add_dependencies(interface genconfig)
301+
add_dependencies(kernel genconfig)
302+
add_dependencies(driver_level2 genconfig)
303+
add_dependencies(driver_level3 genconfig)
304+
add_dependencies(driver_others genconfig)
305+
add_dependencies(${OpenBLAS_LIBNAME} kernel driver_level2 driver_level3 driver_others interface)
306+
add_dependencies(openblas_utest ${OpenBLAS_LIBNAME})
307+

Diff for: cmake/prebuild.cmake

+26-1
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 ()

Diff for: cmake/system.cmake

+2
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

Diff for: driver/others/memory.c

+20-2
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))

Diff for: gen_config_h.c

+1-1
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");

Diff for: utest/CMakeLists.txt

+1-1
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)