Skip to content

Commit a70b768

Browse files
MSVC Extention
1 parent efbc904 commit a70b768

1 file changed

Lines changed: 116 additions & 39 deletions

File tree

CMakeLists.txt

Lines changed: 116 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ set(INSTALL_DIR "${CMAKE_BINARY_DIR}/third_party_install")
1313
message(STATUS "Detected CXX Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
1414

1515
# Compiler-specific CXX_FLAGS and linker flags
16+
1617
# Compiler ID = AppleClang
1718
if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
1819
set(CMAKE_CXX_FLAGS "-O3 -Xclang -fopenmp -DARMA_DONT_USE_WRAPPER -DARMA_USE_SUPERLU")
1920
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/opt/libomp/lib -L/opt/homebrew/opt/libomp/lib -lomp")
2021
message(STATUS "Using AppleClang-specific flags.")
2122
include_directories("/usr/local/opt/libomp/include" "/opt/homebrew/opt/libomp/include")
23+
2224
# Compiler ID = IntelLLVM
2325
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
2426
set(CMAKE_CXX_FLAGS "-O3 -qopenmp -DARMA_DONT_USE_WRAPPER -DARMA_USE_SUPERLU -diag-disable=10430")
@@ -35,11 +37,13 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
3537
set(LAPACK_LIBRARIES "${MKLROOT}/lib/intel64/libmkl_rt.so" CACHE STRING "LAPACK library path for MKL")
3638
set(ARMA_USE_WRAPPER OFF CACHE BOOL "Disable Armadillo wrapper to directly use MKL")
3739
message(STATUS "Using MKL from: ${MKLROOT}")
38-
# Compiler ID = MSVC
40+
41+
# Compiler ID = MSVC
3942
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
4043
message(STATUS "Detected MSVC Compiler")
4144
# Set MSVC flags
42-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /openmp /DARMADILLO_DONT_USE_WRAPPER /DARMADILLO_USE_SUPERLU")
45+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /openmp /DARMADILLO_DONT_USE_WRAPPER /DARMADILLO_USE_SUPERLU ")
46+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL" CACHE STRING "" FORCE)
4347
message(STATUS "Using MSVC compiler flags: ${CMAKE_CXX_FLAGS}")
4448

4549
# Compiler ID = Non-Clang
@@ -78,29 +82,79 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
7882

7983
message(STATUS "Downloading and extracting OpenBLAS...")
8084
file(DOWNLOAD ${OPENBLAS_TARBALL_URL} ${BUILD_DIR}/OpenBLAS-${OPENBLAS_VERSION}.tar.gz SHOW_PROGRESS)
81-
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf OpenBLAS-${OPENBLAS_VERSION}.tar.gz WORKING_DIRECTORY ${BUILD_DIR})
85+
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf OpenBLAS-${OPENBLAS_VERSION}.tar.gz
86+
WORKING_DIRECTORY ${BUILD_DIR}
87+
RESULT_VARIABLE extract_result
88+
)
89+
90+
if(NOT extract_result EQUAL 0)
91+
message(FATAL_ERROR "Failed to extract OpenBLAS: ${extract_result}")
92+
endif()
8293

8394
file(MAKE_DIRECTORY ${OPENBLAS_BUILD_DIR})
8495
file(MAKE_DIRECTORY ${OPENBLAS_INSTALL_DIR})
8596

8697
message(STATUS "Building OpenBLAS...")
87-
execute_process(COMMAND ${CMAKE_COMMAND} ${OPENBLAS_SRC_DIR}
88-
-DCMAKE_INSTALL_PREFIX=${OPENBLAS_INSTALL_DIR}
89-
-DBUILD_SHARED_LIBS=OFF
90-
-DCMAKE_BUILD_TYPE=Release
91-
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR})
98+
execute_process(
99+
COMMAND ${CMAKE_COMMAND} ${OPENBLAS_SRC_DIR}
100+
-DCMAKE_INSTALL_PREFIX=${OPENBLAS_INSTALL_DIR}
101+
-DBUILD_SHARED_LIBS=OFF
102+
-DCMAKE_BUILD_TYPE=Release
103+
-DNO_FORTRAN=ON # Disable Fortran for better compatibility
104+
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR}
105+
RESULT_VARIABLE config_result
106+
)
107+
108+
if(NOT config_result EQUAL 0)
109+
message(FATAL_ERROR "OpenBLAS configuration failed: ${config_result}")
110+
endif()
92111

