Russian Qt Forum

Qt => Общие вопросы => Тема начата: SektorCT от Июнь 10, 2023, 14:37



Название: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Июнь 10, 2023, 14:37
Всем привет.
Такой вопрос, для cmake можно в файле CMakePresets.json прописать определенные настройки, и при выборе проект будет собираться по данным правилам.
Вопрос: можно ли через такие настройки указать например в одном случаи мне нужна линковка в одним набором модулей, а в другом случаи с другим?
Еще в проекте присутствуют паблик и приват файлы, и с ними тоже надо работать.
То есть возможна ли гибкость переключения сборки?
Может кто сталкивался с подобным.
Заранее спасибо.


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Июнь 11, 2023, 22:57
да, сделай два пресета, в которых будет отличаться какая-то твоя опция, на основании которой будешь выбирать какие модули использовать. эти два пресета можно унаследовать от общего.

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Июнь 12, 2023, 16:16
да, сделай два пресета, в которых будет отличаться какая-то твоя опция, на основании которой будешь выбирать какие модули использовать. эти два пресета можно унаследовать от общего.

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

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Июнь 12, 2023, 17:15
все равно не особо понятно в чем проблема. можешь на синтетическом примере продемонстрировать?

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

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Июнь 14, 2023, 09:02
все равно не особо понятно в чем проблема. можешь на синтетическом примере продемонстрировать?

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

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

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Июнь 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()


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Июнь 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()

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Июнь 14, 2023, 18:55
ну так эту опцию в пресет и впиши :)
да, сделай два пресета, в которых будет отличаться какая-то твоя опция, на основании которой будешь выбирать какие модули использовать. эти два пресета можно унаследовать от общего.


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Июнь 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 потоков?


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Июнь 14, 2023, 23:22
не надо бояться документации https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html

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

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

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


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: SektorCT от Август 03, 2023, 11:18
Добрый день.
В общем при разборе того что надо было переписывать оказалось небольшое недопонимание.
У VS есть какой то функционал для MSbuilder что какие то проекты могут быть load а какие то unload.
Именно это и надо было найти.
И может я ошибаюсь но разве это не тоже самое что конфигурация через пресеты cmake?


Название: Re: cmake и конфигурация сборки и линковки через json
Отправлено: kambala от Август 03, 2023, 13:02
пресеты задают всякие cmake параметры, типа твоих кастомных переменных, флажков компиляции и т.д., чтоб не писать их вручную в терминале

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