Cmake 来源不';目标尚未存在,具体取决于使用add_custom_命令生成的源的自定义目标
我正在尝试将介子项目移植到CMake。我的主CMake文件中有以下子目录:Cmake 来源不';目标尚未存在,具体取决于使用add_custom_命令生成的源的自定义目标,cmake,add-custom-command,Cmake,Add Custom Command,我正在尝试将介子项目移植到CMake。我的主CMake文件中有以下子目录: add_subdirectory(protos) add_subdirectory(qtlayershell) add_subdirectory(demo) 以及protos/CMakeLists.txt中的以下内容: set(PROTOCOLS ${WAYLAND_PROTOCOL_DIR}/stable/xdg-shell/xdg-shell.xml wlr-layer-shell-unstable
add_subdirectory(protos)
add_subdirectory(qtlayershell)
add_subdirectory(demo)
以及protos/CMakeLists.txt
中的以下内容:
set(PROTOCOLS
${WAYLAND_PROTOCOL_DIR}/stable/xdg-shell/xdg-shell.xml
wlr-layer-shell-unstable-v1.xml'
)
foreach(XML ${PROTOCOLS})
get_filename_component(BASENAME ${XML} NAME_WE)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/wayland-${BASENAME}-protocol.c
COMMAND wayland-scanner private-code ${XML} @OUTPUT@
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/wayland-${BASENAME}-protocol.h
COMMAND wayland-scanner client-header ${XML} @OUTPUT@
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/qwayland-${BASENAME}.h
COMMAND qtwaylandscanner client-header ${XML} @OUTPUT@
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/${BASENAME}-protocol.cpp
COMMAND qtwaylandscanner client-code ${XML} @OUTPUT@
)
list(APPEND PROTOCOL_SRC
${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/wayland-${BASENAME}-protocol.c
${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/${BASENAME}-protocol.cpp
)
list(APPEND PROTOCOL_HEADERS
${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/qwayland-${BASENAME}.h
${CMAKE_CURRENT_BINARY_DIR}/wayland-protos/wayland-${BASENAME}-protocol.h
)
endforeach()
set(WAYLAND_PROTOCOL_SRC ${PROTOCOL_SRC} PARENT_SCOPE)
set(WAYLAND_PROTOCOL_HEADERS ${PROTOCOL_HEADERS} PARENT_SCOPE)
add_custom_target(wayland_protocols DEPENDS ${WAYLAND_PROTOCOL_SRC} ${WAYLAND_PROTOCOL_HEADERS})
在qtlayershell/CMakeLists.txt
中,目标如下:
add_library(qtlayershell SHARED
${QTLAYERSHELL_SRC}
${WAYLAND_PROTOCOL_SRC}
DEPENDS wayland_protocols
)
但是我得到一个错误,somelongbuildpath/protos/waylandprotos/waylandxdgshellprotocol.c
还不存在。以下是全部错误:
Cannot find source file:
/home/noone/KDE/my/build-qtlayershell-Desktop-Debug/protos/wayland-protos/wayland-xdg-shell-protocol.c
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
.hpp .hxx .in .txx
CMake Error at qtlayershell/CMakeLists.txt:9 (add_library):
No SOURCES given to target: qtlayershell
CMake Generate step failed. Build files cannot be regenerated correctly.
CMake process exited with exit code 1.
add_library()
命令不接受dependens
关键字,因此这不是指定目标依赖项的有效方法。尝试改用,以指定qtlayershell
目标取决于wayland\u协议
自定义目标以生成源:
add_library(qtlayershell SHARED
${QTLAYERSHELL_SRC}
${WAYLAND_PROTOCOL_SRC}
)
add_dependencies(qtlayershell wayland_protocols)
此外,
WAYLAND\u协议\u SRC
和WAYLAND\u协议\u头
变量设置为PARENT\u范围
,因此它们不可用于添加自定义\u目标
调用。相反,您可以尝试将这些设置为缓存内部变量,以便它们在所有范围内都可用:
set(WAYLAND_PROTOCOL_SRC ${PROTOCOL_SRC} CACHE INTERNAL "Wayland sources" FORCE)
set(WAYLAND_PROTOCOL_HEADERS ${PROTOCOL_HEADERS} CACHE INTERNAL "Wayland headers" FORCE)
add_custom_target(wayland_protocols DEPENDS ${WAYLAND_PROTOCOL_SRC} ${WAYLAND_PROTOCOL_HEADERS})
add_library()
命令不接受dependens
关键字,因此这不是指定目标依赖项的有效方法。尝试改用,以指定qtlayershell
目标取决于wayland\u协议
自定义目标以生成源:
add_library(qtlayershell SHARED
${QTLAYERSHELL_SRC}
${WAYLAND_PROTOCOL_SRC}
)
add_dependencies(qtlayershell wayland_protocols)
此外,WAYLAND\u协议\u SRC
和WAYLAND\u协议\u头
变量设置为PARENT\u范围
,因此它们不可用于添加自定义\u目标
调用。相反,您可以尝试将这些设置为缓存内部变量,以便它们在所有范围内都可用:
set(WAYLAND_PROTOCOL_SRC ${PROTOCOL_SRC} CACHE INTERNAL "Wayland sources" FORCE)
set(WAYLAND_PROTOCOL_HEADERS ${PROTOCOL_HEADERS} CACHE INTERNAL "Wayland headers" FORCE)
add_custom_target(wayland_protocols DEPENDS ${WAYLAND_PROTOCOL_SRC} ${WAYLAND_PROTOCOL_HEADERS})
您确定调用时存在wayland\u协议
目标吗?自定义目标是否在add_library
call之前创建?@squareskittles自定义目标是在protos/CMakeLists.txt中创建的,该文件作为子目录添加到qtlayershell/CMakeLists.txt之前。qtlayershell/CMakeLists.txt包含添加库调用OK,是的,只是想确定一下。我认为PARENT\u SCOPE
变量可能是一个问题,也许您可以将这些CACHE
变量替换为变量。@我尝试过这样设置变量进行缓存:-set(WAYLAND\u PROTOCOL\u SRC${PROTOCOL\u SRC}PARENT\u SCOPE缓存路径“”)set(WAYLAND\u PROTOCOL\u HEADERS${PROTOCOL\u HEADERS}PARENT\u SCOPE缓存路径“”)
但仍然会收到相同的错误。也尝试了没有父\u范围但相同error@noone请查看我的回复的更新。我希望这有助于解决这个问题!您确定调用时存在wayland\u协议
目标吗?自定义目标是否在add_library
call之前创建?@squareskittles自定义目标是在protos/CMakeLists.txt中创建的,该文件作为子目录添加到qtlayershell/CMakeLists.txt之前。qtlayershell/CMakeLists.txt包含添加库调用OK,是的,只是想确定一下。我认为PARENT\u SCOPE
变量可能是一个问题,也许您可以将这些CACHE
变量替换为变量。@我尝试过这样设置变量进行缓存:-set(WAYLAND\u PROTOCOL\u SRC${PROTOCOL\u SRC}PARENT\u SCOPE缓存路径“”)set(WAYLAND\u PROTOCOL\u HEADERS${PROTOCOL\u HEADERS}PARENT\u SCOPE缓存路径“”)
但仍然会收到相同的错误。也尝试了没有父\u范围但相同error@noone请查看我的回复的更新。我希望这有助于解决这个问题!