Clickhouse: От скриптов сборки CMake вытекают глаза.

Created on 1 Dec 2016  ·  24Comments  ·  Source: ClickHouse/ClickHouse

Я конечно всё понимаю но я совершенно не ожидал такого говнокода от уважаемой компании Yandex. Мне кажется ТАКОЙ код порочит систему сборки CMake так и компанию Yandex.
Что меня поразило:

  • поиск почти всех библиотек только в статическом виде, это касается openssl, libcrypto, icu4c, boost и т.д. во многих ОС просто нету статических версий для этих библиотек.
  • для многих библиотек есть стандартные для CMake средства обнаружения. К примеру для OpenSSL https://cmake.org/cmake/help/v3.6/module/FindOpenSSL.html и Boost https://cmake.org/cmake/help/v3.6/module/FindBoost.html
  • Зачем искать тот же crypto если потом вы всё равно ручками явно указываете libcrypto.a и другие библиотеки для некоторых таргетов (dbms к примеру)?
  • Некоторые библиотеки вы вообще не ищете и не проверяете к примеру: termcap и libz (опять же у меня только .so)
  • Если вам нужны статическая сборка то вам просто нужно указать где лежат именно статические библиотеки. Или глянуть как сделана опция Boost_USE_STATIC_LIBS в FindBoost. И вообще правильней делать свои макросы для поиска библиотек если нужно что то отличное от обычного НО мне кажется рядовые пользователи страдать не должны.
  • Выставление опций не через нормальный option и cmake .. -DDISABLE_LIBTCMALLOC=ON вы почему то используете проверку в ENV, как минимум для DISABLE_MONGODB и DISABLE_LIBTCMALLOC. Options я вообще не нашёл! Вот читайте: https://cmake.org/cmake/help/v3.6/command/option.html
  • ну и в целом крайне грязный код, но это конечно уже ИМХО

UPDATE: Собрать получилось, но запустить - нет так нету поддержки префиксов.

build

Most helpful comment

Ну я лично увидел что зависимости бандлятся и сразу расхотелось трогать проект. Если это не принципиально, и изменения где их использование будет убрано под опцию (а в идеале они вообще будут выкинуты из репозитория) будут приняты, то могу попробовать поковырять. Сразу вопрос, оно под FreeBSD имеет шанс собраться, или там что-то Linux-специфичное используется? Вообще не, мне это не интересно.

All 24 comments

Поддерживаю!

Товарищи, я все понимаю ("официально" работает только на Ubuntu и т. д.), но очень обидно, что собирать проект под что-нибудь мало-мальски отличающееся от бубунты настолько сложно.

Конструктивное предложение: вы принимаете патчи для системы сборки? Я думаю, они бы пригодились.

У нас в команде нет людей, которые хорошо знают CMake.
Да, отправляйте патчи. Примем обязательно.

Нашёлся один человек, который не так плохо знает CMake.

Спасибо за конструктивный ответ.

  1. В Yandex есть люди которые хорошо знают CMake к примеру @AMDmi3 ;)
  2. Очень важный вопрос: какой был смысл стараться использовать только статические версии библиотек? Что бы как то вам помочь надо понять что вами двигало и как это лучше реализовать.

Ну я лично увидел что зависимости бандлятся и сразу расхотелось трогать проект. Если это не принципиально, и изменения где их использование будет убрано под опцию (а в идеале они вообще будут выкинуты из репозитория) будут приняты, то могу попробовать поковырять. Сразу вопрос, оно под FreeBSD имеет шанс собраться, или там что-то Linux-специфичное используется? Вообще не, мне это не интересно.

Сразу вопрос, оно под FreeBSD имеет шанс собраться, или там что-то Linux-специфичное используется?

Я думаю это было бы совсем плохо если ClickHouse нельзя было бы собрать под FreeBSD. Под MacOSX вроде работает так что должно.
Правда сейчас без хаков CMake файлов ничего не собралось у меня

PS и ещё пришлось mysql интерфейс в коде малёк подправить так как в новых версиях они немного поменяли: my_thread_init() - > mysql_thread_init() и т.д.

Вообще не, мне это не интересно.

Я привёл тебя в пример только в том смысле, что всегда можно проконсультироваться у коллег. :)

