LINUX.ORG.RU

23
Всего сообщений: 228

Cmake опции для сабдиректорий

Всем доброго времени суток.

Есть проект со следующей структурой

  • CMakeLists.txt
  • mylib [dir]
  • myapp [dir]

У mylib есть несколько опций cmake для различных вариантов сборки. myapp зависит от mylib, и mylib должен быть собран с определенными опциями.

Куда более правильно будет внести эти опции?

На данный момент в корневом CMakeLists это делается так, но мне не очень нравится, опций больше двух и это выглядит знатной портянкой. Хорошо было бы это как-то вынести в myapp, но ведь mylib уже определен к моменту входа в myapp.

project(myapp)

option(LIB_OPTION1 "" ON)
set(LIB_OPTION2 ${APP_OPTION} CACHE BOOL "")
add_subdirectory(mylib)

add_subdirectory(myapp)

 

ncuxer ()

Помогите со структурой проекта

Здравствуйте, хотел бы посоветоваться по поводу структуры проекта на cmake, как сделать правильно и красиво.

На данные момент есть 4 репозитория:

1) libProject - библиотека под GPL в открытом доступе. Есть example app и тесты. Коммиты сюда крайне редки, если не считать синхронизации из mainProject.

2) mainProject - программа, которая зависит от libProject в привате. Никаких сабмодулей, чтобы не усложнять жизнь другим программистам. Периодически вручную синхронизируется с libProject тупым копированием содержимого.

3) subprojectA - часть mainProject в привате, зависит от libProject, libproject подтягивается сабмодулем. В сабмодуль было решено вынести после того, как девелоперы лезли в libProject и ломали mainProject. Если девелоперу нужно внести изменения в libProject, то он должен создать отдельный пулл реквест в libProject, но такая необходимость возникает крайне редко.

4) subprojectB - то же, что и subprojectA, просто другая часть mainProject

Корень subprojectA/B выглядит так:

  • CMakeLists.txt
  • libProject (submodule dir)
  • subprojectA (dir)

В mainProject и назад синхронизация из подпроектов идет опять же в ручном режиме. Как правило над subprojectA и subprojectB в основной программе никто не работает.

Корень mainProject условно выглядит так:

  • CMakeLists.txt
  • libProject (dir)
  • libs (3rdparty libraries dir)
  • subprojectA (dir)
  • subprojectB (dir)
  • src
  • resources

Вопрос такой - как внести subprojectA и subprojectB в основной проект избежав дублирования libProject?

По поводу ручной синхронизации - я раньше пробовал делать это через subtree, но видимо не до конца разобрался и при очередном мердже он мне вывалил миллион конфликтов. Можно ли как-то вернуться к subtree структуре без коммита удаления подпроекта и добавления назад?

 ,

ncuxer ()

Организация структуры каталогов в cmake проектах

Дано: пол сотни программ и ещё пол сотни библиотек, которые используются этими программами.

Вопрос: как лучше всего организовать этот проект.

Цель: минимизировать время компиляции.

Само собой напрашивается решение вида:

./programs/a/CMakeLists.txt:
add_subdirectory("../../libs/blib")
add_subdirectory("../../libs/clib")
...
./programs/b/CMakeLists.txt:
add_subdirectory("../../libs/blib")
add_subdirectory("../../libs/dlib")
...
Очевидно, что мне не нравятся относительные пути. Так же для каждой программы придется собирать требуемые ей библиотеки отдельно. (Но зато каждая программа собирается отдельно в своем binary dir)

Вариант два: добавить один cmake и в нем подоьавлять все программы. Проблема: свалка всего и возможно неоправданно длинный этап конфигурации. Проблему относительных путей не рещает.

Посоветуйте best practices и может какие-то красивые решения.

 

invy ()

cmake добавить каталог заголовочных файлов к другим целям

Добрый день.
В корне проекта есть каталог config. В нем есть файл config.h.in. Это шаблон конфигурационного файла на основе которого при сборке через механизм cmake configure_file() генерируется файл config.h который будет подключаться в исходниках целей через директиву

