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
相关产品推荐
相关产品推荐