Навскидку:

  • Не должно быть никаких изменений CMAKE_INSTALL_PREFIX, CMAKE_BUILD_TYPE
  • Никаких захардкоженных системных путей (/usr/local, /usr/lib/x86_64-linux-gnu/glib-2.0/include/ и прочего)
  • Изменения *_FLAGS только добавением (set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ...)
  • Зависимости из системы, через FIND_PACKAGE, если нет модуля в cmake то написать модуль из 5 строчек, никаких bundled зависимостей
  • Локальные include всегда с BEFORE (include_directories(BEFORE contrib/libpoco/Data/MySQL/include)
  • -ldl -> ${CMAKE_DL_LIBS}

Сразу вопрос, оно под FreeBSD имеет шанс собраться, или там что-то Linux-специфичное используется?

Коллега на днях собрал под FreeBSD 11. https://github.com/yandex/ClickHouse/pull/286
Как раз вспоминал, кто просил об этой возможности.

Стало лучше?

Лучше стало хотя конечно ещё есть куда стремится. Без правок cmake всё равно пока не завелось (правда уже небольших).
Вот патч:

diff --git a/cmake/find_readline_edit.cmake b/cmake/find_readline_edit.cmake
index 76a704dc2..10678108b 100644
--- a/cmake/find_readline_edit.cmake
+++ b/cmake/find_readline_edit.cmake
@@ -5,6 +5,7 @@ if (NOT READLINE_LIB)
        find_library (READLINE_LIB NAMES readline PATHS ${READLINE_PATHS})
 endif ()

+list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .so.2)
 find_library (TERMCAP_LIB NAMES termcap)

 find_library (EDIT_LIB NAMES edit)

Дело в том что termcap это устаревшая библиотека и от неё активно отказываются, по этому во многих дистрибутивах (gentoo, arch) нету libtermcap.so а есть только libtermcap.so.2 выше указанный хак решает проблему. (я бы и вам от неё посоветовал отказаться)

К слову если не находит termcap то мягко говоря невнятные ошибки получаются, я бы сразу ERROR выдавал если termcap не нашёлся.

Ну и конечно таскать с собой всё то что лежит в /contrib это конечно очень спорно, но хорошо, что можно это не собирать.

Добрый день! Сборка на FreeBSD
Пробовал на FreeBSD 10.3-STABLE и на FreeBSD 11.0-STABLE

[ 51%] Building CXX object contrib/libcctz/CMakeFiles/cctz.dir/src/time_zone_libc.cc.o
/www/work/YandexDB/ClickHouse/contrib/libcctz/src/time_zone_libc.cc: In member function 'virtual cctz::time_zone::absolute_lookup cctz::TimeZoneLibC::BreakTime(cctz::time_point<std::chrono::duration<long int> >&) const':
/www/work/YandexDB/ClickHouse/contrib/libcctz/src/time_zone_libc.cc:52:65: warning: pointer to a function used in arithmetic [-Wpointer-arith]
 # define OFFSET(tm) (timezone + ((tm).tm_isdst > 0 ? 60 * 60 : 0))
                                                                 ^
/www/work/YandexDB/ClickHouse/contrib/libcctz/src/time_zone_libc.cc:78:17: note: in expansion of macro 'OFFSET'
     al.offset = OFFSET(tm);
                 ^~~~~~
/www/work/YandexDB/ClickHouse/contrib/libcctz/src/time_zone_libc.cc:52:31: error: invalid conversion from 'char* (*)(int, int)' to 'int' [-fpermissive]
 # define OFFSET(tm) (timezone + ((tm).tm_isdst > 0 ? 60 * 60 : 0))
                     ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/www/work/YandexDB/ClickHouse/contrib/libcctz/src/time_zone_libc.cc:78:17: note: in expansion of macro 'OFFSET'
     al.offset = OFFSET(tm);
                 ^~~~~~

Можете чем-то помочь? Спасибо

пока самое простое - собирать последний рабочий коммит
git checkout 1adf0bb
но скоро либа будет поправлена.

[ 57%] Building CXX object libs/libmysqlxx/CMakeFiles/mysqlxx.dir/src/Connection.cpp.o
/root/ClickHouse/ClickHouse/libs/libmysqlxx/src/Connection.cpp:1:10: fatal error: 'mysql.h' file not found
#include <mysql.h>

Может где какие пути не прописаны?

make VERBOSE=1
есть ли там -I/usr/local/include/mysql ?
и что говорил cmake ?
должен был -- Using mysqlclient: /usr/local/include/mysql : ; static=/usr/local/lib/mysql/libmysqlclient.a