// Здесь не указываются пути, только имя файла
#include "config.h"

Также в каталоге config есть файл CMakeLists.txt следующего содержания (config.h.in добавляется к цели для того, чтобы отображаться в дереве проекта в IDE):

add_library(config config.h.in)
set_target_properties(config PROPERTIES LINKER_LANGUAGE CXX)
# или же можно установить свойства конкретного файла (с тем же эффектом)
# set_source_files_properties(config.h.in PROPERTIES LANGUAGE CXX HEADER_FILE_ONLY ON)

set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)

configure_file(config.h.in config.h)
Без второй строки получаю ошибку:
CMake Error: Cannot determine link language for target "config".
CMake Error: CMake can not determine linker language for target: config
(это из-за того что cmake по расширению .in не может определить язык поэтому далее я указываю язык явно через set_target_properties())
Данный файл подключается в корневом файле CMakeLists.txt через команду
add_subdirectory("config")
Также есть подкаталог program со своим CMakeLists.txt который подключается в корневом CMakeLists.txt также через команду add_subdirectory(). Вот содержимое CMakeLists.txt из подкаталога program:
add_executable(program main.cpp)

target_link_libraries(program library0 library1 config)
В данном случае я добавил config в команду target_link_libraries() для того, чтобы добавить к текущей цели каталоги с заголовочными файлами из цели config.
При данной конфигурации сборка работает.
Вопрос: правильная ли это архитектура? Или добавить путь к конфигурационному файлу удобнее иначе? Например через команду cmake add_custom_target (через нее у меня не получилось, но возможно я делал это как-то не корректно)?

 , ,

rumgot ()

сборка ubus, libubox средствами cmake

Всем привет!

Debian 9

Пытаюсь собрать либы для ubus и libubox. Все исходники качнул с openWRT, в составе которых есть дэфолтные CMakeLists.txt.

Поставил Lua 5.3. Папка ubus лежит в ворркспэйсе, рядом libubox.

Скажу сразу, что cmake я раньше не использовал.

cmake выдаёт ошибку CMake Error: The following variables are used in this project, but they are set to NOTFOUND.

Буду благодарен за любую помощь.

root@debian:~/workspace_codeBlocks/ubus# cmake .

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.

Please set them or make sure they are set and tested correctly in the CMake files:

blob_library

 linked by target "ubusd" in directory/root/workspace_codeBlocks/ubus

 linked by target "cli" in directory /root/workspace_codeBlocks/ubus

 linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples

json

 linked by target "ubusd" in directory /root/workspace_codeBlocks/ubus

 linked by target "cli" in directory /root/workspace_codeBlocks/ubus

 linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples

ubox_include_dir

 used as include directory in directory 
/root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory 
/root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory 
/root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/lua

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples

 used as include directory in directory /root/workspace_codeBlocks/ubus/examples
ubox_library

 linked by target "ubus" in directory /root/workspace_codeBlocks/ubus

 linked by target "ubusd" in directory /root/workspace_codeBlocks/ubus

 linked by target "cli" in directory /root/workspace_codeBlocks/ubus

 linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples

 linked by target "client" in directory /root/workspace_codeBlocks/ubus/examples

-- Configuring incomplete, errors occurred!

See also "/root/workspace_codeBlocks/ubus/CMakeFiles/CMakeOutput.log".

 , ,

Drakonoff ()

cmake не находит Qt5

