mNo edit summary |
mNo edit summary |
||
(13 intermediate revisions by the same user not shown) | |||
Line 21: | Line 21: | ||
<li>Every package '''MUST''' include the following in its' spec: | <li>Every package '''MUST''' include the following in its' spec: | ||
<ul> | <ul> | ||
<li> | <li>The <code>drupal7-rpmbuild</code> package automatically requires <code>drupal7(core)</code> and scans files for provides (from *.info files) and automatically adds them to the package during build time as "<code>drupal7(<drupal_machine_name>)</code>" virtual resources. [https://drupal.org/node/542202#hidden Hidden projects] are ignored. The use of virtual provides and requires helps alleviate the confusion of sub-modules and which modules actually provide those sub-modules. | ||
<pre>BuildRequires: drupal7-rpmbuild >= 7.23-3</pre></li> | |||
The <code>drupal7-rpmbuild</code> package automatically requires <code>drupal7(core)</code> and scans files for provides (from *.info files) and automatically adds them to the package during build time as "<code>drupal7(<drupal_machine_name>)</code>" virtual resources. [https://drupal.org/node/542202#hidden Hidden projects] are ignored. The use of virtual provides and requires helps alleviate the confusion of sub-modules and which modules actually provide those sub-modules. | <li>For compatibility with RPM < 4.9 (i.e. EPEL 5/6): | ||
</ | <pre>%{?drupal7_find_provides_and_requires}</pre></li> | ||
<li> | |||
< | |||
For compatibility with RPM < 4.9 (i.e. EPEL 5/6) | |||
</li> | |||
</ul> | </ul> | ||
</li> | </li> | ||
Line 47: | Line 43: | ||
See [[Packaging:PHP#Extensions_Requires|PHP packaging guidelines]]. | See [[Packaging:PHP#Extensions_Requires|PHP packaging guidelines]]. | ||
To get a list of required PHP extensions, use [http://php5.laurent-laville.org/compatinfo/ PHP_CompatInfo ( | To get a list of required PHP extensions, use [http://php5.laurent-laville.org/compatinfo/ PHP_CompatInfo (phpcompatinfo)]: | ||
<pre> | <pre> | ||
phpcompatinfo print --recursive --report=extension unpacked_package_source_directory | |||
</pre> | </pre> | ||
To install [http://php5.laurent-laville.org/compatinfo/ PHP_CompatInfo ( | To install [http://php5.laurent-laville.org/compatinfo/ PHP_CompatInfo (phpcompatinfo)], run "<code>yum install php-bartlett-PHP-CompatInfo</code>". | ||
=== Requiring a Minimum PHP Version === | === Requiring a Minimum PHP Version === | ||
See [[Packaging:PHP#Requiring_a_Minimum_PHP_version|PHP packaging guidelines]] but note that this should not normally be required by most packages (see [http://drupal.org/node/542202#php]). | See [[Packaging:PHP#Requiring_a_Minimum_PHP_version|PHP packaging guidelines]] but note that this should not normally be required by most packages (see [http://drupal.org/node/542202#php]). | ||
{{admon/important|This | {{admon/important|This should be added to the <code>drupal7-rpmbuild</code> package so it is automatic.}} | ||
=== Common Issues === | |||
<ul> | |||
<li> | |||
On RHEL 5/6 there is an issue with the standard auto-requires script (<code>/usr/lib/rpm/find-requires</code>). When there is no "<code>#!</code>" (she-bang) line at the beginning of an executable PHP file, the script tries to add an invalid "<code><?php</code>" as a dependency. Rpmbuild then errors out with something similar to the following: | |||
<pre>RPM build errors: | |||
line 53: Dependency tokens must begin with alpha-numeric, '_' or '/': -</pre> | |||
To fix this issue, find the files that incorrectly have their executable bit set and remove the executable bit in the spec's <code>%prep</code> section. If there should be no executable files in the package then the following could be added to the spec's <code>%prep</code> section: | |||
<pre>find . -type f -executable -print0 | xargs -0 chmod -x</pre> | |||
{{admon/note|For EPEL 5, use "<code>-perm /+x</code>" instead of "<code>-executable</code>"}} | |||
</li> | |||
</ul> | |||
== Macros and Scriptlets == | == Macros and Scriptlets == | ||
Line 95: | Line 104: | ||
<pre> | <pre> | ||
This package provides the following Drupal module(s): | This package provides the following Drupal module(s): | ||
* %{ | * %{module} | ||
</pre> | </pre> | ||
For example, the <code>drupal7-domain</code> package contains the following in its' description: | For example, the <code>drupal7-domain</code> package contains the following in its' description: | ||
<pre> | <pre> | ||
This package provides the following Drupal modules: | This package provides the following Drupal modules: | ||
* %{ | * %{module} | ||
* %{ | * %{module}_alias | ||
* %{ | * %{module}_conf | ||
* %{ | * %{module}_content | ||
* %{ | * %{module}_nav | ||
* %{ | * %{module}_settings | ||
* %{ | * %{module}_source | ||
* %{ | * %{module}_strict | ||
* %{ | * %{module}_theme | ||
</pre> | </pre> | ||
{{admon/note|<code>%{module}</code> is defined in the templates below}} | |||
</li> | </li> | ||
</ul> | </ul> | ||
Line 126: | Line 136: | ||
=== Module === | === Module === | ||
{{admon/note|This template is for all versions of Fedora and EPEL 6+. If you are packaging for EPEL 5, see [[Packaging:Guidelines]] for additional requirements that need to be added to the spec.}} | |||
<pre> | <pre> | ||
%{?drupal7_find_provides_and_requires} | %{?drupal7_find_provides_and_requires} | ||
%global | %global module __MODULE__ | ||
Name: drupal7-%{ | Name: drupal7-%{module} | ||
Version: __VERSION__ | Version: __VERSION__ | ||
Release: 1%{?dist} | Release: 1%{?dist} | ||
Line 139: | Line 151: | ||
Group: Applications/Publishing | Group: Applications/Publishing | ||
License: GPLv2+ | License: GPLv2+ | ||
URL: http://drupal.org/project/%{ | URL: http://drupal.org/project/%{module} | ||
Source0: http://ftp.drupal.org/files/projects/%{ | Source0: http://ftp.drupal.org/files/projects/%{module}-7.x-%{version}.tar.gz | ||
Source1: %{name}-RPM-README.txt | Source1: %{name}-RPM-README.txt | ||
BuildArch: noarch | BuildArch: noarch | ||
BuildRequires: drupal7-rpmbuild >= 7.23-3 | |||
BuildRequires: drupal7-rpmbuild >= 7. | |||
# phpcompatinfo (computed from version __VERSION__) | |||
#Requires: php- | |||
%description | %description | ||
Line 151: | Line 165: | ||
This package provides the following Drupal module(s): | This package provides the following Drupal module(s): | ||
* %{ | * %{module} | ||
%prep | %prep | ||
%setup - | %setup -qn %{module} | ||
cp -p %{SOURCE1} . | cp -p %{SOURCE1} . | ||
Line 164: | Line 178: | ||
%install | %install | ||
mkdir -pm 0755 %{buildroot}%{module}/%{module} | |||
mkdir - | cp -pr * %{buildroot}%{drupal7_modules}/%{module}/ | ||
cp -pr * %{buildroot}%{drupal7_modules}/%{ | |||
%files | %files | ||
%doc *.txt | %doc *.txt | ||
%{drupal7_modules}/%{ | %{drupal7_modules}/%{module} | ||
%exclude %{drupal7_modules}/%{ | %exclude %{drupal7_modules}/%{module}/*.txt | ||
Line 186: | Line 194: | ||
=== Theme === | === Theme === | ||
{{admon/note|This template is for all versions of Fedora and EPEL 6+. If you are packaging for EPEL 5, see [[Packaging:Guidelines]] for additional requirements that need to be added to the spec.}} | |||
<pre> | <pre> | ||
%{?drupal7_find_provides_and_requires} | %{?drupal7_find_provides_and_requires} | ||
%global | %global theme __THEME__ | ||
Name: drupal7-%{ | Name: drupal7-%{theme} | ||
Version: __VERSION__ | Version: __VERSION__ | ||
Release: 1%{?dist} | Release: 1%{?dist} | ||
Line 199: | Line 209: | ||
Group: Applications/Publishing | Group: Applications/Publishing | ||
License: GPLv2+ | License: GPLv2+ | ||
URL: http://drupal.org/project/%{ | URL: http://drupal.org/project/%{theme} | ||
Source0: http://ftp.drupal.org/files/projects/%{ | Source0: http://ftp.drupal.org/files/projects/%{theme}-7.x-%{version}.tar.gz | ||
Source1: %{name}-RPM-README.txt | Source1: %{name}-RPM-README.txt | ||
BuildArch: noarch | BuildArch: noarch | ||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | ||
BuildRequires: drupal7-rpmbuild >= 7. | BuildRequires: drupal7-rpmbuild >= 7.23-3 | ||
# phpcompatinfo (computed from version __VERSION__) | |||
#Requires: php- | |||
%description | %description | ||
Line 212: | Line 225: | ||
%prep | %prep | ||
%setup - | %setup -qn %{theme} | ||
cp -p %{SOURCE1} . | cp -p %{SOURCE1} . | ||
Line 221: | Line 234: | ||
%install | %install | ||
mkdir -pm 0755 %{buildroot}%{drupal7_themes}/%{theme} | |||
mkdir - | cp -pr * %{buildroot}%{drupal7_themes}/%{theme}/ | ||
cp -pr * %{buildroot}%{drupal7_themes}/%{ | |||
%files | %files | ||
%doc *.txt | %doc *.txt | ||
%{drupal7_themes}/%{ | %{drupal7_themes}/%{theme} | ||
%exclude %{drupal7_themes}/%{ | %exclude %{drupal7_themes}/%{theme}/*.txt | ||
Line 241: | Line 248: | ||
- Initial package | - Initial package | ||
</pre> | </pre> | ||
[[Category:Packaging guidelines drafts]] |
Latest revision as of 15:34, 17 February 2014
Guidelines for packaging Drupal 7 modules and themes
Different Kinds of Packages
- Modules: Modules extend and customize Drupal functionality.
- Themes: Themes allow users to change the look and feel of their Drupal site.
Naming Scheme
Every package MUST be named drupal7-<drupal_machine_name>
. Drupal itself enforces unique machine names for each of its' projects and there is a single namespace for all modules, themes, and distributions/profiles. The <drupal_machine_name>
MUST match the drupal.org project name (i.e. drupal.org/project/<drupal_machine_name>
).
File Placement
- Modules: A module package MUST be placed in the
%drupal7_modules
directory - Themes: A theme package MUST be placed in the
%drupal7_themes
directory - Libraries: A library package MUST be placed in the
%drupal7_libraries
directory
Requires and Provides
- Every package SHOULD require "
drupal7(<drupal_machine_name>)
" virtual resources instead of "drupal7-<drupal_machine_name>
" packages. - Every package MUST include the following in its' spec:
- The
drupal7-rpmbuild
package automatically requiresdrupal7(core)
and scans files for provides (from *.info files) and automatically adds them to the package during build time as "drupal7(<drupal_machine_name>)
" virtual resources. Hidden projects are ignored. The use of virtual provides and requires helps alleviate the confusion of sub-modules and which modules actually provide those sub-modules.BuildRequires: drupal7-rpmbuild >= 7.23-3
- For compatibility with RPM < 4.9 (i.e. EPEL 5/6):
%{?drupal7_find_provides_and_requires}
- The
- Every package MUST NOT:
- explicitly require "
drupal7
" or "drupal7(core)
" (unless a specific core version is required) becausedrupal7-rpmbuild
auro-requires "drupal7(core)
" - explicitly provide "
drupal7(<drupal_machine_name>)
" virtual resources becausedrupal7-rpmbuild
auto-provides these
- explicitly require "
Other Packages
PHP Extensions
To get a list of required PHP extensions, use PHP_CompatInfo (phpcompatinfo):
phpcompatinfo print --recursive --report=extension unpacked_package_source_directory
To install PHP_CompatInfo (phpcompatinfo), run "yum install php-bartlett-PHP-CompatInfo
".
Requiring a Minimum PHP Version
See PHP packaging guidelines but note that this should not normally be required by most packages (see [1]).
Common Issues
-
On RHEL 5/6 there is an issue with the standard auto-requires script (
/usr/lib/rpm/find-requires
). When there is no "#!
" (she-bang) line at the beginning of an executable PHP file, the script tries to add an invalid "<?php
" as a dependency. Rpmbuild then errors out with something similar to the following:RPM build errors: line 53: Dependency tokens must begin with alpha-numeric, '_' or '/': -
To fix this issue, find the files that incorrectly have their executable bit set and remove the executable bit in the spec's
%prep
section. If there should be no executable files in the package then the following could be added to the spec's%prep
section:find . -type f -executable -print0 | xargs -0 chmod -x
Macros and Scriptlets
Macros provided by the drupal7-rpmbuild
package:
Macro | Value | Description |
---|---|---|
%drupal7 |
%{_datadir}/drupal7 |
Drupal 7 base directory |
%drupal7_modules |
%{drupal7}/modules |
Drupal 7 modules directory |
%drupal7_themes |
%{drupal7}/themes |
Drupal 7 themes directory |
%drupal7_libraries |
%{_sysconfdir}/drupal7/all/libraries |
Drupal 7 libraries directory |
%drupal7_find_provides_and_requires |
Fedora:
|
Fedora:
No-op macro to allow spec compatibility with RPM < 4.9 (no fileattrs)
|
Additional Hints
- Every module package SHOULD list the Drupal modules it provides in its' description:
This package provides the following Drupal module(s): * %{module}
For example, the
drupal7-domain
package contains the following in its' description:This package provides the following Drupal modules: * %{module} * %{module}_alias * %{module}_conf * %{module}_content * %{module}_nav * %{module}_settings * %{module}_source * %{module}_strict * %{module}_theme
Templates
RPM README
After installation, you must enable this module from the Drupal administration page. If upgrading this module separately from the core Drupal package, be sure to run the http://hostname/drupal7/upgrade.php script after this RPM is upgraded.
Module
%{?drupal7_find_provides_and_requires} %global module __MODULE__ Name: drupal7-%{module} Version: __VERSION__ Release: 1%{?dist} Summary: __SUMMARY__ Group: Applications/Publishing License: GPLv2+ URL: http://drupal.org/project/%{module} Source0: http://ftp.drupal.org/files/projects/%{module}-7.x-%{version}.tar.gz Source1: %{name}-RPM-README.txt BuildArch: noarch BuildRequires: drupal7-rpmbuild >= 7.23-3 # phpcompatinfo (computed from version __VERSION__) #Requires: php- %description __DESCRIPTION__ This package provides the following Drupal module(s): * %{module} %prep %setup -qn %{module} cp -p %{SOURCE1} . %build # Empty build section, nothing to build %install mkdir -pm 0755 %{buildroot}%{module}/%{module} cp -pr * %{buildroot}%{drupal7_modules}/%{module}/ %files %doc *.txt %{drupal7_modules}/%{module} %exclude %{drupal7_modules}/%{module}/*.txt %changelog * ddd MMM DD YYYY __NAME__ <__EMAIL__> __VERSION__-1 - Initial package
Theme
%{?drupal7_find_provides_and_requires} %global theme __THEME__ Name: drupal7-%{theme} Version: __VERSION__ Release: 1%{?dist} Summary: __SUMMARY__ Group: Applications/Publishing License: GPLv2+ URL: http://drupal.org/project/%{theme} Source0: http://ftp.drupal.org/files/projects/%{theme}-7.x-%{version}.tar.gz Source1: %{name}-RPM-README.txt BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: drupal7-rpmbuild >= 7.23-3 # phpcompatinfo (computed from version __VERSION__) #Requires: php- %description __DESCRIPTION__ %prep %setup -qn %{theme} cp -p %{SOURCE1} . %build # Empty build section, nothing to build %install mkdir -pm 0755 %{buildroot}%{drupal7_themes}/%{theme} cp -pr * %{buildroot}%{drupal7_themes}/%{theme}/ %files %doc *.txt %{drupal7_themes}/%{theme} %exclude %{drupal7_themes}/%{theme}/*.txt %changelog * ddd MMM DD YYYY __NAME__ <__EMAIL__> __VERSION__-1 - Initial package