| 1 | include(FetchContent) |
| 2 | |
| 3 | if(DEFINED ENV{TML_FA4_SRC_DIR}) |
| 4 | set(TML_FA4_SRC_DIR $ENV{TML_FA4_SRC_DIR}) |
| 5 | endif() |
| 6 | |
| 7 | if(TML_FA4_SRC_DIR) |
| 8 | FetchContent_Declare( |
| 9 | tml_fa4 |
| 10 | SOURCE_DIR ${TML_FA4_SRC_DIR} |
| 11 | CONFIGURE_COMMAND "" |
| 12 | BUILD_COMMAND "") |
| 13 | else() |
| 14 | FetchContent_Declare( |
| 15 | tml_fa4 |
| 16 | GIT_REPOSITORY https://github.com/vllm-project/tml-fa4.git |
| 17 | GIT_TAG 75765e76a9c2c012c1f6ecd64577eb646eb4d303 |
| 18 | GIT_PROGRESS TRUE |
| 19 | CONFIGURE_COMMAND "" |
| 20 | BUILD_COMMAND "") |
| 21 | endif() |
| 22 | |
| 23 | FetchContent_GetProperties(tml_fa4) |
| 24 | if(NOT tml_fa4_POPULATED) |
| 25 | FetchContent_Populate(tml_fa4) |
| 26 | endif() |
| 27 | message(STATUS "tml-fa4 is available at ${tml_fa4_SOURCE_DIR}") |
| 28 | |
| 29 | add_custom_target(tml_fa4) |
| 30 | |
| 31 | # Install into a private namespace so this implementation cannot shadow the |
| 32 | # flash_attn package used by vLLM's standard attention backends. |
| 33 | install(CODE " |
| 34 | file(GLOB_RECURSE TML_FA4_PY_FILES |
| 35 | \"${tml_fa4_SOURCE_DIR}/flash_attn/cute/*.py\") |
| 36 | foreach(SRC_FILE \${TML_FA4_PY_FILES}) |
| 37 | file(RELATIVE_PATH REL_PATH |
| 38 | \"${tml_fa4_SOURCE_DIR}/flash_attn/cute\" \${SRC_FILE}) |
| 39 | set(DST_FILE |
| 40 | \"\${CMAKE_INSTALL_PREFIX}/vllm/third_party/tml_fa4/\${REL_PATH}\") |
| 41 | get_filename_component(DST_DIR \${DST_FILE} DIRECTORY) |
| 42 | file(MAKE_DIRECTORY \${DST_DIR}) |
| 43 | file(READ \${SRC_FILE} FILE_CONTENTS) |
| 44 | string(REPLACE |
| 45 | \"flash_attn.cute\" |
| 46 | \"vllm.third_party.tml_fa4\" |
| 47 | FILE_CONTENTS \"\${FILE_CONTENTS}\") |
| 48 | file(WRITE \${DST_FILE} \"\${FILE_CONTENTS}\") |
| 49 | endforeach() |
| 50 | " COMPONENT tml_fa4) |