Перехал на профиль 17.1. Провёл все манипуляции с unsymlink-lib. И теперь не могу собрать ни одну программу, использующую Qt5 и cmake. Cmake ругается, что не нашёл FindQt5.cmake или Qt5Config.cmake. Я так понял, что дело в том что теперь модули cmake переехали в /usr/lib64/cmake/*. Как это можно побороть? (FIND_LIBRARY_USE_LIB64_PATHS не помогает)

 , ,

Torvus ()

LLVM не конфигурируется (windows)

(Проблема решена! Переустановил Visual Studio 2015 в корень диска C без русских символов и всё заработало)

Извините за оффтоп, я не знаю где ещё задать вопрос, где только не задавал, все тупят и не понимают в чём дело.

Я хочу скомпилировать LLVM 3.7.1 на windows 7 64-bit.

Установил Visual Studio 2015 Community (при установке галочка на Visual C) и CMake 3.8.0-rc1 (с переменной path). Версии все совместимы, у других людей всё работает кроме меня. Открываю папки исходника и места сборки в cmake-gui, нажимаю configure (выбрал Visual Studio 14 2015 и native compilers) и получаю ошибку:

No build type selected, default to Debug
The C compiler identification is MSVC 19.0.23026.0
The CXX compiler identification is MSVC 19.0.23026.0
CMake Error at CMakeLists.txt:29 (project):
  No CMAKE_C_COMPILER could be found.



CMake Error at CMakeLists.txt:29 (project):
  No CMAKE_CXX_COMPILER could be found.



Configuring incomplete, errors occurred!
See also "C:/LLVMBIN/CMakeFiles/CMakeOutput.log".

Файл Output пишет что ошибок нет:

The system is: Windows - 6.1.7601 - AMD64
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
Compiler:  
Build flags: 
Id flags:  

The output was:
0
Microsoft (R) Build Engine ўҐабЁЁ 14.0.23107.0
(C) Љ®аЇ®а жЁп Њ ©Єа®б®дв (Microsoft Corporation). ‚ᥠЇа ў  § йЁйҐ­л.

‘Ў®аЄ  ­ з в  05.07.2019 15:59:15.
Џа®ҐЄв "C:\LLVMBIN\CMakeFiles\3.8.0-rc1\CompilerIdC\CompilerIdC.vcxproj" ў 㧫Ґ 1 (楫ҐўлҐ ®ЎкҐЄвл Ї® 㬮«з ­Ёо).
PrepareForBuild:
  ‘®§¤ ­ЁҐ Є в «®Ј  "Debug\".
  ‘®§¤ ­ЁҐ Є в «®Ј  "Debug\CompilerIdC.tlog\".
InitializeBuildStatus:
  ‘®§¤ ­ЁҐ "Debug\CompilerIdC.tlog\unsuccessfulbuild", в Є Є Є Ўл«® § ¤ ­® "AlwaysCreate".
ClCompile:
  C:\Users\ў Ґ­м«Ј™3\Desktop\VisualStudio2015\VC\bin\CL.exe /c /nologo /W0 /WX- /Od /Oy- /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc140.pdb" /Gd /TC /analyze- /errorReport:queue CMakeCCompilerId.c
  CMakeCCompilerId.c
Link:
  C:\Users\ў Ґ­м«Ј™3\Desktop\VisualStudio2015\VC\bin\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdC.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdC.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdC.lib" /MACHINE:X86 /SAFESEH Debug\CMakeCCompilerId.obj
  CompilerIdC.vcxproj -> C:\LLVMBIN\CMakeFiles\3.8.0-rc1\CompilerIdC\.\CompilerIdC.exe
PostBuildEvent:
  for %%i in (cl.exe) do @echo CMAKE_C_COMPILER=%%~$PATH:i
  :VCEnd
  CMAKE_C_COMPILER=C:\Users\ў Ґ­м«Ј™3\Desktop\VisualStudio2015\VC\bin\cl.exe
FinalizeBuildStatus:
  ” ©« "Debug\CompilerIdC.tlog\unsuccessfulbuild" г¤ «пҐвбп.
  ЋЎа йҐ­ЁҐ Є "Debug\CompilerIdC.tlog\CompilerIdC.lastbuildstate".
‘Ў®аЄ  Їа®ҐЄв  "C:\LLVMBIN\CMakeFiles\3.8.0-rc1\CompilerIdC\CompilerIdC.vcxproj" § ўҐа襭  (楫ҐўлҐ ®ЎкҐЄвл Ї® 㬮«з ­Ёо).

‘Ў®аЄ  гбЇҐи­® § ўҐа襭 .
    ЏаҐ¤гЇаҐ¦¤Ґ­Ё©: 0
    ЋиЁЎ®Є: 0

‡ ва зҐ­­®Ґ ўаҐ¬п: 00:00:11.16


Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CompilerIdC.exe"

Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CompilerIdC.vcxproj"

The C compiler identification is MSVC, found in "C:/LLVMBIN/CMakeFiles/3.8.0-rc1/CompilerIdC/CompilerIdC.exe"

Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
Compiler:  
Build flags: 
Id flags:  

Похоже у меня одного такая проблема, как выбрать эти два компилятора из папки vusual? Я не знаю даже названий файлов этих компиляторов (в gcc например: c - gcc.exe, c++ - g++.exe).

Что я не так сделал?

 , ,

gradle ()

Подскажите систему управления сборкой множества пакетов

Есть у меня несколько пакетов c использованием cmake. И каждому при компиляции надо указывать файл конфига тулчейна, префикс, куда ставить, некоторым еще дополнительные опции.

В общем, хочется автоматизировать.

Можно написать свой bash скрипт для сборки, но наверняка это не лучшее решение

 

cvs-255 ()

CMake не понимаю почему

Добрый день!

Есть такой CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

find_package(Hg)
if (HG_FOUND)
    message("HG found")
    HG_WC_INFO(${PROJECT_SOURCE_DIR} prj1)
    set (SHORT_CHANGESET ${prj1_WC_REVISION})
    set (HEX 0x)
    set (LONG_CHANGESET ${HEX}${prj1_WC_CHANGESET})
    message("Changeset: " ${SHORT_CHANGESET})
    message("Number: " ${LONG_CHANGESET})
    add_compile_options(-DSHORT_CHANGESET=${SHORT_CHANGESET}
    -DLONG_CHANGESET=${LONG_CHANGESET})
endif()

add_subdirectory(prj2)
add_subdirectory(prj3)

И, соответственно, в директории prj2 CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
set (SOURCES cpp1.cpp cpp2.cpp cpp1.def)
set (SHORT_CHANGESET "" CACHE STRING "Mercurial short changeset")
set (LONG_CHANGESET "" CACHE STRING "Mercurial long changeset")
add_library(HardwareInterface SHARED ${SOURCES})
add_definitions(/DSHORT_CHANGESET=${SHORT_CHANGESET} /DLONG_CHANGESET=${LONG_CHANGESET})
add_definitions(/MT)

Где-то в недрах cpp1.cpp SHORT_CHANGESET и LONG_CHANGESET используются.

Так вот, компилируется все это только при условии, что cmake запускается два раза - после первого запуска ошибки раскрывания макросов, а после второго - все ОК.

Я не автор кода, только собираю его. В чем причина такого поведения cmake?

 ,

braboar ()

Ошибка при линковке shared библиотеки при использовании cmake

Имею проект с такой структурой

* test_dpi
  * dpi
    * include
      * typedefs.h
      * streams.h
    * src
      * typedefs.cpp
      * streams.cpp
    * CMakeLists.txt
  * main.cpp
  * CMakeLists.txt

typedefs.h

#pragma once

#include <iostream>
#include <vector>

#define DECLARE_SERIALIZATION template<typename Ar> void serialize(Ar& ar, const unsigned version);

namespace DPI
{
    enum class Direction : int {
        Forward = 1,
        Reverse
    };

    struct Flow {
        uint64_t id{};

        DECLARE_SERIALIZATION
    };

    struct Packet {
        uint64_t flow_id{};

        DECLARE_SERIALIZATION
    };

    struct Dump {
        std::vector<Packet> packets;
        std::vector<Flow> flows;

        DECLARE_SERIALIZATION
    };
}

streams.h

#pragma once

#include "typedefs.h"

#include <boost/filesystem.hpp>
#include <boost/archive/binary_wiarchive.hpp>
#include <boost/archive/binary_woarchive.hpp>

namespace DPI
{
    bool load(const std::wstring& path, Dump& dump);
    bool dump(const std::wstring& path, const Dump& dump);
}

main.cpp

#include "dpi/streams.h"

int main() {
    std::cout << "Hello, World!" << std::endl;

    DPI::Dump dump;
    DPI::dump(L"this.bin", dump);

    return 0;
}

dpi/CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(dpi)

add_library(dpi SHARED
        include/dpi/typedefs.h include/dpi/streams.h
        src/typedefs.cpp src/streams.cpp
        )

target_include_directories(dpi PRIVATE ./include/dpi)

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project(test_dpi)

set(CMAKE_CXX_STANDARD 17)
find_package(Boost REQUIRED)

add_subdirectory(dpi)
include_directories(${dpi_SOURCE_DIR}/include)

add_executable(test_dpi main.cpp)
link_libraries(test_dpi boost_system boost_serialization boost_wserialization dpi)

Сам подпроект компилируется нормально, но при попытке собрать test_dpi в терминале появляются такие ошибки

====================[ Build | test_dpi | Debug ]================================
/opt/clion-2018.3.1/bin/cmake/linux/bin/cmake --build /home/ramb/Projects/test_dpi/cmake-build-debug --target test_dpi -- -j 2
[ 50%] Linking CXX executable test_dpi
/usr/bin/ld: CMakeFiles/test_dpi.dir/main.cpp.o: in function `main':
/home/ramb/Projects/test_dpi/main.cpp:9: undefined reference to `DPI::dump(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, DPI::Dump const&)'
/usr/bin/ld: CMakeFiles/test_dpi.dir/main.cpp.o: in function `boost::system::error_category::std_category::equivalent(int, std::error_condition const&) const':
/usr/include/boost/system/error_code.hpp:676: undefined reference to `boost::system::generic_category()'
/usr/bin/ld: /usr/include/boost/system/error_code.hpp:679: undefined reference to `boost::system::generic_category()'
/usr/bin/ld: CMakeFiles/test_dpi.dir/main.cpp.o: in function `boost::system::error_category::std_category::equivalent(std::error_code const&, int) const':
/usr/include/boost/system/error_code.hpp:706: undefined reference to `boost::system::generic_category()'
/usr/bin/ld: /usr/include/boost/system/error_code.hpp:709: undefined reference to `boost::system::generic_category()'
/usr/bin/ld: /usr/include/boost/system/error_code.hpp:721: undefined reference to `boost::system::generic_category()'
collect2: error: ld returned 1 exit status
gmake[3]: *** [CMakeFiles/test_dpi.dir/build.make:84: test_dpi] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/test_dpi.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/test_dpi.dir/rule] Error 2
gmake: *** [Makefile:118: test_dpi] Error 2

Что я делаю не так?

 , ,

Ram-B ()

Сборка ODB с помощью CMake в Gentoo и не только

Релиз ODB (одна из самых продвинутых свободных ORM для C++) очень затянулся. Старая версия 2.4.0 уже не работает с GCC7 и новее, а для сборки и тестирования ODB из Git (а также alpha и beta) разработчики предлагают использовать их собственную сборочную систему build2.

Я предложил помощь в добавлении поддержки autotools/cmake для того, чтобы упростить сборку в source-based дистрибутивах и сборку пакетов для дистрибутивов в целом, но у разработчиков были причины использовать и официально поддерживать только собственную систему сборки.

Вот обсуждение: https://www.codesynthesis.com/pipermail/odb-users/2018-December/004160.html

Так как в качестве основной ОС у меня Gentoo, то у меня был выбор или написать ebuild-ы для build2 и соответствующий eclass, или портировать ODB на CMake, так как это упростит сборку пакетов для других дистрибутивов уже привычными инструментами. Пока что я остановился на втором варианте.

Если кому интересно попробовать свежий ODB, то здесь я буду в свободное время продолжать портировать на CMake https://gitlab.com/odb-cmake. Замечания и пожелания приветствуются.

И ещё: есть заинтересованные в build2 в Gentoo?

 , , ,

Pravorskyi ()

а?

привет, лор.

есть погромулька, которая собирается cmake и есть libvasya.so.1.0.0, libvasya.so.1 а так же и libvasya.so.

означает ли DBUILD_SHARED_LIBS=ON линковку с libvasya.so.1, а DBUILD_SHARED_LIBS=OFF с libvasya.so?

 

Deleted ()

Установка плагина для GCC в Gentoo — нужно исправить ebuild или CMakeLists.txt?

Во время установки ebuild получаю предупреждение:

>>> Install odb-9999 into /var/tmp/portage/dev-util/odb-9999/image category dev-util
>>> Working in BUILD_DIR: "/var/tmp/portage/dev-util/odb-9999/work/odb-9999_build"
[0/1] Install the project...
-- Install configuration: "Gentoo"
-- Installing: /var/tmp/portage/dev-util/odb-9999/image/usr/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/plugin/libodb.so
-- Installing: /var/tmp/portage/dev-util/odb-9999/image/usr/bin/odb
>>> Completed installing odb-9999 into /var/tmp/portage/dev-util/odb-9999/image

 * Final size of build directory: 21196 KiB (20.6 MiB)
 * Final size of installed tree:   4632 KiB ( 4.5 MiB)

 * The ebuild is installing to one or more unexpected paths:
 * 
 *   /usr/usr
 * 
 * Please fix the ebuild to use correct FHS/Gentoo policy paths.

Вот в этом файле дважды встречается каталог usr:

/var/tmp/portage/dev-util/odb-9999/image/usr/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/plugin/libodb.so

В CMakeLists.txt определяется каталог с плагинами для GCC таким образом:

execute_process (COMMAND ${CMAKE_CXX_COMPILER} "-print-file-name=plugin"
    OUTPUT_VARIABLE GCC_PLUGIN_DIR
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
Пример значения переменной CMAKE_CXX_COMPILER:
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/plugin

И вот так идёт установка плагина в CMakeLists.txt:

install (TARGETS odb
    LIBRARY
        DESTINATION ${CMAKE_INSTALL_PREFIX}/${GCC_PLUGIN_DIR}
)
Так как нет других идей как определить путь к плагинам GCC, то в результате получаю абсолютный путь с /usr в начале. И добавляю ${CMAKE_INSTALL_PREFIX}, чтобы не использовать жестко закодированный абсолютный путь.

Теперь возникает вопрос: для того, чтобы исправить установку с помощью portage, мне нужно обработать эту ситуацию в ebuild или поменять логику в CMakeLists.txt?

 , , , ,

Pravorskyi ()

Не компилируется Stratagus. Cmake -Werror

Manjaro. Пытаюсь поставить stratagus из аура. Не компиляется со следующей ошибкой:

/usr/include/SDL/SDL_opengl.h:116: error: "GL_GLEXT_VERSION" redefined [-Werror]
 #define GL_GLEXT_VERSION 29
 
In file included from /usr/include/GL/gl.h:2055,
                 from /usr/include/SDL/SDL_opengl.h:46,
                 from /home/alyokhin/build/stratagus.aur/src/stratagus/src/include/video.h:46,
                 from /home/alyokhin/build/stratagus.aur/src/stratagus/src/action/action_attack.cpp:60:
/usr/include/GL/glext.h:54: note: this is the location of the previous definition
 #define GL_GLEXT_VERSION 20180725
 
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/stratagus.dir/build.make:90: CMakeFiles/stratagus.dir/src/action/action_attack.cpp.o] Error 1
make[2]: Leaving directory '/home/alyokhin/build/stratagus.aur/src/build'
make[1]: *** [CMakeFiles/Makefile2:147: CMakeFiles/stratagus.dir/all] Error 2
make[1]: Leaving directory '/home/alyokhin/build/stratagus.aur/src/build'
make: *** [Makefile:130: all] Error 2
make: Leaving directory '/home/alyokhin/build/stratagus.aur/src/build'
==> ERROR: A failure occurred in build().
    Aborting...

Такая же висит в комментах к пакету в ауре. Насколько я понял, сама нестыковка версий может быть и не критичнна. Но где-то выставлен параметр -Werror и все предупреждения обрабатываются как ошибки. Где это подправить можно?

 

ipochto ()

Отключить часть предупреждений gcc для всего проекта.

Можно ли при помощи CMake отключить одно предупреждение (-Wdeprecated-declaration) для всего проекта? И если можно, то как?

 ,

Landgraf ()

Cross Platform Package Manager for C++

Добрый День,

Решал прикладную задачу на C++ и понял, что не плохо бы поделиться с миром инструментом для Cross Platform Package Manager for C++

Документация и детали доступны здесь: https://github.com/amidukr/pak-c-mak

Интересны фидбеки, стоит ли мне продолжать?

 , , , ,

amidukr ()

cmake и версия продукта

Появилась необходимость каким-то образом получить версию продукта, при сборке проекта используя утилиту cmake.

В проекте версия объявлена вот так:

if(NOT "${BUILD_VERSION}")
    set(BUILD_VERSION 1.0)
endif()

Заранее благодарю за помощь.

 ,

ECLIPSE ()

CMake кросс-компиляция для ARM фейлится на этапе теста

Всем привет.

По нужде, а не по собственной воле нужно портировать проект на CMake из qmake/qbs. Проект кросс-платформенный на Qt, целевая платформа Apalis iMX6 с BSP Linux, сгенерированном при помощи Yocto. Используется toolchain сгенеренный тем-же Yocto. Хост машина - Ubuntu 18 x86_64.

Путь к toolchain:

/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/

Путь к целевой RootFs:

/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/

В качестве IDE, естественно используется QtCreator 4.8.0, в котором все нужные комплекты настроены правильно (юзаю SDK, сгенеренный Yocto). Проекты, базирующиеся на qmake или qbs компилятся великолепно. Но вот с CMake какая-то ж#@а.

Проект (любой, даже Hello World) открывается корректно (нифига не открывается, сразу после открытия вижу треш), но при попытке кросс-компиляции, CMake вываливает такой треш:

The ASM compiler identification is GNU Found assembler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc The C compiler identification is GNU 6.4.0 The CXX compiler identification is GNU 6.4.0 Check for working C compiler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc Check for working C compiler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc — broken CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message): The C compiler

«/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc»

is not able to compile a simple test program.

It fails with the following output:

Change Dir: /tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeTmp Run Build Command:«/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/bin/make» «cmTC_afb4e/fast» /lib/ld-linux-armhf.so.3: No such file or directory

CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:22 (project)

Configuring incomplete, errors occurred! See also «/tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeOutput.log». See also «/tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeError.log». CMake Project parsing failed.

WTF?

Какого хрена CMake дергает make, расположенный на RootFs целевой ARM платформы? Естественно, оно не запустится на x86_64! Симлинк 'ld-linux-armhf.so.3' имеется на целевом RootFs и ссылается на валидную либу.

CMake-филы, как вы используете это говно? Как пофиксить?

PS: С qmake и QBS проблем нет, а CMake тупит... Бесит что ппц. :(

 , , ,

kuzulis ()

Установка q4wine

Всем привет, хочу установить q4wine по этой инструкции

http://blog.swlogic.eu/2010/09/13/linux-wine-q4wine-ustanovka-i-rabota-s-prog...

ОС Debian 9.6 GUI Mate.

1. Скачал архив из:

https://sourceforge.net/projects/q4wine/files/q4wine/q4wine 1.3.10/

2. Установил пакеты для сборки

sudo apt-get install git build-essential cmake qt5-default qtscript5-dev libssl-dev qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5svg5-dev libqt5webkit5-dev libsdl2-dev libasound2 libxmu-dev libxi-dev freeglut3-dev libasound2-dev libjack-jackd2-dev libxrandr-dev libqt5xmlpatterns5-dev libqt5xmlpatterns5 qtbase5-dev qttools5-dev-tools

3. Далее собираю так:

sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local/q4wine-1.3.10
sudo make install

4. Перехожу в директорию установки и пытаюсь запустить:

cd /usr/local/q4wine-1.3.10
q4wine

И ничего не происходит...

Что надо еще сделать???

 , , ,

dim4k ()

modern cmake

Поделитесь ссылками на best practices в современном cmake...

Типа target_include_directories Vs include_directories и т.п.

Что-то на подобие этого: https://cliutils.gitlab.io/modern-cmake/

Спасибо.

 

invy ()