[ 48%] Building CXX object libs/libmysqlxx/CMakeFiles/mysqlxx.dir/src/Connection.cpp.o
cd /www/work/YandexDB/ClickHouse/build/libs/libmysqlxx && /usr/local/bin/g++6   -DBOOST_SYSTEM_NO_DEPRECATED -I/www/work/YandexDB/ClickHouse/contrib/libdouble-conversion -I/www/work/YandexDB/ClickHouse/contrib/libcityhash/include -I/www/work/YandexDB/ClickHouse/contrib/libzookeeper/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/MongoDB/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/XML/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Crypto/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Data/ODBC/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Data/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Net/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Util/include -I/www/work/YandexDB/ClickHouse/contrib/libpoco/Foundation/include -I/www/work/YandexDB/ClickHouse/contrib/libboost/boost_1_62_0 -I/usr/local/include -I/www/work/YandexDB/ClickHouse/libs/libmysqlxx/include -I/www/work/YandexDB/ClickHouse/libs/libcommon/include -I/www/work/YandexDB/ClickHouse/dbms/include -I/www/work/YandexDB/ClickHouse/build/libs/libcommon/include -I/www/work/YandexDB/ClickHouse/libs/libpocoext/include -I/www/work/YandexDB/ClickHouse/libs/libzkutil/include -D_GLIBCXX_USE_CXX11_ABI=1 -pipe -std=gnu++1y -DCLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST -fno-omit-frame-pointer -Wall -Wnon-virtual-dtor -msse4 -mpopcnt  -Werror -O2 -g -DNDEBUG  -D_GLIBCXX_USE_CXX11_ABI=1 -pipe -O3 -o CMakeFiles/mysqlxx.dir/src/Connection.cpp.o -c /www/work/YandexDB/ClickHouse/libs/libmysqlxx/src/Connection.cpp
/www/work/YandexDB/ClickHouse/libs/libmysqlxx/src/Connection.cpp:1:19: fatal error: mysql.h: No such file or directory
 #include <mysql.h>

Это было поправлено в 1d7c5f63dfe9b49c92a8b5ea00fd3b26d8abef10

да, вроде собралось, спасибо!

сделал make -C dbms/src/Server install
установил вроде как, сам clickhouse тут - /usr/local/bin/clickhouse - запускаем -

# /usr/local/bin/clickhouse --server --config-file=/usr/local/etc/clickhouse-server/config.xml
2017.02.03 13:06:34.569217 [ 1 ] <Warning> Application: Logging to console
2017.02.03 13:06:34.577505 [ 1 ] <Information> : Starting daemon with revision 54147
2017.02.03 13:06:34.577554 [ 1 ] <Information> Application: starting up
2017.02.03 13:06:34.577720 [ 1 ] <Debug> Application: rlimit on number of file descriptors is 1885734
2017.02.03 13:06:34.577729 [ 1 ] <Debug> Application: Initializing DateLUT.
2017.02.03 13:06:34.577733 [ 1 ] <Trace> Application: Initialized DateLUT.
2017.02.03 13:06:34.578171 [ 1 ] <Debug> Application: Configuration parameter 'interserver_http_host' doesn't exist or exists and empty. Will use 'example.com' as replica host.
2017.02.03 13:06:34.578211 [ 1 ] <Debug> ConfigReloader: Loading config '/usr/local/etc/clickhouse-server/config.xml'
2017.02.03 13:06:34.581669 [ 1 ] <Debug> ConfigReloader: Loading config '/usr/local/etc/clickhouse-server/users.xml'
2017.02.03 13:06:34.584846 [ 1 ] <Information> Application: Loading metadata.
2017.02.03 13:06:34.585010 [ 1 ] <Information> DatabaseOrdinary (default): Total 0 tables.
2017.02.03 13:06:34.585060 [ 1 ] <Information> DatabaseOrdinary (system): Total 0 tables.
2017.02.03 13:06:34.585221 [ 1 ] <Debug> Application: Loaded metadata.
2017.02.03 13:06:34.585619 [ 1 ] <Information> Application: Shutting down storages.
2017.02.03 13:06:34.585670 [ 1 ] <Debug> Application: Shutted down storages.
2017.02.03 13:06:34.587567 [ 1 ] <Debug> Application: Destroyed global context.
2017.02.03 13:06:34.587711 [ 1 ] <Error> Application: Net Exception: Protocol not supported
2017.02.03 13:06:34.587718 [ 1 ] <Information> Application: shutting down
2017.02.03 13:06:34.587721 [ 1 ] <Debug> Application: Uninitializing subsystem: Logging Subsystem
2017.02.03 13:06:34.587761 [ 2 ] <Information> BaseDaemon: Stop SignalListener thread

И все, вываливается в консоль. То ли данные не установил - DatabaseOrdinary (system): Total 0 tables - я думал там должны быть какие-то системные таблицы - где их взять?
то ли что-то не так установилось - Application: Net Exception: Protocol not supported -
Конфиг по умолчанию.
Что ему теперь не хватает?

система с IPV6 собрана ?

да

Пока никаких идей кроме отключенного в ядре INET6 нет.
есть ли inet6 адреса в ifconfig ?
а что если в конфиге покрутить :: на всякие 127.0.0.1 ::1 или настоящие адреса?

@proller Добрый день!
Да, помогло в установка IPv4-адреса (и 127.0.0.1 и реальный адрес). Спасибо!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

healiseu picture healiseu  ·  3Comments

lttPo picture lttPo  ·  3Comments

fizerkhan picture fizerkhan  ·  3Comments

bseng picture bseng  ·  3Comments

vixa2012 picture vixa2012  ·  3Comments