Страница 1 из 1
Не собирается Kepka
Добавлено: 28 сен 2019, 11:56
Zeffanyx
Решил я собрать Kepka - клиент телеграма. Все зависимости на месте, но в процессе сборки вылезло такое:
Код: Выделить всё
[ 25%] Building CXX object Telegram/SourceFiles/codegen/style/CMakeFiles/codegen_style.dir/parsed_file.cpp.o
/home/zeffanyx/Sources/kepka/Telegram/SourceFiles/codegen/style/parsed_file.cpp: В функции «uchar codegen::style::{anonymous}::toGray(uchar, uchar, uchar)»:
/home/zeffanyx/Sources/kepka/Telegram/SourceFiles/codegen/style/parsed_file.cpp:84:9: ошибка: «clamp» не является элементом «std»
return std::clamp(int(0.21 * r + 0.72 * g + 0.07 * b), 0, 255);
^
make[2]: *** [Telegram/SourceFiles/codegen/style/CMakeFiles/codegen_style.dir/build.make:115: Telegram/SourceFiles/codegen/style/CMakeFiles/codegen_style.dir/parsed_file.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:1710: Telegram/SourceFiles/codegen/style/CMakeFiles/codegen_style.dir/all] Ошибка 2
make: *** [Makefile:141: all] Ошибка 2
Это может быть из-за старого GCC в Росе? Или дело в другом?
Не собирается Kepka
Добавлено: 30 сен 2019, 13:33
Olej
Zeffanyx писал(а): 28 сен 2019, 11:56
Решил я собрать Kepka - клиент телеграма.
Заинтересовало... Смотрю... (но в Debian 10).
Сборка там Cmake - у вас прошла нормально? как делали?
(Я сейчас смотрю сборку, и с зависимостями под Linux там не так просто - в GIT сами они отрабатывают под Windows, их HELP там - фигня)
Не собирается Kepka
Добавлено: 30 сен 2019, 14:13
Olej
Zeffanyx писал(а): 28 сен 2019, 11:56
Это может быть из-за старого GCC в Росе? Или дело в другом?
Вообще то, они сами в проекте используют компилятор Clang:
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/ThirdParty/GSL$ cat README.md | grep LLVM
* Windows using Clang/LLVM 3.6
* GNU/Linux using Clang/LLVM 3.6
* OS X Sierra 10.12.4 using Apple LLVM version 8.1.0 (Clang-802.0.42)
* OS X High Sierra 10.13.2 (17C88) using Apple LLVM version 9.0.0 (clang-900.0.39.2)
* FreeBSD 10.x with Clang/LLVM 3.6
А Clang может использовать как GNU C++ библиотеку (опция -stdlib=libstdc++), так и свою собственную. и с новой библиотекой C++ (опция -stdlib=libc++). См.:
Clang на эту тему.
Как вариант: можете легко установить Clang, и делать сборку с ним.
Не собирается Kepka
Добавлено: 30 сен 2019, 14:36
Olej
Zeffanyx писал(а): 28 сен 2019, 11:56
Решил я собрать Kepka
Судя по их GIT-репозиторию, проект пишется профессионально очень посредственно: всё в кучу и сшито белыми нитками... Собираются такие проекты
заведомо трудно, там работы и работы...
Но в их же GIT HELP - читайте:
- remove some Qt and custom types in favor of using C++ Standard Library types and classes;
- clang-format;
Не собирается Kepka
Добавлено: 30 сен 2019, 16:27
Olej
VictorR2007 писал(а): 30 сен 2019, 16:07
Я некоторые пакеты собираю с clang, так как с gcc5 они уже не собираются.
Установить и использовать Clang вместо GCC - проблем нет (с Clang и kernel Linux собирают).
Вопрос в том, что применительно к проекту Kepka это не так просто - там всё очень сырое.
Интересующиеся см.:
Clang - там есть и где взять, и как установить, и как использовать...
Не собирается Kepka
Добавлено: 30 сен 2019, 16:58
Olej
Zeffanyx писал(а): 28 сен 2019, 11:56
Решил я собрать Kepka - клиент телеграма.
Вообще то, почти всегда, когда сборка организовывается через Cmake + компиляция делается Clang - можно с сильными основаниями предполагать, что авторы всё это отрабатывают в Windows, а с Cmake/Clang рассчитывают "въехать" в Linux/POSIX за счёт межплатформенной совместимости и минимальными доработками...
Не люблю я такие проекты!
В Kepka README.md читаем:
## Supported systems
* Windows 7 - Windows 10 (**not** RT)
* Mac OS X 10.8 - Mac OS X 10.11
* Mac OS X 10.6 - Mac OS X 10.7 (separate build)
* Ubuntu 12.04 - Ubuntu 16.04
* Fedora 22 - Fedora 24
Это какой год? (относительно Linux)... 2012?
Вот это и есть последнее, на чём они проверялись в Linux.