93-
execute_process(COMMAND ${CMAKE_COMMAND} --build . --config Release
94-
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR})
112+
execute_process(
113+
COMMAND ${CMAKE_COMMAND} --build . --config Release
114+
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR}
115+
RESULT_VARIABLE build_result
116+
)
95117

96-
execute_process(COMMAND ${CMAKE_COMMAND} --install . --config Release
97-
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR})
118+
if(NOT build_result EQUAL 0)
119+
message(FATAL_ERROR "OpenBLAS build failed: ${build_result}")
120+
endif()
121+
122+
execute_process(
123+
COMMAND ${CMAKE_COMMAND} --install . --config Release
124+
WORKING_DIRECTORY ${OPENBLAS_BUILD_DIR}
125+
RESULT_VARIABLE install_result
126+
)
127+
128+
if(NOT install_result EQUAL 0)
129+
message(FATAL_ERROR "OpenBLAS installation failed: ${install_result}")
130+
endif()
131+
132+
# Verify the library was created
133+
set(OpenBLAS_LIB "${OPENBLAS_INSTALL_DIR}/lib/openblas.lib")
134+
if(NOT EXISTS "${OpenBLAS_LIB}")
135+
# Check for alternative library names
136+
file(GLOB possible_libs "${OPENBLAS_INSTALL_DIR}/lib/*blas*.lib")
137+
if(possible_libs)
138+
list(GET possible_libs 0 OpenBLAS_LIB)
139+
message(STATUS "Using alternative OpenBLAS library: ${OpenBLAS_LIB}")
140+
else()
141+
message(FATAL_ERROR "OpenBLAS library not found in: ${OPENBLAS_INSTALL_DIR}/lib/")
142+
endif()
143+
endif()
144+
145+
# Set variables for other parts of the build
146+
set(OpenBLAS_LIBRARIES ${OpenBLAS_LIB} CACHE FILEPATH "OpenBLAS library" FORCE)
147+
set(OPENBLAS_DIR ${OPENBLAS_INSTALL_DIR} CACHE PATH "OpenBLAS installation directory" FORCE)
148+
set(OpenBLAS_INCLUDE_DIR "${OPENBLAS_INSTALL_DIR}/include" CACHE PATH "OpenBLAS include directory" FORCE)
149+
150+
message(STATUS "OpenBLAS successfully installed to: ${OPENBLAS_INSTALL_DIR}")
151+
message(STATUS "OpenBLAS library: ${OpenBLAS_LIB}")
152+
message(STATUS "OpenBLAS includes: ${OpenBLAS_INCLUDE_DIR}")
153+
154+
# Add to search paths
155+
include_directories(${OpenBLAS_INCLUDE_DIR})
156+
link_directories(${OPENBLAS_INSTALL_DIR}/lib)
98157

99-
# Set OpenBLAS variables
100-
set(OpenBLAS_LIBRARIES "${OPENBLAS_INSTALL_DIR}/lib/openblas.lib" CACHE FILEPATH "OpenBLAS library")
101-
set(OPENBLAS_DIR "${OPENBLAS_INSTALL_DIR}")
102-
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${OPENBLAS_DIR}/lib")
103-
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${OPENBLAS_DIR}/include")
104158

105159
endif()
106160
# Required libraries and link settings
@@ -210,32 +264,50 @@ endif()
210264

211265
#Configuring Armadillo for MSVC
212266
if(WIN32)
213-
message(STATUS "Configuring Armadillo build for Windows using MSVC...")
214-
215-
include_directories(${OPENBLAS_DIR}/include ${EIGEN_SRC_DIR})
216-
link_directories(${OPENBLAS_DIR}/lib )
217267

218-
# Define library files
219-
set(OpenBLAS_LIB "${OPENBLAS_DIR}/lib/openblas.lib")
220-
#set(LAPACK_LIB "${LAPACK_DIR}/lib/lapack.lib")
268+
message(STATUS "OpenBLAS_LIB = ${OpenBLAS_LIB}")
269+
message(STATUS "SUPERLU_INSTALL_DIR = ${SUPERLU_INSTALL_DIR}")
270+
message(STATUS "ARMADILLO_BUILD_DIR = ${ARMADILLO_BUILD_DIR}")
221271

