В настоящее время я работаю над личным проектом, который включает разветвление оконного менеджера (https://swaywm.org/) из тега v1.3. Обратите внимание, что кодовая база не была изменена ни в каком другом случае, кроме добавления файлов CMakeLists.txt. Для работы в CLion я решил сначала перенести систему сборки на CMake, так что это моя единственная цель в настоящее время. В настоящее время проект прекрасно работает с мезонами. В настоящее время у меня возникают проблемы со сборкой, из-за которых возникают следующие ошибки, и я хотел бы знать, что вызывает это?
CLion работает следующим образом:
/home/user/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/193.6911.21/bin/cmake/linux/bin/cmake --build /home/user/sway-fork/cmake-build-debug --target Project -- -j 8
Вот мой текущий репозиторий разветвлений, чтобы попытаться построить его самостоятельно: https://gitlab.com/cellsheet/sway-fork
Обратите внимание, что сейчас есть жестко закодированный путь к файлу /usr/include/wlr/config.h
в основном CMakeLists.txt
которые могут нуждаться в корректировке. Я построил этот проект, используя Arch Linux для справки.
Версия CMake: 3.15.3
Журнал сборки:
[ 20%] Building C object sway/CMakeFiles/Project.dir/commands.c.o
cd /home/user/project/cmake-build-debug/sway && /usr/bin/cc -I/home/user/project/sway/../include -I/home/user/project/cmake-build-debug/protocols -I/usr/include/json-c -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/lib/libffi-3.2.1/include -I/usr/include/harfbuzz -I/usr/include/fribidi -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libevdev-1.0 -I/usr/include/libdrm -g -DWLR_USE_UNSTABLE -Wno-unused-parameter -Wno-unused-result -Wno-missing-braces -Wvla -DSWAY_VERSION=0.0 -DSYSCONFDIR=\"/usr/local/etc\" -fmacro-prefix-map=../= -std=gnu11 -o CMakeFiles/Project.dir/commands.c.o -c /home/user/project/sway/commands.c
In file included from /usr/include/wlr/types/wlr_layer_shell_v1.h:16,
from /home/user/project/sway/../include/sway/server.h:10,
from /home/user/project/sway/../include/sway/input/input-manager.h:7,
from /home/user/project/sway/../include/sway/tree/view.h:9,
from /home/user/project/sway/../include/sway/criteria.h:7,
from /home/user/project/sway/commands.c:11:
/home/user/project/cmake-build-debug/protocols/wlr-layer-shell-unstable-v1-protocol.h:47:35: error: redefinition of ‘wlr_layer_shell_v1_unstable_v1_types’
47 | static const struct wl_interface *wlr_layer_shell_v1_unstable_v1_types[] = {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/user/project/sway/../include/sway/config.h:15,
from /home/user/project/sway/../include/sway/commands.h:5,
from /home/user/project/sway/commands.c:9:
/home/user/project/cmake-build-debug/protocols/wlr-layer-shell-unstable-v1-protocol.h:47:35: note: previous definition of ‘wlr_layer_shell_v1_unstable_v1_types’ was here
47 | static const struct wl_interface *wlr_layer_shell_v1_unstable_v1_types[] = {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...
In file included from /home/user/project/sway/../include/sway/server.h:10,
from /home/user/project/sway/../include/sway/input/input-manager.h:7,
from /home/user/project/sway/../include/sway/tree/view.h:9,
from /home/user/project/sway/../include/sway/criteria.h:7,
from /home/user/project/sway/commands.c:11:
/usr/include/wlr/types/wlr_layer_shell_v1.h:56:33: error: field ‘layer’ has incomplete type
56 | enum zwlr_layer_shell_v1_layer layer;
| ^~~~~
In file included from /home/user/project/sway/../include/sway/server.h:15,
from /home/user/project/sway/../include/sway/input/input-manager.h:7,
from /home/user/project/sway/../include/sway/tree/view.h:9,
from /home/user/project/sway/../include/sway/criteria.h:7,
from /home/user/project/sway/commands.c:11:
/usr/include/wlr/types/wlr_xdg_shell.h:54:29: error: field ‘anchor’ has incomplete type
54 | enum xdg_positioner_anchor anchor;
| ^~~~~~
/usr/include/wlr/types/wlr_xdg_shell.h:55:30: error: field ‘gravity’ has incomplete type
55 | enum xdg_positioner_gravity gravity;
| ^~~~~~~
/usr/include/wlr/types/wlr_xdg_shell.h:56:44: error: field ‘constraint_adjustment’ has incomplete type
56 | enum xdg_positioner_constraint_adjustment constraint_adjustment;
| ^~~~~~~~~~~~~~~~~~~~~
Декларация для zwlr_layer_shell_v1_layer
на самом деле в `wlr-layer-shell-unstable-v1-protocol.h: 139:
enum zwlr_layer_shell_v1_layer {
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND = 0,
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM = 1,
ZWLR_LAYER_SHELL_V1_LAYER_TOP = 2,
ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY = 3,
};
Это заставляет меня думать, что существует проблема либо с линковкой, либо с форвардным объявлением, которое, я почти уверен, является проблема связывания и эти ошибки связаны, потому что он не может правильно включить wlr-layer-shell-unstable-v1-protocol.h
(сгенерированный программой wayland-scanner
через командную строку), чтобы найти определение, ведущее к error: field ‘layer’ has incomplete type
(а также другие неполные ошибки типа, определенные в xdg-shell-protocol.h
, взято из основного файла wayland-protocol xdg-shell.xml
).
В настоящее время у меня только небольшой опыт работы с семейством языков C / C ++, поэтому я не уверен, что он неправильно настроен. Единственное оправдание, которое я могу придумать для повторной декларации, включая wlr-layer-shell-unstable-v1-protocol.h
несколько раз, прямо и косвенно. wlr-layer-shell-unstable-v1-protocol.h
включено непосредственно из includes/sway/config.h:15
, где CLion также жалуется на это (из косвенных включений), а также из нескольких файлов, содержащих #include <wlr/types/wlr_layer_shell_v1.h>
, который также включает (косвенно) wlr-layer-shell-unstable-v1-protocol.h
, и, насколько мне известно, использование включает охранников (но может и не совсем так, не совсем уверен, что здесь).
Я не уверен, как система сборки мезонов позаботится об этом, пока CMake будет жаловаться на эту проблему.
Мой проект в настоящее время имеет ту же структуру папок, что и текущий проект, в данный момент расположенный в https://github.com/swaywm/sway/ с CMakeLists в каталоге root и в каждом подкаталоге.
Файлы
protocol / wlr-layer-shell-unstable-v1-protocol.h были созданы с wayland-scanner
из https://github.com/swaywm/sway/blob/master/protocols/wlr-layer-shell-unstable-v1.xml примерно так:
/usr/bin/wayland-scanner private-code /home/user/project/protocols/wlr-layer-shell-unstable-v1.xml wlr-layer-shell-unstable-v1-protocol.h
wlr / types / wlr_layer_shell_v1.h: 56 является частью проекта wlroots, расположенного по адресу https://github.com/swaywm/wlroots/blob/master/include/wlr/types/wlr_layer_shell_v1.h#L56
То же самое для wlr / types / wlr_xdg_shell.h : 54: https://github.com/swaywm/wlroots/blob/master/include/wlr/types/wlr_xdg_shell.h#L54
include / sway / config.h: https://github.com/swaywm/sway/blob/master/include/sway/config.h#L15
Конфигурации CMake
Я впервые изучаю CMake, поэтому я открыт для любых предложений. У меня есть CMakeLists.txt
в каталоге верхнего уровня для добавления подкаталогов:
CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
PROJECT(
Project
LANGUAGES C
VERSION 0.0
)
...
ADD_SUBDIRECTORY(protocols)
ADD_SUBDIRECTORY(include)
ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(sway)
protocol / CMakeLists.txt:
FIND_PACKAGE(PkgConfig REQUIRED)
PKG_GET_VARIABLE(WL_PROTOCOL_DIR wayland-protocols pkgdatadir)
# Find and set WAYLAND_SCANNER
...
SET(PROTOCOLS
${WL_PROTOCOL_DIR}/stable/xdg-shell/xdg-shell.xml
${WL_PROTOCOL_DIR}/unstable/xdg-output/xdg-output-unstable-v1.xml
${WL_PROTOCOL_DIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml
${WL_PROTOCOL_DIR}/unstable/tablet/tablet-unstable-v2.xml
${CMAKE_CURRENT_SOURCE_DIR}/wlr-layer-shell-unstable-v1.xml
${CMAKE_CURRENT_SOURCE_DIR}/idle.xml
${CMAKE_CURRENT_SOURCE_DIR}/wlr-input-inhibitor-unstable-v1.xml
)
SET(CLIENT_PROTOCOLS
${WL_PROTOCOL_DIR}/stable/xdg-shell/xdg-shell.xml
${WL_PROTOCOL_DIR}/unstable/xdg-output/xdg-output-unstable-v1.xml
${CMAKE_CURRENT_SOURCE_DIR}/wlr-layer-shell-unstable-v1.xml
${CMAKE_CURRENT_SOURCE_DIR}/wlr-input-inhibitor-unstable-v1.xml
)
FOREACH(XML IN LISTS PROTOCOLS)
STRING(REGEX REPLACE [^a-zA-Z0-9] _ NAME_C ${XML}_server_c)
STRING(REGEX REPLACE [^a-zA-Z0-9] _ NAME_H ${XML}_server_h)
GET_FILENAME_COMPONENT(OUTPUT ${XML} NAME_WE)
LIST(APPEND WL_PROTOS_SRC ${CMAKE_BINARY_DIR}/protocols/${OUTPUT}-protocol.c)
ADD_CUSTOM_COMMAND(
COMMAND ${WAYLAND_SCANNER} private-code ${XML} ${OUTPUT}-protocol.c
OUTPUT ${OUTPUT}-protocol.c
DEPENDS ${XML}
)
LIST(APPEND WL_PROTOS_HEADERS ${CMAKE_BINARY_DIR}/protocols/${OUTPUT}-protocol.h)
ADD_CUSTOM_COMMAND(
COMMAND ${WAYLAND_SCANNER} private-code ${XML} ${OUTPUT}-protocol.h
OUTPUT ${OUTPUT}-protocol.h
DEPENDS ${XML}
)
ENDFOREACH()
FOREACH(XML IN LISTS CLIENT_PROTOCOLS)
STRING(REGEX REPLACE [^a-zA-Z0-9] _ NAME_H ${XML}_client_h)
GET_FILENAME_COMPONENT(OUTPUT ${XML} NAME_WE)
LIST(APPEND WL_PROTOS_HEADERS ${CMAKE_BINARY_DIR}/protocols/${OUTPUT}-client-protocol.h)
ADD_CUSTOM_COMMAND(
COMMAND ${WAYLAND_SCANNER} private-code ${XML} ${OUTPUT}-client-protocol.h
OUTPUT ${OUTPUT}-client-protocol.h
DEPENDS ${XML}
)
ENDFOREACH()
ADD_LIBRARY(LIB_CLIENT_PROTOS STATIC ${WL_PROTOS_SRC} ${WL_PROTOS_HEADERS})
TARGET_COMPILE_OPTIONS(LIB_CLIENT_PROTOS PRIVATE ${WAYLAND_CLIENT_CFLAGS})
ADD_LIBRARY(CLIENT_PROTOS ${WL_PROTOS_HEADERS})
SET_TARGET_PROPERTIES(CLIENT_PROTOS PROPERTIES LINKER_LANGUAGE C)
TARGET_LINK_LIBRARIES(CLIENT_PROTOS LIB_CLIENT_PROTOS)
ADD_LIBRARY(LIB_SERVER_PROTOS STATIC ${WL_PROTOS_SRC} ${WL_PROTOS_HEADERS})
TARGET_COMPILE_OPTIONS(LIB_SERVER_PROTOS PRIVATE ${WAYLAND_SERVER_CFLAGS})
ADD_LIBRARY(SERVER_PROTOS ${WL_PROTOS_HEADERS})
SET_TARGET_PROPERTIES(SERVER_PROTOS PROPERTIES LINKER_LANGUAGE C)
TARGET_LINK_LIBRARIES(SERVER_PROTOS LIB_SERVER_PROTOS)
sway / CMakeLists.txt:
#Set SOURCES to list of c files
...
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES})
SET_TARGET_PROPERTIES(
${PROJECT_NAME} PROPERTIES
C_STANDARD 11
NO_SYSTEM_FROM_IMPORTED ON
)
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ../include)
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}/protocols)
IF(HAVE_XWAYLAND)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC PkgConfig::XCB)
ENDIF()
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE SERVER_PROTOS)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE SWAY_COMMON)
...