Не собирается Kepka
Добавлено: 30 сен 2019, 17:10
Zeffanyx
Olej писал(а): 30 сен 2019, 16:27
VictorR2007 писал(а): 30 сен 2019, 16:07
Я некоторые пакеты собираю с clang, так как с gcc5 они уже не собираются.
Установить и использовать Clang вместо GCC - проблем нет (с Clang и kernel Linux собирают).
Вопрос в том, что применительно к проекту Kepka это не так просто - там всё очень сырое.
Clang я уже попробовал, он не помогает, та же ошибка.
Вообще, странно читать про "сырость" программы, которая прекрасно собирается и работает в других дистрибутивах. Например, в Leap 15.1 никаких проблем нет. Там можно собирать и с GCC, и с Clang, можно с automake, а можно с ninja.
Здесь же явно проблема на стороне дистрибутива)
Не собирается Kepka
Добавлено: 30 сен 2019, 17:37
Olej
Zeffanyx писал(а): 30 сен 2019, 17:10
Здесь же явно проблема на стороне дистрибутива
Точно не руки?

Не собирается Kepka
Добавлено: 30 сен 2019, 17:42
Olej
Zeffanyx писал(а): 30 сен 2019, 17:10
которая прекрасно собирается и работает в других дистрибутивах. Например, в Leap 15.1 никаких проблем нет.
А у меня, например, совсем в другом дистрибутиве (Debian 10) ошибка возникает, на компиляции, совсем на другом файле.
И по зависимостям там что написано в их GIT для Cmake - всё херня, всё пришлось восстанавливать методом проб и ошибок.
Не собирается Kepka
Добавлено: 30 сен 2019, 18:06
Zeffanyx
Olej писал(а): 30 сен 2019, 17:37
Zeffanyx писал(а): 30 сен 2019, 17:10
Здесь же явно проблема на стороне дистрибутива
Точно не руки?
Собери кепку в Росе и расскажи как ты это сделал.
Не собирается Kepka
Добавлено: 30 сен 2019, 18:21
Olej
Zeffanyx писал(а): 28 сен 2019, 11:56
Код: Выделить всё
return std::clamp(int(0.21 * r + 0.72 * g + 0.07 * b), 0, 255);
^
std::clamp требует указания совместимости с С++17, что может делаться опциями компилятора, директивами и т.д.
В разных дистрибутивах дефаултные опции компилятора могут различаться.
Нужно указать явно опцию -std=c++1z (-std=c++17 для gcc), а сделать это можно разными способами.
P.S. Вот твой clamp - наслаждайся:
Код: Выделить всё
olej@ACER:/usr/include/boost/algorithm$ ls -l /usr/include/boost/algorithm/clamp.hpp
-rw-r--r-- 1 root root 7669 фев 4 2019 /usr/include/boost/algorithm/clamp.hpp
Не собирается Kepka
Добавлено: 30 сен 2019, 20:09
Olej
Zeffanyx писал(а): 30 сен 2019, 18:06Собери кепку
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/Telegram-Kepka/kepka/build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH="/usr/lib/qt5" ..
-- Found ALSA: /usr/lib/x86_64-linux-gnu/libasound.so (found version "1.1.8")
CMake Warning at Telegram/CMakeLists.txt:17 (message):
No custom API tokens detected. You must grab your own tokens from
https://core.telegram.org/api/obtaining_api_id and export them using
environment options. Will use default for testing purposes.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/build
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/Telegram-Kepka/kepka/build$ make
Scanning dependencies of target tgvoip
[ 0%] Building CXX object Telegram/ThirdParty/libtgvoip/CMakeFiles/tgvoip.dir/BlockingQueue.cpp.o
...
[ 97%] Built target Kepka
Scanning dependencies of target tests_flat_map
[ 97%] Building CXX object Telegram/SourceFiles/base/tests/CMakeFiles/tests_flat_map.dir/flat_map_tests.cpp.o
[ 97%] Linking CXX executable tests_flat_map
[ 97%] Built target tests_flat_map
Scanning dependencies of target tests_flags
[ 98%] Building CXX object Telegram/SourceFiles/base/tests/CMakeFiles/tests_flags.dir/flags_tests.cpp.o
[ 98%] Linking CXX executable tests_flags
[ 98%] Built target tests_flags
Scanning dependencies of target tests_flat_set
[ 98%] Building CXX object Telegram/SourceFiles/base/tests/CMakeFiles/tests_flat_set.dir/flat_set_tests.cpp.o
[100%] Linking CXX executable tests_flat_set
[100%] Built target tests_flat_set
Вот тебе и кепка...

