@@ -13,12 +13,14 @@ set(INSTALL_DIR "${CMAKE_BINARY_DIR}/third_party_install")
1313message (STATUS "Detected CXX Compiler ID: ${CMAKE_CXX_COMPILER_ID} " )
1414
1515# Compiler-specific CXX_FLAGS and linker flags
16+
1617# Compiler ID = AppleClang
1718if (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
2325elseif (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
3942elseif (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
105159endif ()
106160# Required libraries and link settings
@@ -210,32 +264,50 @@ endif()
210264
211265 #Configuring Armadillo for MSVC
212266if (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." )
237310endif ()
238-
239311#Configuring Armadillo for other compilers
240312if (NOT WIN32 )
241313 execute_process (COMMAND ${CMAKE_COMMAND}
@@ -274,14 +346,19 @@ endif()
274346
275347if (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)
277351else ()
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)
279355endif ()
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
287364add_subdirectory (src/cpp )
0 commit comments