Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 31 additions & 14 deletions cmake/utils/FindMACA.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,31 +31,48 @@
# - MACA_MACAMCC_LIBRARY

macro(find_maca use_maca)
set(__use_maca ${use_maca})
if(IS_DIRECTORY ${__use_maca})
set(__maca_sdk ${__use_maca})
message(STATUS "Custom MACA SDK PATH=" ${__use_maca})
elseif(IS_DIRECTORY $ENV{MACA_PATH})
set(__maca_sdk $ENV{MACA_PATH})
set(MACA_FOUND FALSE)
set(MACA_INCLUDE_DIRS "")
set(MACA_MACAMCC_LIBRARY "")
set(MACA_HCA_LIBRARY "")
set(MACA_FLASHATTN_LIBRARY "")

set(__use_maca "${use_maca}")
if(IS_DIRECTORY "${__use_maca}")
set(__maca_sdk "${__use_maca}")
message(STATUS "Custom MACA SDK PATH=${__use_maca}")
elseif(DEFINED ENV{MACA_PATH} AND IS_DIRECTORY "$ENV{MACA_PATH}")
set(__maca_sdk "$ENV{MACA_PATH}")
elseif(IS_DIRECTORY /opt/maca)
set(__maca_sdk /opt/maca)
else()
set(__maca_sdk "")
endif()

if(__maca_sdk)
set(MACA_INCLUDE_DIRS ${__maca_sdk}/include)
find_library(MACA_MACAMCC_LIBRARY mcruntime ${__maca_sdk}/lib)
find_library(MACA_HCA_LIBRARY mxc-runtime64 ${__maca_sdk}/lib)
find_library(MACA_FLASHATTN_LIBRARY mcFlashAttn ${__maca_sdk}/lib)
set(MACA_INCLUDE_DIRS "${__maca_sdk}/include")
unset(MACA_MACAMCC_LIBRARY CACHE)
unset(MACA_HCA_LIBRARY CACHE)
unset(MACA_FLASHATTN_LIBRARY CACHE)
find_library(MACA_MACAMCC_LIBRARY mcruntime PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)
find_library(MACA_HCA_LIBRARY mxc-runtime64 PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)
find_library(MACA_FLASHATTN_LIBRARY mcFlashAttn PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)
Comment on lines +57 to +59

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

问题分析
在 CMake 中,find_library 会将查找结果缓存到 CMake Cache 中(例如 MACA_MACAMCC_LIBRARY)。当用户在同一个构建目录中切换 MACA SDK 路径(例如从 /opt/maca 切换到另一个自定义路径)时,由于 Cache 中已存在旧的路径,find_library 将不会重新执行搜索,而是直接复用缓存中的旧库路径。这会导致 include 目录与库文件版本不匹配,引发难以排查的编译或运行期错误。

解决方案
在调用 find_library 之前,先使用 unset(... CACHE) 清理对应的缓存变量。由于我们指定了 PATHSNO_DEFAULT_PATH,重新搜索的开销极小,但能极大提高构建的可靠性。

    unset(MACA_MACAMCC_LIBRARY CACHE)
    unset(MACA_HCA_LIBRARY CACHE)
    unset(MACA_FLASHATTN_LIBRARY CACHE)
    find_library(MACA_MACAMCC_LIBRARY mcruntime PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)
    find_library(MACA_HCA_LIBRARY mxc-runtime64 PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)
    find_library(MACA_FLASHATTN_LIBRARY mcFlashAttn PATHS "${__maca_sdk}/lib" NO_DEFAULT_PATH)


if(MACA_MACAMCC_LIBRARY)
if(IS_DIRECTORY "${MACA_INCLUDE_DIRS}" AND MACA_MACAMCC_LIBRARY)
set(MACA_FOUND TRUE)
else()
message(STATUS "MACA SDK candidate did not pass validation: ${__maca_sdk}")
message(STATUS "Expected MACA include directory: ${MACA_INCLUDE_DIRS}")
message(STATUS "Expected MACA runtime library mcruntime under: ${__maca_sdk}/lib")
set(MACA_INCLUDE_DIRS "")
set(MACA_MACAMCC_LIBRARY "")
set(MACA_HCA_LIBRARY "")
set(MACA_FLASHATTN_LIBRARY "")
endif()
endif(__maca_sdk)
if(MACA_FOUND)
message(STATUS "Found MACA_INCLUDE_DIRS=" ${MACA_INCLUDE_DIRS})
message(STATUS "Found MACA_MACAMCC_LIBRARY=" ${MACA_MACAMCC_LIBRARY})
message(STATUS "Found MACA_FLASHATTN_LIBRARY=" ${MACA_FLASHATTN_LIBRARY})
message(STATUS "Found MACA_INCLUDE_DIRS=${MACA_INCLUDE_DIRS}")
message(STATUS "Found MACA_MACAMCC_LIBRARY=${MACA_MACAMCC_LIBRARY}")
message(STATUS "Found MACA_FLASHATTN_LIBRARY=${MACA_FLASHATTN_LIBRARY}")
endif(MACA_FOUND)
endmacro(find_maca)
19 changes: 19 additions & 0 deletions tests/scripts/cmake/test_find_maca_no_stale_state.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
if(NOT TVM_SOURCE_DIR)
get_filename_component(TVM_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)
endif()

include("${TVM_SOURCE_DIR}/cmake/utils/FindMACA.cmake")

set(MACA_FOUND TRUE)
set(MACA_INCLUDE_DIRS "/stale/include")
set(MACA_MACAMCC_LIBRARY "/stale/libmcruntime.so")

find_maca("${CMAKE_CURRENT_LIST_DIR}/does-not-exist")

if(MACA_FOUND)
message(FATAL_ERROR "find_maca must clear stale MACA_FOUND when no SDK is found")
endif()

if(MACA_INCLUDE_DIRS OR MACA_MACAMCC_LIBRARY)
message(FATAL_ERROR "find_maca must clear stale MACA include and library values")
endif()