245 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # __rustc: path to the default rustc executable
 | |
| %__rustc /usr/bin/rustc
 | |
| 
 | |
| # __rustdoc: path to the default rustdoc executable
 | |
| %__rustdoc /usr/bin/rustdoc
 | |
| 
 | |
| # rustflags_opt_level: default optimization level
 | |
| #
 | |
| # It corresponds to the "-Copt-level" rustc command line option.
 | |
| %rustflags_opt_level 3
 | |
| 
 | |
| # rustflags_debuginfo: default verbosity of debug information
 | |
| #
 | |
| # It corresponds to the "-Cdebuginfo" rustc command line option.
 | |
| # In some cases, it might be required to override this macro with "1" or even
 | |
| # "0", if memory usage gets too high during builds on some resource-constrained
 | |
| # architectures (most likely on 32-bit architectures), which will however
 | |
| # reduce the quality of the produced debug symbols.
 | |
| %rustflags_debuginfo 2
 | |
| 
 | |
| # rustflags_codegen_units: default number of parallel code generation units
 | |
| #
 | |
| # The default value of "1" results in generation of better code, but comes at
 | |
| # the cost of longer build times.
 | |
| %rustflags_codegen_units 1
 | |
| 
 | |
| # build_rustflags: default compiler flags for rustc (RUSTFLAGS)
 | |
| #
 | |
| # -Copt-level: set optimization level (default: highest optimization level)
 | |
| # -Cdebuginfo: set debuginfo verbosity (default: full debug information)
 | |
| # -Ccodegen-units: set number of parallel code generation units (default: 1)
 | |
| #
 | |
| # ref. https://doc.rust-lang.org/rustc/codegen-options/index.html
 | |
| %build_rustflags %{shrink:
 | |
|   -Copt-level=%rustflags_opt_level
 | |
|   -Cdebuginfo=%rustflags_debuginfo
 | |
|   -Ccodegen-units=%rustflags_codegen_units
 | |
|   -Cstrip=none
 | |
| }
 | |
| 
 | |
| # __cargo: cargo command with environment variables
 | |
| #
 | |
| # CARGO_HOME: This ensures cargo reads configuration file from .cargo/config.toml,
 | |
| #       and prevents writing any files to $HOME during RPM builds.
 | |
| %__cargo /usr/bin/env CARGO_HOME=.cargo RUSTFLAGS='%{build_rustflags}' /usr/bin/cargo
 | |
| 
 | |
| # __cargo_common_opts: common command line flags for cargo
 | |
| #
 | |
| # _smp_mflags: run builds and tests in parallel
 | |
| %__cargo_common_opts %{?_smp_mflags}
 | |
| 
 | |
| # cargo_prep: macro to set up build environment for cargo projects
 | |
| #
 | |
| # This involves four steps:
 | |
| # - create the ".cargo" directory if it doesn't exist yet
 | |
| # - dump custom cargo configuration into ".cargo/config.toml"
 | |
| # - remove "Cargo.lock" if it exists (it breaks builds with custom cargo config)
 | |
| # - remove "Cargo.toml.orig" if it exists (it breaks running "cargo package")
 | |
| #
 | |
| # Options:
 | |
| #   -V <number>    - unpack and use vendored sources from Source<number> tarball
 | |
| #                    (deprecated; use -v instead)
 | |
| #   -v <directory> - use vendored sources from <directory>
 | |
| #   -N             - Don't set up any registry. Only set up the build configuration.
 | |
| %cargo_prep(V:v:N)\
 | |
| %{-v:%{-V:%{error:-v and -V are mutually exclusive!}}}\
 | |
| %{-v:%{-N:%{error:-v and -N are mutually exclusive!}}}\
 | |
