Russian Qt Forum
Ноябрь 22, 2024, 23:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: cmake и конфигурация сборки и линковки через json  (Прочитано 10269 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« : Июнь 10, 2023, 14:37 »

Всем привет.
Такой вопрос, для cmake можно в файле CMakePresets.json прописать определенные настройки, и при выборе проект будет собираться по данным правилам.
Вопрос: можно ли через такие настройки указать например в одном случаи мне нужна линковка в одним набором модулей, а в другом случаи с другим?
Еще в проекте присутствуют паблик и приват файлы, и с ними тоже надо работать.
То есть возможна ли гибкость переключения сборки?
Может кто сталкивался с подобным.
Заранее спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 11, 2023, 22:57 »

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

про переключение непонятно. это вопрос про какую-то конкретную Иде?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #2 : Июнь 12, 2023, 16:16 »

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

про переключение непонятно. это вопрос про какую-то конкретную Иде?

Вообще выбор того пресета который нужен это как минимум работает в QtCreator, CLion, VS. про другие не знаю.
Проблема в проекте то что приходится генерировать и вытаскивать публичные хедеры в зависимости от того какой проект нужен, потом линковка с модулями. Я же хочу найти способ как без ... генерации через пресеты переключать нужные варианты сборки и линковки.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 12, 2023, 17:15 »

все равно не особо понятно в чем проблема. можешь на синтетическом примере продемонстрировать?

со своей опцией у тебя просто будет 2 отдельных папки сборки, например:
Код:
# 1
cmake -S . -B ../build1 -D MYOPTION=ON

# 2
cmake -S . -B ../build2 -D MYOPTION=OFF
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #4 : Июнь 14, 2023, 09:02 »

все равно не особо понятно в чем проблема. можешь на синтетическом примере продемонстрировать?

со своей опцией у тебя просто будет 2 отдельных папки сборки, например:
Код:
# 1
cmake -S . -B ../build1 -D MYOPTION=ON

# 2
cmake -S . -B ../build2 -D MYOPTION=OFF

Смотрите, я хочу понять как сделать например включение или выключение сборки каких то таргетов, ключение многопоточного билда как для gcc, так и в случаи если сборка идет в мелкомягкой через MSVC(это вообще не понятно как работает и как это задать). Но самое главное это переключенеи таргетов.
Я написал лайт вариант с которым можно попробовать сделать такой пример,могу послать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июнь 14, 2023, 11:21 »

все это через опции (необязательно булевые) решается, например:

Код:
option(MYOPTION "Some bool option" OFF)

# ...

if(MYOPTION)
  add_subdirectory(extra_target1_dir)
  add_subdirectory(extra_target2_dir)
  add_compile_definitions(MYOPTION=1)
else()
  add_subdirectory(extra_target3_dir)
endif()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #6 : Июнь 14, 2023, 14:19 »

все это через опции (необязательно булевые) решается, например:

Код:
option(MYOPTION "Some bool option" OFF)

# ...

if(MYOPTION)
  add_subdirectory(extra_target1_dir)
  add_subdirectory(extra_target2_dir)
  add_compile_definitions(MYOPTION=1)
else()
  add_subdirectory(extra_target3_dir)
endif()

Так можно, но как оказалось никто не хочет чет менять аля опции в нужной ситуации. Нужно через пресеты, то есть выбрал нужный и он переконфигурировал.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июнь 14, 2023, 18:55 »

ну так эту опцию в пресет и впиши Улыбающийся
да, сделай два пресета, в которых будет отличаться какая-то твоя опция, на основании которой будешь выбирать какие модули использовать. эти два пресета можно унаследовать от общего.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #8 : Июнь 14, 2023, 22:23 »

ну так эту опцию в пресет и впиши Улыбающийся
да, сделай два пресета, в которых будет отличаться какая-то твоя опция, на основании которой будешь выбирать какие модули использовать. эти два пресета можно унаследовать от общего.

Вот мой минимальный пресет, как в него добавить?

Код:
{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 22,
        "patch": 0
    },
    "configurePresets": [
        {
            "name": "Client",
            "description": "Build only one project Client",
            "generator": "Ninja",
            "binaryDir": "build-client",
            "cacheVariables": {
                "CMAKE_EXPORT_COMPILE_COMMANDS": {
                    "type": "STRING",
                    "value": "ON"
                },
                "BOARD": {
                    "type": "STRING",
                    "value": "<default>"
                },
                "BUILD_CLIENT": {
                    "type": "STRING",
                    "value": "ON"
                },
                "CMAKE_BUILD_TYPE": {
                    "type": "STRING",
                    "value": "Debug"
                }
            }
        }
    ]
}

И сразу вопрос, как сюда можно добавить указание для MSVC билдить например в 8 потоков?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июнь 14, 2023, 23:22 »

не надо бояться документации https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html

добавь новую переменную в cacheVariables

для многопоточной сборки надо добавить buildPresets и использовать поле jobs. если у тебя генерируется проект для студии, то msbuild должен собирать параллельно по умолчанию, насколько я помню.

вижу, у тебя генератор Ниндзя, так она по умолчанию тоже параллельно собирает.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #10 : Август 03, 2023, 11:18 »

Добрый день.
В общем при разборе того что надо было переписывать оказалось небольшое недопонимание.
У VS есть какой то функционал для MSbuilder что какие то проекты могут быть load а какие то unload.
Именно это и надо было найти.
И может я ошибаюсь но разве это не тоже самое что конфигурация через пресеты cmake?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Август 03, 2023, 13:02 »

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

если ты не добавишь папку проекта через add_subdirectory, то ее в солюшене вообще не будет. как сделать чтоб проект там был, но был unload или чтоб не собирался по умолчанию я не знаю, это надо курить доку cmake касательно студийно-специфических переменных/свойств (а то и вовсе вручную править сгенерированный файл солюшена/проекта)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.