Портирование систем сборки - ошибка компоновки: переопределение, поле имеет неполный тип - PullRequest
1 голос
/ 22 марта 2020

В настоящее время я работаю над личным проектом, который включает разветвление оконного менеджера (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)
...
...