cmake для встроенного: удалить заголовки Linux POSIX - PullRequest
0 голосов
/ 24 ноября 2018

Итак, я занимаюсь разработкой встроенной библиотеки для ОС RIOT.Поскольку моя библиотека использует Cmake, но RIOT использует простой Makefile, я просто компилирую статическую библиотеку и связываю ее позже с RIOT во время компиляции.Поэтому я скомпилирую библиотеку: я передаю все включаемые файлы в CMAKE_C_FLAGS. Это необходимо, так как моя библиотека использует pthreads и RIOT поддерживает ее.

-DCMAKE_C_FLAGS="-I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/native/include -DNATIVE_INCLUDES -I/home/citrullin/git/riot_libs/boards/native/include/ -I/home/citrullin/git/riot_libs/core/include/ -I/home/citrullin/git/riot_libs/drivers/include/ -I/home/citrullin/git/riot_libs/cpu/native/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/cpu/native/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/native/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include" .

Так что все работает нормально.Но почему-то cmake также пытается включить заголовочные файлы linux для posix.Поскольку он встроен, он не должен этого делать.

Scanning dependencies of target iota_wallet
[ 11%] Building C object CMakeFiles/iota_wallet.dir/src/iota/addresses.c.obj
In file included from /usr/arm-none-eabi/include/sys/types.h:239:0,
                 from /usr/arm-none-eabi/include/stdio.h:61,
                 from /home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src/iota/common.h:4,
                 from /home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/_pthreadtypes.h:154:20: note: previous declaration of 'pthread_mutex_t' was here
 typedef __uint32_t pthread_mutex_t;      /* identify a mutex */

Итак, мой вопрос: как я могу сказать cmake не включать заголовочные файлы linux?

Это текущий CMakeList.txt, который я использую.

/ e Я пробовал то же самое с Makefile.Здесь появляется та же проблема.

make -e CFLAGS="-isystem /usr/arm-none-eabi/include/newlib-nano -I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/bluepill/include -I/home/citrullin/git/riot_libs/boards/common/stm32f103c8/include -I/home/citrullin/git/riot_libs/cpu/stm32f1/include -I/home/citrullin/git/riot_libs/cpu/stm32_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include/vendor -I/home/citrullin/git/riot_libs/sys/libc/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include" lib
arm-none-eabi-gcc -c -o build/addresses.o src/iota/addresses.c -isystem /usr/arm-none-eabi/include/newlib-nano -I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/bluepill/include -I/home/citrullin/git/riot_libs/boards/common/stm32f103c8/include -I/home/citrullin/git/riot_libs/cpu/stm32f1/include -I/home/citrullin/git/riot_libs/cpu/stm32_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include/vendor -I/home/citrullin/git/riot_libs/sys/libc/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include
In file included from /home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread.h:38:0,
                 from src/iota/conversion.h:13,
                 from src/iota/addresses.c:8:
/home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread_threading_attr.h:34:3: error: conflicting types for 'pthread_attr_t'
 } pthread_attr_t;
   ^~~~~~~~~~~~~~
In file included from /usr/arm-none-eabi/include/sys/types.h:239:0,
                 from /usr/arm-none-eabi/include/stdio.h:61,
                 from src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/_pthreadtypes.h:75:3: note: previous declaration of 'pthread_attr_t' was here
 } pthread_attr_t;
   ^~~~~~~~~~~~~~
In file included from /home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread.h:38:0,
                 from src/iota/conversion.h:13,
                 from src/iota/addresses.c:8:
