You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake调用M4时无法找到tokens.m4文件的解决方法

问题

项目根目录下存在frontend文件夹,其中包含带M4宏的HTML文件(如_index.html)与tokens.m4文件。HTML文件头部的宏引用如下:

<!DOCTYPE html>
<html lang="en">
    <head>
<!--
    include(`tokens.m4')
-->

手动执行命令 m4 _index.html >index.html 时,M4可正常定位tokens.m4并生成输出结果。但在frontend/CMakeLists.txt中使用以下配置通过cmake --build构建时:

add_custom_target(frontend
  COMMAND m4 ${CMAKE_CURRENT_SOURCE_DIR}/_index.html >${CMAKE_BINARY_DIR}/index.html
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_index.html
)

出现错误提示:frontend/_index.html at line 5: include(tokens.m4): No such file or directory,需解决CMake调用M4时无法找到tokens.m4的问题。

解决方案

方法1:指定M4的搜索路径(推荐)

M4默认从当前工作目录搜索包含文件,而CMake执行命令时的工作目录为构建目录(非frontend目录)。可通过M4的-I参数将frontend目录添加到搜索路径中:

add_custom_target(frontend
  COMMAND m4 -I ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/_index.html >${CMAKE_BINARY_DIR}/index.html
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_index.html ${CMAKE_CURRENT_SOURCE_DIR}/tokens.m4
)

同时需将tokens.m4加入DEPENDS列表,确保修改该文件时会触发重新构建。

方法2:切换命令的工作目录

利用CMake的WORKING_DIRECTORY参数,让M4在frontend目录下执行,与手动执行的环境保持一致:

add_custom_target(frontend
  COMMAND m4 _index.html >${CMAKE_BINARY_DIR}/index.html
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_index.html ${CMAKE_CURRENT_SOURCE_DIR}/tokens.m4
)

方法3:修改HTML中的include路径(不推荐)

直接在include宏中写入tokens.m4的绝对路径,但这种方式灵活性较差:

include(`${CMAKE_CURRENT_SOURCE_DIR}/tokens.m4`)

需注意此写法要求M4能识别CMake变量,可能需要额外处理,因此实用性不如前两种方法。

内容的提问来源于stack exchange,提问作者Existn't

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 11:12:32