openSUSE:构建系统配方
所有关于打包的内容都应该放在这个分类下。
摘要
此页面提供了一种类似于备忘单,用于确定为了以标准化方式构建具有特定构建系统的常用软件包,需要在.spec文件中包含哪些代码。
在此上下文中,构建系统指的是创建 Makefile 和/或调用编译器的工具,而不是 Open Build Service 系统。
注意:这里还有一些背景关于 openSUSE 软件构建系统偏好的统计数据。
automake
RPM 附带了许多便利宏。基本配方是
%build %configure %make_build
%install %make_install
该%configure宏将设置CFLAGS, CXXFLAGS, FFLAGS到%optflags 如果它们之前没有被设置。要添加您自己的标志,请在一行上放在 %configure 之前
export CPPFLAGS="-Dpreprocessor_options -Ihere" export CFLAGS="%optflags -fwhatever" export CXXFLAGS="%optflags -fwhateverplusplus"
(通常没有必要切换到 `./configure`!)
%make_build是一个从 rpm-4.12 开始可用的宏。它等效于 `make %{?_smp_mflags}`.
%make_install是一个从 rpm-4.10 开始可用的宏。它等效于 `make install DESTDIR="%{?buildroot}"`.
避免使用%makeinstall(注意:没有下划线)。该宏会增加编写不佳的软件在安装时失败的机会。(有关详细信息,请参阅 [1]。)
您还可以使用单独的构建目录,以获得乐趣和收益(以及发现无法应对它的软件)[也 SLE11 上不可用]
%build %define _configure ../configure mkdir obj pushd obj/ %configure popd %install %make_install -C obj
autoconf
在上游软件中使用 autoconf 而不使用 automake 经常会带来许多意想不到的糟糕问题,当使用手工制作的 Makefile 时——最常见的错误是变量赋值不被尊重(例如,设置 CFLAGS 会破坏重要的标志,导致产品无法编译),以及无法将标志传递给命令(例如,调用 CC 命令时无法传递 CPPFLAGS)。
当 Makefile 由其他软件自动生成时(例如,`scons autotools`),这可能不适用,或者仅部分适用,或者根本不适用。无论如何,autoconf 而不使用 automake 很容易出现错误,因此没有单一的配方可以涵盖大量内容。如果 Makefile 的行为合理地类似于 automake,请参阅上面的 automake 部分。
cmake
从 openSUSE-13.1[2]开始,该发行版提供了一个 %cmake 宏,该宏来自 /etc/rpm/macros.cmake(BuildRequires: cmake),应该为您的需求设置基本值。
基本部分如下所示
%build
%cmake \
-DSOME_SPECIAL_VARIABLE="SOME_VALUE"
%cmake_build
%install
%cmake_install
%check
%ctest
您还可以覆盖一些变量以获得所需的 cmake 行为
%build # build in <someotherfolder> rather than in build directory %define __builddir <someotherfolder> %cmake ... # use ninja instead of make %define __builder ninja %cmake ...
不幸的是,CMakeLists.txt文件允许很多自由,以至于有些软件可能会忽略某些参数。如果发生这种情况,也许还需要指定以下额外标志
-DCMAKE_BUILD_WITH_INSTALL_RPATH(:BOOL)="yes|no"
-DCMAKE_BUILD_TYPE="Release|RelWithDebInfo"
-DCMAKE_CONF_PATH(:PATH)="%_sysconfdir"
-DCMAKE_C_FLAGS:STRING="%optflags"
-DCMAKE_C_FLAGS_RELEASE:STRING="%optflags"
-DCMAKE_CXX_FLAGS:STRING="%optflags"
-DCMAKE_CXX_FLAGS_RELEASE:STRING="%optflags"
-DCMAKE_DATA_PATH(:PATH)="%_datadir"
-DCMAKE_DOC_PATH(:PATH)="%_docdir"
-DCMAKE_FIND_ROOT_PATH="/%{?_sysroot}"
-DCMAKE_INSTALL_DO_STRIP=0
-DCMAKE_INSTALL_LIBDIR="%_lib"
-DCMAKE_INSTALL_LIBEXECDIR(:PATH)="%_prefix"
-DCMAKE_INSTALL_PREFIX(:PATH)="%_prefix"
-DCMAKE_LD_FLAGS(:STRING)="-Wl,-z -Wl,defs"
-DCMAKE_LOCALE_PATH(:PATH)="%_datadir/locale"
-DCMAKE_SKIP_RPATH(:BOOL)=YES
-DCMAKE_STRIP(:FILEPATH)="/bin/true"
-DCMAKE_VERBOSE_MAKEFILE(:BOOL)="true"
-DNO_STRIP=1
还有一个 cmake 错误:不指定 :TYPE 部分会导致等号后的部分有时被忽略。
python (setup.py)
另请参阅:openSUSE:Packaging Python
旧版 Setuptools 风格
BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: %{python_module setuptools}
%python_subpackages
%build
%python_build
%install
%python_install
%python_expand %fdupes %{buildroot}%{python_sitelib}
%check
%pyunittest -v
%files %python_files
%{python_sitelib}/name
%{python_sitelib}/name-%{version}*-info
/other/files/not/conflicting-for-all-supported-flavors-e.g.-distinguished-by-%{python_bin-suffix}
PEP517 风格
BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: %{python_module pip}
BuildRequires: %{python_module wheel}
%python_subpackages
%build
%pyproject_wheel
%install
%pyproject_install
%python_expand %fdupes %{buildroot}%{python_sitelib}
%check
%pyunittest -v
%files %python_files
%{python_sitelib}/name
%{python_sitelib}/name-%{version}*-info
/other/files/not/conflicting-for-all-supported-flavors-e.g.-distinguished-by-%{python_bin-suffix}
qmake
无花招的样板
%build
qmake-qt5 QMAKE_CFLAGS+="%optflags" QMAKE_CXXFLAGS+="%optflags" QMAKE_STRIP="/bin/true"
%make_build / make %{?_smp_mflags} as with automake (see above)
%install
make install INSTALL_ROOT="%buildroot"
qmake 可以在 libqt5-qtbase-devel 包中找到。
meson
另请参阅 打包 Meson 页面。
BuildRequires: meson %build %meson %meson_build %install %meson_install %check %meson_test
对于其他所有情况
请参阅 Category:Packaging,了解何时有宏或其他专用说明(Perl、Python 等)