272+
# Print directory contents for debugging
273+
execute_process(COMMAND cmd /c dir "${OPENBLAS_INSTALL_DIR}/lib"
274+
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
275+
OUTPUT_VARIABLE DIR_OUTPUT
276+
)
277+
message(STATUS "OpenBLAS lib contents:\n${DIR_OUTPUT}")
278+
message(STATUS "Configuring Armadillo build for Windows using MSVC...")
279+
280+
# Verify OpenBLAS installation
281+
foreach(DEP IN ITEMS OpenBLAS_LIB SUPERLU_INSTALL_DIR)
282+
if(NOT EXISTS "${${DEP}}")
283+
message(FATAL_ERROR "Dependency not found: ${DEP} = ${${DEP}}")
284+
endif()
285+
endforeach()
286+
# Additional MSVC flags
287+
add_definitions(-D_USE_MATH_DEFINES -DNOMINMAX)
288+
222289
execute_process(COMMAND ${CMAKE_COMMAND}
223-
-DCMAKE_INSTALL_PREFIX=${ARMADILLO_INSTALL_DIR}
224-
-DSuperLU_INCLUDE_DIR=${SUPERLU_INSTALL_DIR}/include
225-
-DSuperLU_LIBRARY=${SUPERLU_INSTALL_DIR}/lib/superlu.lib
226-
-DARMA_USE_WRAPPER=OFF
227-
-DARMA_USE_LAPACK=OFF
228-
-DARMA_USE_BLAS=ON
229-
-DBLAS_LIBRARIES=${OpenBLAS_LIB}
230-
231-
.
232-
WORKING_DIRECTORY ${ARMADILLO_BUILD_DIR})
290+
-DCMAKE_INSTALL_PREFIX:PATH=${ARMADILLO_INSTALL_DIR}
291+
-DSuperLU_INCLUDE_DIR:PATH=${SUPERLU_INSTALL_DIR}/include
292+
-DSuperLU_LIBRARY:FILEPATH=${SUPERLU_INSTALL_DIR}/lib/superlu.lib
293+
-DOpenBLAS_FOUND:BOOL=TRUE
294+
-DOPENBLAS_PROVIDES_LAPACK:BOOL=ON
295+
-DBLAS_LIBRARIES:FILEPATH=${OpenBLAS_LIB}
296+
-DLAPACK_LIBRARIES:FILEPATH=${OpenBLAS_LIB}
297+
-DARMA_USE_BLAS:BOOL=ON
298+
-DARMA_USE_LAPACK:BOOL=ON
299+
-DARMA_USE_SUPERLU:BOOL=ON
300+
-DARMA_USE_WRAPPER:BOOL=OFF
301+
-DBUILD_SHARED_LIBS:BOOL=OFF
302+
.
303+
WORKING_DIRECTORY ${ARMADILLO_BUILD_DIR}
304+
)
305+
233306
execute_process(COMMAND ${CMAKE_COMMAND} --build . --config Release WORKING_DIRECTORY ${ARMADILLO_BUILD_DIR})
234307
execute_process(COMMAND ${CMAKE_COMMAND} --install . --config Release WORKING_DIRECTORY ${ARMADILLO_BUILD_DIR})
235308

236309
message(STATUS "Armadillo build and installation complete on Windows.")
237310
endif()
238-
239311
#Configuring Armadillo for other compilers
240312
if (NOT WIN32)
241313
execute_process(COMMAND ${CMAKE_COMMAND}
@@ -274,14 +346,19 @@ endif()
274346

275347
if(WIN32)
276348
set(SUPERLU_LIB ${SUPERLU_INSTALL_DIR}/lib/superlu.lib)
349+
set(ARMADILLO_LIB ${ARMADILLO_INSTALL_DIR}/lib/armadillo.lib)
350+
set(OPENBLAS_LIB ${OPENBLAS_INSTALL_DIR}/lib/openblas.lib)
277351
else()
278352
set(SUPERLU_LIB ${SUPERLU_INSTALL_DIR}/lib/libsuperlu.a)
353+
set(ARMADILLO_LIB ${ARMADILLO_INSTALL_DIR}/lib/libarmadillo.a)
354+
set(OPENBLAS_LIB ${OPENBLAS_INSTALL_DIR}/lib/libopenblas.a)
279355
endif()
280356

281-
set(LINK_LIBS ${ARMADILLO_LIBRARIES}
282-
${OpenBLAS_LIBRARIES}
283-
${SUPERLU_LIB}
284-
)
357+
set(LINK_LIBS
358+
${ARMADILLO_LIB}
359+
${SUPERLU_LIB}
360+
${OPENBLAS_LIB}
361+
)
285362

286363
# Add subdirectories
287364
add_subdirectory(src/cpp)

0 commit comments

Comments
 (0)