| (\
 | |
| set -euo pipefail\
 | |
| %{__mkdir} -p target/rpm\
 | |
| /usr/bin/ln -s rpm target/release\
 | |
| %{__rm} -rf .cargo/\
 | |
| %{__mkdir} -p .cargo\
 | |
| cat > .cargo/config.toml << EOF\
 | |
| [build]\
 | |
| rustc = "%{__rustc}"\
 | |
| rustdoc = "%{__rustdoc}"\
 | |
| \
 | |
| [profile.rpm]\
 | |
| inherits = "release"\
 | |
| opt-level = %{rustflags_opt_level}\
 | |
| codegen-units = %{rustflags_codegen_units}\
 | |
| debug = %{rustflags_debuginfo}\
 | |
| strip = "none"\
 | |
| \
 | |
| [env]\
 | |
| CFLAGS = "%{build_cflags}"\
 | |
| CXXFLAGS = "%{build_cxxflags}"\
 | |
| LDFLAGS = "%{build_ldflags}"\
 | |
| \
 | |
| [install]\
 | |
| root = "%{buildroot}%{_prefix}"\
 | |
| \
 | |
| [term]\
 | |
| verbose = true\
 | |
| EOF\
 | |
| %{-V:%{__tar} -xoaf %{S:%{-V*}}}\
 | |
| %{!?-N:\
 | |
| cat >> .cargo/config.toml << EOF\
 | |
| [source.vendored-sources]\
 | |
| directory = "%{-v*}%{-V:./vendor}"\
 | |
| \
 | |
| [source.crates-io]\
 | |
| registry = "https://crates.io"\
 | |
| replace-with = "vendored-sources"\
 | |
| EOF}\
 | |
| %{__rm} -f Cargo.toml.orig\
 | |
| )
 | |
| 
 | |
| # __cargo_parse_opts: function-like macro which parses common flags into the
 | |
| #       equivalent command-line flags for cargo
 | |
