Project packaging
Introduction
The local builder allows the projects to be packaged locally. Here is an example of a simple use of this tool in the case of project packaging.
After following the “getting started for a developer” chapter, you will have at least one project with one application. The application chosen for the example is helloworld-binding.
Please be sure to have rp-cli installed, configured and connected to a local builder. Refer to local builder installation
$ rp-cli applications list
ID Name Slug Project
a3968638-58ae-41bd-9d9f-2e605fdceb87 Helloworld binding helloworld-binding my-awesome-project-1
This command shows your application Helloworld binding
in the project described before.
Steps to follow
Initialize the project
In this step, rp-cli retrieves the corresponding application in redpesk UI.
rp-cli local package init helloworld-binding --project my-awesome-project-1
Apply your modifications
As it is precised in the message after initialization:
The spec file 'helloworld-binding.spec' has been copied to '~/my_rp_builder_dir/gitpkgs/helloworld-binding'
Please modify '~/my_rp_builder_dir/gitpkgs/helloworld-binding/helloworld-binding.spec' while working on packaging, only this specfile is used when running 'rp-cli local package run'
You can work on the spec file in your host here: ~/my_rp_builder_dir/gitpkgs/helloworld-binding/helloworld-binding.spec
Run to do the packaging
Once spec file modifications done, rp-cli is ready to build the package locally. Just choose between native and cross packaging by select the target in the command line as below:
Cross packaging
# If the target flag is not present, the default target is aarch64
rp-cli local package build helloworld-binding --target aarch64 --project my-awesome-project-1
Native packaging
rp-cli local package build helloworld-binding --target x86_64 --project my-awesome-project-1
Upload the new specfile
If the package was correctly built in the previous step, it is possible to upload the spec file in the UI using the following command:
rp-cli applications upload helloworld-binding ~/my_rp_builder_dir/gitpkgs/helloworld-binding/helloworld-binding.spec
Tips and tricks
If you want to make some changes for local use, as in this case, you can do it like this:
rp-cli local package build helloworld-binding --target aarch64 --project my-awesome-project-1 --shell
When you are in the mock, you can see that all directories are empty the first time.
<mock-chroot> sh-4.4# ls -R
.:
build
./build:
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS originals
./build/BUILD:
./build/BUILDROOT:
./build/RPMS:
./build/SOURCES:
./build/SPECS:
./build/SRPMS:
./build/originals:
That’s why it is necessary to firstly run the packaging with the -N option to keep the generated content of the mock inside it.
rp-cli local package build helloworld-binding --target aarch64 --project my-awesome-project-1 -N
Once the build is finished, you can replay the command with the --shell
flag in order to enter the mock and interact with it.
rp-cli local package build helloworld-binding --target aarch64 --project my-awesome-project-1 -N --shell
You can then start building manually inside the mock
cd build/BUILD/helloworld-binding-1.0.1/
mkdir build && cd build
cmake ..
If everything is correct, you will have something like:
<mock-chroot> sh-4.4# cmake ..
-- The C compiler identification is GNU 8.4.1
-- The CXX compiler identification is GNU 8.4.1
[...]
-- Generating done
-- Build files have been written to: /builddir/build/BUILD/helloworld-binding-1.0.1/build
This is useful when you made some changes locally that you want to test quickly:
<mock-chroot> sh-4.4# make -j
Scanning dependencies of target htdocs
Scanning dependencies of target helloworld-skeleton
Scanning dependencies of target helloworld-subscribe-event
Scanning dependencies of target helloworld-config
Scanning dependencies of target test-files
Scanning dependencies of target prepare_package
Scanning dependencies of target prepare_package_test
Scanning dependencies of target autobuild
Scanning dependencies of target fixture-files
[ 3%] Generating package
[ 7%] Generating htdocs
[...]
[100%] Built target helloworld-binding_build_done
The method above is using the --target aarch64
option. This means that the package is built for an aarch64 architecture.
However the same process can be followed for an x86_64 target, the only thing to change is the value of the --target
flag: --target x86_64
.
It is also possible to install a specific package inside the mock from rp-cli
command line. Indeed, this is impossible from inside since the mock has no internet connection.
To do that, use the --install
flag like in the example below.
# Install jq package in the mock
rp-cli local package build helloworld-binding --target aarch64 --project my-awesome-project-1 -N --install jq