/home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread_threading_attr.h:39:8: error: redefinition of 'struct sched_param'
 struct sched_param {
        ^~~~~~~~~~~
In file included from /usr/arm-none-eabi/include/sys/_pthreadtypes.h:23:0,
                 from /usr/arm-none-eabi/include/sys/types.h:239,
                 from /usr/arm-none-eabi/include/stdio.h:61,
                 from src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/sched.h:48:8: note: originally defined here
 struct sched_param {
        ^~~~~~~~~~~

Есть и другие дублирующие ошибки определения.Похоже, что они все имеют одинаковую природу.

Шаги для воспроизведения:

  1. Клонировать это хранилище (ветвь: iota_new_implementation)

  2. перейдите в папку examples / iota_transaction_node

  3. Выполните make

Версия с Makefile.Commit: 7e1d8884ab135ae64cee02c8c1a447015f4325bc

Версия с CMake.Commit: dbf32e727889afa3efb466cfdc8561e697af48b0

USEPKG += iota-wallet

в Makefile примера ссылается на этот пакет . Этот Makefile используется для создания статической библиотеки.

Cmake Log:

CmakeError.log

CMakeOutput.log

Консольный вывод

Makefile:

Консольный вывод

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Хорошо, прежде всего, убедитесь, что вы добавили в путь набор инструментов gcc (см. wiki )

Затем, опираясь на это репозиторий github и эта связанная страница , вы можете взглянуть на примеры того, кто на самом деле использовал CMake с RIOT (что не относится ни к моему делу, ни, по-видимому, к разработчикам RIOT), он сделал пользовательские файлы для поиска RIOT ицелевые платы, поэтому я думаю, что это должно быть полезно в качестве отправной точки.

Если у вас работает обнаружение RIOT, если проблема с pthread не исчезнет, ​​прежде чем вы вручную отредактируете системный файл, как предложено Фредом, я рассмотрю попыткузаставить обнаружение pthread из CMake с подсказками в сторону RIOT:

find_package (Threads REQUIRED PATHS ${RIOT_ROOT}/sys/posix/pthread/include NO_DEFAULT_PATH)

EDIT переосмысливая вопрос, возможно, мне следует уточнить несколько вещей: я думаю, что наиболее важным является то, что выправильно отформатируйте ваш CMakeLists.txt на основе файла из polymcu repo для правильной настройки кросс-компиляции (особенно настройки CMAKE_SYSTEM_NAME).Как только CMake понимает, что он кросс-компилируется, он не должен использовать POSIX, что должно привести к тому, что часть системы __POSIX_VISIBLE >= 199506 включит оценку в false, что устранит необходимость какого-либо ручного редактирования.Именно поэтому предложенная мною команда find_package является последним средством, на всякий случай, и ее следует использовать , а не сразу.

Приоритетом является правильная настройка вашего CMake,что должно решить проблему самостоятельно.

0 голосов
/ 01 декабря 2018

Проблема не в CMake для встраивания с использованием заголовков POSIX.Это неправильное понимание ошибки.

Я думаю, что путаница происходит из строки Scanning dependencies of target iota_wallet, а затем [ 11%] Building C object CMakeFiles/iota_wallet.dir/src/iota/addresses.c.obj.Это два разных шага, ни один из которых не связан с CMake.CMake ничего не сканирует.Когда CMake генерирует Makefiles, он просто добавляет CMakeLists.txt как часть зависимостей сборки.Это так, обновление CMakeLists.txt будет генерировать новые файлы Makefile при запуске make.При этом он печатает Scanning dependencies....

. Фактическая проблема возникает при компиляции исходного кода с arm-none-eabi.Этот компилятор поставляется с newlib в качестве библиотеки c.По какой-то причине newlib содержит несколько заголовочных файлов для pthreads.Всякий раз, когда вы включаете заголовочный файл, например stdint.h или stdlib.h в исходный код, он включает sys/types.h, который затем включает sys/_pthreadtypes.hЭто противоречит заголовочным файлам pthreads, поставляемым с RIOT.

Вы можете обойти проблему, скомпилировав с -std=c99.

Или вы можете обойти проблему, отредактировав файл /usr/arm-none-eabi/include/sys/_pthreadtypes.h.

Изменить:

#if defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506

Кому:

#if defined(_POSIX_THREADS)

К вашему сведению, примеры Makefile и CMake по-прежнему имеют проблемы, но не имеют никакого отношения к конкретной проблеме.

Подробнее о проблеме newlib см. https://github.com/RIOT-OS/RIOT/issues/10443.

...