CMakeMigration2021: различия между версиями

Материал из ALT Linux Wiki
(Новая страница: «Категория:Sisyphus == Rationale == С макросами <tt>%cmake</tt>, <tt>%cmake_build</tt>, <tt>%cmake_install</tt>, <tt>%cmakeinstall_std</tt…»)
 
(→‎FAQ: Есть ли у нас документация по %_smp_mflags? Это должно быть там.)
 
(не показано 7 промежуточных версий этого же участника)
Строка 28: Строка 28:


Автор этих строк вносит предложение ввести такие макросы:
Автор этих строк вносит предложение ввести такие макросы:
http://git.altlinux.org/people/arseny/packages/cmake.git?p=cmake.git;a=shortlog;h=refs/tags/3.19.7-alt2
http://git.altlinux.org/people/arseny/packages/cmake.git?p=cmake.git;a=shortlog;h=refs/tags/3.19.7-alt3
Их семантика похожа на макросы для Python3, для Meson.
Их семантика похожа на макросы для Python3, для Meson.
Эти макросы можно использовать с любым сборочным исполнителем, с in-source builds; они отвечают рекомендациям апстрима CMake (использовать <tt>cmake (--build|--install)</tt>).
Эти макросы можно использовать с любым сборочным исполнителем, с in-source builds; они отвечают рекомендациям апстрима CMake (использовать <tt>cmake (--build|--install)</tt>).
Строка 40: Строка 40:
{| class="wikitable"
{| class="wikitable"
|-
|-
! Старые макросы !! Предлагаемые макросы
! Выражение в старых макросах !! В предлагаемых макросах
|-
|-
| <tt>%cmake_install install DESTDIR=%buildroot</tt> || <tt>%cmake_install</tt>
| <tt>%cmake_install install DESTDIR=%buildroot</tt> || <tt>%cmake_install</tt>
Строка 47: Строка 47:
|-
|-
| <tt>cmake --build "%_cmake__builddir" -j%__nprocs</tt> || <tt>%cmake_build</tt>
| <tt>cmake --build "%_cmake__builddir" -j%__nprocs</tt> || <tt>%cmake_build</tt>
|-
| <tt>%cmake_build $target || <tt>%cmake_build -t $target</tt>
|-
| <tt>%cmake_build VERBOSE=1 || <tt>%cmake_build</tt> ''(подробный вывод — по умолчанию)''
|-
|-
| <tt>%cmake $args</tt> || <tt>%cmake -S . -B BUILD $args</tt>
| <tt>%cmake $args</tt> || <tt>%cmake -S . -B BUILD $args</tt>
Строка 76: Строка 80:


== Incompatibilities ==
== Incompatibilities ==
* 8 спеков в Сизифе явно используют старый %cmake_install. Их исправит change owner.
* 8 спеков в cизифе явно используют старый <tt>%cmake_install</tt>. Их исправит change owner: [http://git.altlinux.org/tasks/269879/ 269879].
* Каталогом для сборочных артефактов по умолчанию будет выступать не <tt>BUILD</tt>, а <tt>%_target_platform</tt>. Мейнтейнерам предстоит либо заменить отсылки к <tt>BUILD</tt> в спеках на <tt>%_cmake__builddir</tt>, либо внести в спек: <source lang=spec>%define _cmake__builddir BUILD</source> для возвращения старого поведения.
* Каталогом для сборочных артефактов по умолчанию будет выступать не <tt>BUILD</tt>, а <tt>%_target_platform</tt>. Мейнтейнерам предстоит либо заменить отсылки к <tt>BUILD</tt> в спеках на <tt>%_cmake__builddir</tt>, либо внести в спек: <source lang=spec>%define _cmake__builddir BUILD</source> для возвращения старого поведения.
* <tt>%cmake</tt> больше не передаёт <tt>-DCMAKE_SKIP_RPATH:BOOL=ON</tt> на этапе компиляции. [https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling#default-rpath-settings Согласно документации], это стало не нужно для типичного случая, где непустой <tt>RUNPATH</tt> в сборочном каталоге полезен (чтобы, например, в фазе <tt>%check</tt> запускать их, не ставя в <tt>%buildroot</tt>), а при установке — вреден. Если пакет сложный и в нём это зачем-то нужно, предстоит передать <tt>-DCMAKE_SKIP_RPATH:BOOL=ON</tt> явно.


== Change owners ==
== Change owners ==
Строка 91: Строка 96:


A: Можете вставить <tt>%define _cmake__builddir BUILD</tt> до обращения к cmake-related макросам.
A: Можете вставить <tt>%define _cmake__builddir BUILD</tt> до обращения к cmake-related макросам.
'''Q: Хочу собирать в один поток!'''
A: Это можно сделать традиционными для ALT способами, указав в сборочном скрипте: <tt>%define __nprocs 1</tt> или <tt>export NPROCS=1</tt>
== Appendix ==
'''Help output for <tt>cmake --build</tt>''':
<pre>
Usage: cmake --build <dir> [options] [-- [native-options]]
Options:
  <dir>          = Project binary directory to be built.
  --parallel [<jobs>], -j [<jobs>]
                = Build in parallel using the given number of jobs.
                  If <jobs> is omitted the native build tool's
                  default number is used.
                  The CMAKE_BUILD_PARALLEL_LEVEL environment variable
                  specifies a default parallel level when this option
                  is not given.
  --target <tgt>..., -t <tgt>...
                = Build <tgt> instead of default targets.
  --config <cfg> = For multi-configuration tools, choose <cfg>.
  --clean-first  = Build target 'clean' first, then build.
                  (To clean only, use --target 'clean'.)
  --verbose, -v  = Enable verbose output - if supported - including
                  the build commands to be executed.
  --            = Pass remaining options to the native tool.
</pre>
'''Help output for <tt>cmake --install</tt>''':
<pre>
Usage: cmake --install <dir> [options]
Options:
  <dir>              = Project binary directory to install.
  --config <cfg>    = For multi-configuration tools, choose <cfg>.
  --component <comp> = Component-based install. Only install <comp>.
  --prefix <prefix>  = The installation prefix CMAKE_INSTALL_PREFIX.
  --strip            = Performing install/strip.
  -v --verbose      = Enable verbose output.
</pre>

Текущая версия от 10:41, 9 июня 2021


Rationale

С макросами %cmake, %cmake_build, %cmake_install, %cmakeinstall_std есть несколько проблем:

  • Они работают только с генератором Unix Makefiles (в частности, с Ninja не работают).
  • В случае размещения сборочных артефактов out-of-source используется гвоздями прибитый каталог BUILD, который невозможно поменять, не отказавшись от макросов.
    • Более того, он ещё и прибит к текущему каталогу.
  • %cmake_install работает не очевидным образом (не похож на %cmake_build) и является спойлером для %cmakeinstall_std (аналогично макросам для Make)
  • %cmake_build, %cmake_install бесполезны для in-source builds (некоторые мейнтейнеры любят так собирать, вероятно, у них есть на это причины).

Proposed changes

CMake уже несколько лет поддерживает операции build и install, не зависящие от генератора, и операцию configure, не зависящую от текущего каталога.

%build
cmake -S . -B %__builddir \
    $args \
    #
cmake --build %__builddir -j%__nprocs

%install
DESTDIR=%buildroot cmake --install %__builddir

Командам cmake --build и cmake --install можно передать --verbose. Важно: Параметры командной строки --build и --install должны быть первыми.

Автор этих строк вносит предложение ввести такие макросы: http://git.altlinux.org/people/arseny/packages/cmake.git?p=cmake.git;a=shortlog;h=refs/tags/3.19.7-alt3 Их семантика похожа на макросы для Python3, для Meson. Эти макросы можно использовать с любым сборочным исполнителем, с in-source builds; они отвечают рекомендациям апстрима CMake (использовать cmake (--build|--install)). Несколько пакетов в Сизифе уже сопровождаются таким образом.

Возможны варианты:

  • не дописывать --verbose к cmake (--build|--install).
  • дописать в %cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo, см. https://cmake.org/cmake/help/v3.20/variable/CMAKE_BUILD_TYPE.html.
    • debuginfo-символы будут вынесены в отдельные пакеты средствами соотв. подсистемы RPM, как обычно.
Выражение в старых макросах В предлагаемых макросах
%cmake_install install DESTDIR=%buildroot %cmake_install
%сmakeinstall_std %makeinstall_std -C BUILD
cmake --build "%_cmake__builddir" -j%__nprocs %cmake_build
%cmake_build $target %cmake_build -t $target
%cmake_build VERBOSE=1 %cmake_build (подробный вывод — по умолчанию)
%cmake $args %cmake -S . -B BUILD $args
%cmake_insource $args %cmake_insource $args
mkdir -p "%_target_platform"
cmake -S . -B "%_target_platform" \
  -DCMAKE_SKIP_RPATH:BOOL=ON \
  -DCMAKE_SKIP_INSTALL_RPATH:BOOL=yes \
  -DCMAKE_C_FLAGS:STRING='%optflags' \
  -DCMAKE_CXX_FLAGS:STRING='%optflags' \
  -DCMAKE_Fortran_FLAGS:STRING='%optflags' \
  -DCMAKE_INSTALL_PREFIX=%prefix \
  -DINCLUDE_INSTALL_DIR:PATH=%_includedir \
  -DLIB_INSTALL_DIR:PATH=%_libdir \
  -DSYSCONF_INSTALL_DIR:PATH=%_sysconfdir \
  -DSHARE_INSTALL_PREFIX:PATH=%_datadir \
  -DLIB_DESTINATION=%_lib \
  -DLIB_SUFFIX="%_libsuff" \
  $args
%cmake $args

User-visible impact

Пользователи не заметят изменений.

Incompatibilities

  • 8 спеков в cизифе явно используют старый %cmake_install. Их исправит change owner: 269879.
  • Каталогом для сборочных артефактов по умолчанию будет выступать не BUILD, а %_target_platform. Мейнтейнерам предстоит либо заменить отсылки к BUILD в спеках на %_cmake__builddir, либо внести в спек:
    %define _cmake__builddir BUILD
    
    для возвращения старого поведения.
  • %cmake больше не передаёт -DCMAKE_SKIP_RPATH:BOOL=ON на этапе компиляции. Согласно документации, это стало не нужно для типичного случая, где непустой RUNPATH в сборочном каталоге полезен (чтобы, например, в фазе %check запускать их, не ставя в %buildroot), а при установке — вреден. Если пакет сложный и в нём это зачем-то нужно, предстоит передать -DCMAKE_SKIP_RPATH:BOOL=ON явно.

Change owners

arseny@

FAQ

Q: Я собираю in-source и не хочу, чтобы вы это сломали.

A: Поведение %cmake_insource не изменится.

Q: Меня всё устраивало, я не хочу ничего менять!

A: Можете вставить %define _cmake__builddir BUILD до обращения к cmake-related макросам.

Q: Хочу собирать в один поток!

A: Это можно сделать традиционными для ALT способами, указав в сборочном скрипте: %define __nprocs 1 или export NPROCS=1

Appendix

Help output for cmake --build:

Usage: cmake --build <dir> [options] [-- [native-options]]
Options:
  <dir>          = Project binary directory to be built.
  --parallel [<jobs>], -j [<jobs>]
                 = Build in parallel using the given number of jobs. 
                   If <jobs> is omitted the native build tool's 
                   default number is used.
                   The CMAKE_BUILD_PARALLEL_LEVEL environment variable
                   specifies a default parallel level when this option
                   is not given.
  --target <tgt>..., -t <tgt>... 
                 = Build <tgt> instead of default targets.
  --config <cfg> = For multi-configuration tools, choose <cfg>.
  --clean-first  = Build target 'clean' first, then build.
                   (To clean only, use --target 'clean'.)
  --verbose, -v  = Enable verbose output - if supported - including
                   the build commands to be executed. 
  --             = Pass remaining options to the native tool.

Help output for cmake --install:

Usage: cmake --install <dir> [options]
Options:
  <dir>              = Project binary directory to install.
  --config <cfg>     = For multi-configuration tools, choose <cfg>.
  --component <comp> = Component-based install. Only install <comp>.
  --prefix <prefix>  = The installation prefix CMAKE_INSTALL_PREFIX.
  --strip            = Performing install/strip.
  -v --verbose       = Enable verbose output.