Не собирается Kepka
Добавлено: 30 сен 2019, 21:49
Zeffanyx
Olej писал(а): 30 сен 2019, 18:21
Zeffanyx писал(а): 28 сен 2019, 11:56
Код: Выделить всё
return std::clamp(int(0.21 * r + 0.72 * g + 0.07 * b), 0, 255);
^
std::clamp требует указания совместимости с С++17, что может делаться опциями компилятора, директивами и т.д.
В разных дистрибутивах дефаултные опции компилятора могут различаться.
Нужно указать явно опцию -std=c++1z (-std=c++17 для gcc), а сделать это можно разными способами.
P.S. Вот твой clamp - наслаждайся:
Код: Выделить всё
olej@ACER:/usr/include/boost/algorithm$ ls -l /usr/include/boost/algorithm/clamp.hpp
-rw-r--r-- 1 root root 7669 фев 4 2019 /usr/include/boost/algorithm/clamp.hpp
В CmakeLists.txt есть строка:
Это же и есть требование c++17. Почему его недостаточно?
Не собирается Kepka
Добавлено: 30 сен 2019, 22:21
Olej
Zeffanyx писал(а): 30 сен 2019, 21:49
Это же и есть требование c++17. Почему его недостаточно?
Почему - я не могу знать.
Но при сборке разных каталогов они выключают опцию ...
Вот это место (терминал ещё не закрыл

):
Код: Выделить всё
...
[ 60%] Building CXX object Telegram/CMakeFiles/Kepka.dir/SourceFiles/media/media_audio_capture.cpp.o
/home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_capture.cpp: In member function ‘void Media::Capture::Instance::Inner::onStart()’:
/home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_capture.cpp:216:35: warning: ‘AVOutputFormat* av_oformat_next(const AVOutputFormat*)’ is deprecated [-Wdeprecated-declarations]
while ((fmt = av_oformat_next(fmt))) {
^
In file included from /home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_ffmpeg_loader.h:30,
from /home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_capture.cpp:25:
/usr/include/x86_64-linux-gnu/libavformat/avformat.h:2088:17: note: declared here
AVOutputFormat *av_oformat_next(const AVOutputFormat *f);
^~~~~~~~~~~~~~~
/home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_capture.cpp:216:35: warning: ‘AVOutputFormat* av_oformat_next(const AVOutputFormat*)’ is deprecated [-Wdeprecated-declarations]
while ((fmt = av_oformat_next(fmt))) {
^
In file included from /home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_ffmpeg_loader.h:30,
from /home/olej/2019_WORK/own.WORK/Telegram-Kepka/kepka/Telegram/SourceFiles/media/media_audio_capture.cpp:25:
/usr/include/x86_64-linux-gnu/libavformat/avformat.h:2088:17: note: declared here
AVOutputFormat *av_oformat_next(const AVOutputFormat *f);
^~~~~~~~~~~~~~~
At global scope:
cc1plus: warning: unrecognized command line option ‘-Wno-c++1z-extensions’
[ 60%] Building CXX object Telegram/CMakeFiles/Kepka.dir/SourceFiles/media/media_audio_ffmpeg_loader.cpp.o
...
Может они это делают и не раз.
Не собирается Kepka
Добавлено: 30 сен 2019, 22:51
Zeffanyx
Главное, что собралось всё в итоге. Спасибо за помощь!
Не собирается Kepka
Добавлено: 01 окт 2019, 17:15
Zeffanyx
Olej писал(а): 30 сен 2019, 18:21
Zeffanyx писал(а): 28 сен 2019, 11:56
Код: Выделить всё
return std::clamp(int(0.21 * r + 0.72 * g + 0.07 * b), 0, 255);
^
std::clamp требует указания совместимости с С++17, что может делаться опциями компилятора, директивами и т.д.
В разных дистрибутивах дефаултные опции компилятора могут различаться.
Нужно указать явно опцию -std=c++1z (-std=c++17 для gcc), а сделать это можно разными способами.
P.S. Вот твой clamp - наслаждайся:
Код: Выделить всё
olej@ACER:/usr/include/boost/algorithm$ ls -l /usr/include/boost/algorithm/clamp.hpp
-rw-r--r-- 1 root root 7669 фев 4 2019 /usr/include/boost/algorithm/clamp.hpp
Объясни, пожалуйста, как именно использовать -std=c++1z в данном случае.
Я добавил в CmakeLists.txt строку:
Код: Выделить всё
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
но эффекта нет.
Не собирается Kepka
Добавлено: 01 окт 2019, 19:11
Olej
Zeffanyx писал(а): 01 окт 2019, 17:15
но эффекта нет.
-std=c++1z - это в Clang, точно... может быть, что в GCC -std=c++17, нужно смотреть документацию
Не собирается Kepka
Добавлено: 01 окт 2019, 19:49
Zeffanyx
Olej писал(а): 01 окт 2019, 19:11
Zeffanyx писал(а): 01 окт 2019, 17:15
но эффекта нет.
-std=c++1z - это в Clang, точно... может быть, что в GCC -std=c++17, нужно смотреть документацию
Ну вот я делаю:
Код: Выделить всё
export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
Потом Cmake ../
Куда именно нужно засунуть -std=c++1z, чтобы файл Telegram/SourceFiles/codegen/style/CMakeFiles/codegen_style.dir/parsed_file.cpp собрался?
Не собирается Kepka
Добавлено: 01 окт 2019, 20:17
VictorR2007
Zeffanyx писал(а): 01 окт 2019, 19:49
Куда именно нужно засунуть -std=c++1z,
Наверное так
Код: Выделить всё
%build
%global optflags %{optflags} -std=c++17
export CC="clang"
export CXX="clang++"
Или может вместо строки
%global optflags %{optflags} -std=c++17
строку
%global optflags %{optflags} -std=c++1z
Не собирается Kepka
Добавлено: 01 окт 2019, 20:20
Zeffanyx
Я всегда перед сборкой пакета проверяю, собирается ли программа просто в папке. Так что, хотелось бы без RPM-макросов для начала, уж извините.
Не собирается Kepka
Добавлено: 01 окт 2019, 20:37
Алзим
C этим макросом надо поосторожнее если собирать с Clang.
Может быть придётся прописывать:
Там есть несовместимые с Clang ключи.
Не собирается Kepka
Добавлено: 02 окт 2019, 12:04
Zeffanyx
Короче, пока не выходит. Olej не желает раскрывать секрет своего успеха)
Не собирается Kepka
Добавлено: 02 окт 2019, 15:43
VictorR2007
Zeffanyx писал(а): 02 окт 2019, 12:04
Короче, пока не выходит.
Значит стоит попробовать собирать с помощью mock-urpm.
Тогда можно будет использовать параметры в спеке
Код: Выделить всё
%build
%global optflags %(echo %{optflags} | sed -e 's/-mcet//g' -e 's/-fcf-protection//g' -e 's/-fstack-clash-protection//g' -e 's/$/-Qunused-arguments -Wno-unknown-warning-option/')
export CC="clang"
export CXX="clang++"
%cmake \
-DPACKAGED_BUILD:BOOL=ON \
-DENABLE_IPO:BOOL=ON
%make
Тут есть параметры сборки
https://github.com/procxx/kepka/blob/dev/kepka.spec
Не собирается Kepka
Добавлено: 02 окт 2019, 16:57
Zeffanyx
VictorR2007 писал(а): 02 окт 2019, 15:43
Значит стоит попробовать собирать с помощью mock-urpm.
При чём тут вообще RPM и спек? Мне не получается передать флаг CXX при сборке исходника. Когда получится локально собрать, тогда и к пакету перейду.
Не собирается Kepka
Добавлено: 02 окт 2019, 17:11
Zeffanyx
Zeffanyx писал(а): 02 окт 2019, 12:04
Olej не желает раскрывать секрет своего успеха)
По ходу, он собрал приложение в Debian. Вот по этой строке видно, что это не Роса:
Код: Выделить всё
/usr/include/x86_64-linux-gnu/libavformat/avformat.h
У нас этот файлик лежит в другом месте. Интрига сохраняется!
Не собирается Kepka
Добавлено: 03 окт 2019, 14:01
Zeffanyx
Всё собрал, всё получилось.
Но в спеке не сработали макросы %cmake и %make, с ними сборка валилась. Возможно из-за этого не получился вот этот трюк:
Код: Выделить всё
%global optflags %{optflags} -std=c++17 -stdlib=libc++
Вместо него сделал патч.
Принимаются советы про то как причесать
спек)