| %__cargo_parse_opts(naf:) %{shrink:\
 | |
|     %{-n:%{-a:%{error:Can't specify both -n and -a}}}           \
 | |
|     %{-f:%{-a:%{error:Can't specify both -f(%{-f*}) and -a}}}   \
 | |
|     %{-n:--no-default-features}                                 \
 | |
|     %{-a:--all-features}                                        \
 | |
|     %{-f:--features %{-f*}}                                     \
 | |
|     %{nil}                                                      \
 | |
| }
 | |
| 
 | |
| # NB: cargo_build/test/install do not use the -n/-a/-f argument parsing like
 | |
| # Fedora's rust-packaging, because that change would break anyone that's
 | |
| # already passing arguments directly to cargo after the macro. Instead, one can
 | |
| # explicitly use --no-default-features, --all-features, or --features XYZ.
 | |
| 
 | |
| # cargo_build: builds the crate with cargo
 | |
| %cargo_build\
 | |
| %{shrink:                                               \
 | |
|     %{__cargo} build                                    \
 | |
|     %{__cargo_common_opts}                              \
 | |
|     --profile rpm                                       \
 | |
| }
 | |
| 
 | |
| # cargo_test: runs the test suite with cargo
 | |
| #
 | |
| # To pass command-line arguments to the cargo test runners directly (for
 | |
| # example, to skip certain tests during package builds), the
 | |
| # "cargo test" argument parsing need to be bypassed,
 | |
| # i.e. "%%cargo_test -- --skip foo" for skipping all tests with names that
 | |
| # match "foo".
 | |
| %cargo_test\
 | |
| %{shrink:                                               \
 | |
|     %{__cargo} test                                     \
 | |
|     %{__cargo_common_opts}                              \
 | |
|     --profile rpm                                       \
 | |
|     --no-fail-fast                                      \
 | |
| }
 | |
| 
 | |
| # cargo_install: install files into the buildroot
 | |
| #
 | |
| # For "binary" crates, this macro installs all "bin" build targets to _bindir
 | |
| # inside the buildroot. The "--no-track" option prevents the creation of the
 | |
| # "$CARGO_HOME/.crates.toml" file, which is used to keep track of which version
 | |
| # of a specific binary has been installed, but which conflicts between builds
 | |
| # of different Rust applications and is not needed when building RPM packages.
 | |
| %cargo_install\
 | |
| %{shrink:                                                         \
 | |
|   %{__cargo} install                                              \
 | |
|     %{__cargo_common_opts}                                        \
 | |
|     --profile rpm                                                 \
 | |
|     --no-track                                                    \
 | |
|     --path .                                                      \
 | |
| }
 | |
| 
 | |
| # cargo_license: print license information for all crate dependencies
 | |
| #
 | |
| # The "no-build,no-dev,no-proc-macro" argument results in only crates which are
 | |
| # linked into the final binary to be considered.
 | |
| #
 | |
| # Additionally, deprecated SPDX syntax ("/" instead of "OR") is normalized
 | |
| # before sorting the results to ensure reproducible output of this macro.
 | |
| #
 | |
| # This macro must be called with the same feature flags as other cargo macros,
 | |
| # in particular, "cargo_build", otherwise its output will be incomplete.
 | |
| #
 | |
| # The "cargo tree" command called by this macro will fail if there are missing
 | |
| # (optional) dependencies.
 | |
| %cargo_license(naf:)\
 | |
| (\
 | |
| set -euo pipefail\
 | |
| %{shrink:                                                           \
 | |
|     %{__cargo} tree                                                 \
 | |
|     --workspace                                                     \
 | |
|     --offline                                                       \
 | |
|     --edges no-build,no-dev,no-proc-macro                           \
 | |
|     --no-dedupe                                                     \
 | |
|     %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}}                \
 | |
|     --prefix none                                                   \
 | |
|     --format "{l}: {p}"                                             \
 | |
|     | sed -e "s: ($(pwd)[^)]*)::g" -e "s: / :/:g" -e "s:/: OR :g"   \
 | |
|     | sort -u                                                       \
 | |
| }\
 | |
| )
 | |
| 
 | |
| # cargo_license_summary: print license summary for all crate dependencies
 | |
| #
 | |
| # This macro works in the same way as cargo_license, except that it only prints
 | |
| # a list of licenses, and not the complete license information for every crate
 | |
| # in the dependency tree. This is useful for determining the correct License
 | |
| # tag for packages that contain compiled Rust binaries.
 | |
| %cargo_license_summary(naf:)\
 | |
| (\
 | |
| set -euo pipefail\
 | |
| %{shrink:                                                           \
 | |
|     %{__cargo} tree                                                 \
 | |
|     --workspace                                                     \
 | |
|     --offline                                                       \
 | |
|     --edges no-build,no-dev,no-proc-macro                           \
 | |
|     --no-dedupe                                                     \
 | |
|     %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}}                \
 | |
|     --prefix none                                                   \
 | |
|     --format "# {l}"                                                \
 | |
|     | sed -e "s: / :/:g" -e "s:/: OR :g"                            \
 | |
|     | sort -u                                                       \
 | |
| }\
 | |
| )
 | |
| 
 | |
| # cargo_vendor_manifest: write list of vendored crates and their versions
 | |
| #
 | |
| # The arguments for the internal "cargo tree" call emulate the logic
 | |
| # that determines which crates are included when running "cargo vendor".
 | |
| # The results are written to "cargo-vendor.txt".
 | |
| #
 | |
| # TODO: --all-features may be overly broad; this should be modified to
 | |
| # use %%__cargo_parse_opts to handle feature flags.
 | |
| %cargo_vendor_manifest()\
 | |
| (\
 | |
| set -euo pipefail\
 | |
| %{shrink:                                                           \
 | |
|     %{__cargo} tree                                                 \
 | |
|     --workspace                                                     \
 | |
|     --offline                                                       \
 | |
|     --edges normal,build                                            \
 | |
|     --no-dedupe                                                     \
 | |
|     --all-features                                                  \
 | |
|     --prefix none                                                   \
 | |
|     --format "{p}"                                                  \
 | |
|     | grep -v "$(pwd)"                                              \
 | |
|     | sed -e "s: (proc-macro)::"                                    \
 | |
|     | sort -u                                                       \
 | |
|     > cargo-vendor.txt                                              \
 | |
| }\
 | |
| )
 | |
| 
 |