Compare commits

..

134 Commits

Author SHA1 Message Date
mudler fcfb218a17 [builder] turn on split_install by default 2016-08-15 14:56:46 +02:00
mudler bac150a267 [builder] enhancing output 2016-08-15 14:48:18 +02:00
mudler 350e3d1000 [builder] split up into functions 2016-08-13 13:04:45 +02:00
mudler 10ef5244e3 [builder] allow to specify custom use flags per-package in the lists instead of in custom.use
* if emerge_split_install is enabled, then build.targets can contain useflags. (e.g. media-tv/kodi[-avahi] )
* for injected packages, this feature is always on
2016-08-13 12:40:36 +02:00
mudler 4b2cf1141c [sabayon-buildpackages] add support for ETP_NOCACHE 2016-08-04 11:25:21 +02:00
Ettore Di Giacinto 6e3ae4db29 builder: cleanup 2016-07-23 18:33:13 +02:00
Ettore Di Giacinto d3e174eb10 sabayon-buildpackages: add support for REMOTE_PORTDIR and REMOTE_CONF_PORTDIR 2016-07-23 18:30:43 +02:00
Ettore Di Giacinto 4c4279e707 builder: add support for remote portdir and portage configurations 2016-07-23 18:30:03 +02:00
mudler 0e33e0d75f builder: enable more verbosity to debug QA_CHECKS 2016-07-21 10:23:16 +02:00
mudler cd19f3b85b [builder] add equo args (multifetch && co.) 2016-07-21 10:20:06 +02:00
Ettore Di Giacinto b899a21852 [sabayon-buildpackages] support mounting of /etc/portage/env 2016-07-18 22:36:00 +02:00
Ettore Di Giacinto c9ad172bd4 [sabayon-buildpackages] mount packages.env instead populating packages.env/ 2016-07-18 22:26:33 +02:00
Ettore Di Giacinto cdac817e59 sabayondevkit-functions: trying softly to start docker daemon 2016-07-16 15:36:57 +02:00
Ettore Di Giacinto b33b4aa619 [builder] print qa checks if we are doing et 2016-07-16 10:27:54 +02:00
mudler c8cd58df4b [builder, sabayon-buildpackages] add QA_CHECKS env variable 2016-07-08 00:28:18 +02:00
Ettore Di Giacinto 44d7510792 [builder] removing append to make.conf, now the env variable is set and working also on the entropy side 2016-07-03 14:48:44 +02:00
Ettore Di Giacinto c7891958ea [functions] add --noreplace to default args 2016-05-28 12:56:52 +02:00
mudler c8a1ece37c [functions] build() and build_installed() echoing packages being installed 2016-05-28 12:33:09 +02:00
Ettore Di Giacinto fb745c8ed8 [builder] use ACCEPT_LICENSE with wildcard since Entropy 302 2016-05-26 12:17:07 +02:00
mudler 36fc5a6656 [sabayon-buildpackages] adding support for REMOVE_REMOTE_OVERLAY REMOVE_LAYMAN_OVERLAY 2016-05-17 19:31:52 +02:00
mudler a65f1acdca [builder] add support for REMOVE_REMOTE_OVERLAY and REMOVE_LAYMAN_OVERLAY 2016-05-17 19:30:40 +02:00
mudler 02fd49a321 [builder] better output for logs 2016-05-17 19:23:27 +02:00
mudler 868dfb767d [builder] clone user defined local_portage only if dir exists 2016-05-17 19:20:20 +02:00
mudler 5855d12d75 [builder] allow to pass to remote overlay the name and the sync-type 2016-05-17 19:18:24 +02:00
mudler 44aa54b031 [builder] removing dots from repository name 2016-05-16 11:12:02 +02:00
mudler 6bcf4abfee [builder] changing namespace allocation 2016-05-16 00:18:34 +02:00
mudler 31d3bca34b [builder] guessing sync_type from url 2016-05-13 22:45:30 +02:00
mudler 869f6a4363 [builder] url must be given in absolute form 2016-05-13 22:12:21 +02:00
mudler 3709d50006 [builder] default masters = gentoo https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:59:05 +02:00
mudler 939acad797 [builder] fixes and enhancement to add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:56:09 +02:00
mudler d9042cc4b5 [sabayon-buildpackages] TEMPDIR now is useless https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:16:30 +02:00
mudler 64d7085cb6 [builder/sabayon-buildpackages] passing REMOTE_OVERLAY to builder and adding repos as listed https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:09:44 +02:00
mudler 795aab5d24 [builder] don't re-add the repository if already there, sync instead. name of overlay now will be in the form namespace-name https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:04:34 +02:00
mudler b57f8905fe [builder] adding add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 11:58:14 +02:00
mudler 93a1093560 [builder] set ETP_NONINTERACTIVE to 1 2016-05-11 10:43:30 +02:00
mudler 84e62c332b [builder/buildpackages] adding EMERGE_REMOVE env 2016-05-10 11:40:08 +02:00
mudler 4430495086 [builder] printing what package we are compiling 2016-05-09 10:25:02 +02:00
mudler 70a7542692 [builder] remove workaround no longer needed 2016-05-03 23:55:27 +02:00
Ettore Di Giacinto 8aed3a00fa [builder] ENMAN_ADD_SELF defaults to 0 2016-05-03 10:47:29 +02:00
mudler 35f27e7b3b [builder/buildpackages] adding REMOVE_ENMAN_REPOSITORIES 2016-05-02 14:11:50 +02:00
Ettore Di Giacinto 6b1d8377b6 Update README.md 2016-04-30 14:33:34 +02:00
mudler db91098e92 [sabayon-createrepo-*] fixup typo 2016-04-22 17:42:35 +02:00
mudler 6fcccf99b8 [builder] do not check if string is contained in append_to_file if doesn't exists 2016-04-22 11:13:34 +02:00
mudler 67781838d3 [builder/sabayon-buildpackages] safe copy /usr/local/portage 2016-04-21 22:01:22 +02:00
mudler 69d8e28ac1 [builder] fixing permissions on local overlay 2016-04-21 21:52:41 +02:00
mudler b491ffccae [builder] check if the content is already there before appending content to file 2016-04-21 21:30:09 +02:00
mudler 066fb07d72 [builder] typo fixes 2016-04-17 19:47:01 +02:00
mudler c89721ab2e [builder] dropping equo (un)mask call, writing directly to packages.(un)mask files 2016-04-16 16:20:28 +02:00
mudler ea3d87a48a [sabayon-createrepo-*] adding gpg key support 2016-04-14 23:28:25 +02:00
mudler d1481e915f [builder] equo (s)mask should be done before installing any packages 2016-04-13 16:08:36 +02:00
mudler b185a1536b [sabayon-buildpackages] typo fix 2016-04-11 21:35:19 +02:00
mudler b089771d17 [builder/sabayon-buildpackages] adding support for equo (un)mask 2016-04-11 21:27:33 +02:00
mudler f81e90d555 [builder] don't exit if no args are given, allowing creating up-to-dated container with all set-up for compilation also if no args are given. adding --help 2016-04-08 19:20:20 +02:00
mudler fb930cdeb3 [builder] add support for BUILD_INJECTED_ARGS 2016-04-08 19:09:06 +02:00
mudler a904bbcbe1 [sabayon-createrepo] adding information output of repo creation phases 2016-04-08 00:51:08 +02:00
mudler ccd4a760f4 [sabayon-createrepo] fixing eit key signing 2016-04-08 00:47:59 +02:00
mudler 0944d27ce9 [sabayon-createrepo] fixing typo 2016-04-08 00:17:42 +02:00
mudler d248206aaa [sabayon-createrepo] push after repository initialization 2016-04-07 22:11:55 +02:00
mudler 65c62a3d8a [sabayon-*] executables 2016-04-07 21:06:13 +02:00
mudler 3be8ff13d1 [sabayon-help-info] adding script to collect system information to allow easy sharing for assistance 2016-04-07 21:05:59 +02:00
mudler 99cae9c7d1 [sabayon-createrepo] don't import keys if already exists 2016-04-07 16:09:09 +02:00
mudler d0df62c8f6 [sabayon-createrepo] signing old packages before injecting new ones 2016-04-06 21:48:28 +02:00
mudler 6ee7ef7845 [builder] show in logs the devkit version 2016-03-29 19:07:48 +02:00
mudler b212b4ce8b [sabayon-buildpackages builder] support for REPOSITORY_NAME and ENMAN_ADD_SELF 2016-03-29 18:58:46 +02:00
mudler c7fce5fd62 [builder] adding revdep-rebuild in preserved_rebuild phase. if an user enables it, it is sane to call also revdep-rebuild 2016-03-29 18:23:20 +02:00
mudler 330eb6faef [builder] adding notes on why we do safe_call during equo install phases 2016-03-29 12:18:07 +02:00
mudler 1e993271ec [builder] code cleanup 2016-03-29 12:07:50 +02:00
mudler 4a1e3e1f41 [builder] use safe_call for system calls that are vital. If they don't succeds they will bail out the build 2016-03-29 12:07:37 +02:00
Ettore Di Giacinto 62548482d5 Merge pull request #11 from optiz0r/feature_optional_prune_virtuals
Allow virtual dependency pruning to be controlled by env var
2016-03-28 14:40:15 +02:00
Ben Roberts cc406e3924 Allow virtual dependency pruning to be controlled by env var
Defaults to off, while the stability of virtual pruning is checked
2016-03-28 13:22:00 +01:00
Ettore Di Giacinto 5a19da9db7 Merge pull request #9 from optiz0r/feature_dont_reinstall
Don't reinstall already installed atoms
2016-03-27 20:49:32 +02:00
Ettore Di Giacinto 523146cf2b Merge pull request #10 from optiz0r/feature_control_mirrorsort
Allow controlling equo mirrorsort within the docker container
2016-03-27 20:43:43 +02:00
Ben Roberts 7bff7825d6 Allow controlling equo mirrorsort within the docker container 2016-03-27 17:39:11 +01:00
Ben Roberts 114eb47a4b Don't reinstall already installed atoms
Fixes Sabayon/community-buildspec#5
2016-03-27 17:05:50 +01:00
mudler 68841b4876 [sabayon-buildpackages] add support for FEATURES 2016-03-26 18:42:48 +01:00
mudler 267870a699 [sabayon-buildpackages] hide env variables echo 2016-03-26 12:38:02 +01:00
mudler 0831363686 [sabayon-buildpackages] adding support for distcc 2016-03-25 22:13:30 +01:00
mudler 0f776e4dd8 [builder] consider a build successfully when running with splitted emerge 2016-03-25 15:34:50 +01:00
mudler 8261606b8b [sabayon-buildpackages] adding support for ENMAN_REPOSITORIES 2016-03-25 14:24:09 +01:00
mudler 71403285a4 adding ENMAN_REPOSITORIES to supply a space-separated list of entropy repositories to add with enman 2016-03-25 14:12:21 +01:00
mudler dd53f6a35e keep our internal say() version 2016-03-23 16:01:41 +01:00
mudler 0e41fbd168 dumb fix 2016-03-23 15:55:11 +01:00
mudler ce0272bd29 enable emerge --info informations to be displayed *always* on build, it will not be parametrized on purpose 2016-03-23 15:54:24 +01:00
mudler 4eee9a7fbc [builder] adjust output 2016-03-23 15:48:49 +01:00
mudler 320f75cd46 [sabayon-buildpackages] supporting EMERGE_SPLIT_INSTALL 2016-03-23 00:19:56 +01:00
mudler e9c671b65e [builder] adding EMERGE_SPLIT_INSTALL 2016-03-23 00:19:04 +01:00
mudler e07cb53932 [sabayon-createrepo-cleanup sabayon-createrepo-remove] respect DOCKER_OPTS 2016-03-22 14:35:57 +01:00
Ettore Di Giacinto 51d7bdc968 Merge pull request #7 from optiz0r/feature_package_deps_cache
Add brackets to uniq to fix compilation error
2016-03-21 21:59:19 +01:00
Ben Roberts 79d3d5d4b5 Add brackets to uniq to fix compilation error 2016-03-21 20:54:57 +00:00
Ettore Di Giacinto 2c05cdce52 Merge pull request #6 from optiz0r/feature_package_deps_cache
Cache results of package_deps and re-enable virtual dep stripping
2016-03-20 21:01:57 +01:00
Ben Roberts a55856cb97 Revert to using locally defined uniq 2016-03-20 19:59:56 +00:00
Ben Roberts 967cd9708a Cache results of package_deps and re-enable virtual dep stripping
It's likely that some virtuals are dependencies of multiple package arguments
to builder and the depgraph would be queried multiple times. This commit
caches the results to avoid expensive duplicate shell execs and optimise for
speed.

Additionally, when calls to equery depgraph match multiple packages (e.g.
the query is for an unversioned atom, and multiple versions exist in the
portage tree), the results for all versions are returned, resulting in
duplicates. This change also strips out the duplicate entries so further
work need only be done once.

This uses perl 5.10's `state` variables, so adds the appropriate use. Since
Sabayon ships only perl 5.20, this should not be an issue.
2016-03-20 19:43:20 +00:00
mudler 566e4603c8 [sabayon-createrepo] sign won't return true also if succeeds but repos have to be synced 2016-03-18 17:53:38 +01:00
mudler 55bb3cc44e enabling package signing 2016-03-18 14:33:12 +01:00
Ettore Di Giacinto 502b85b84b [createrepo] adding KEYS env variable 2016-03-18 00:23:47 +01:00
mudler c17228fc05 [builder] reverting virtual exclusion, prevents building and end in an infinite loop 2016-03-15 11:05:19 +01:00
mudler a4ce1e8300 suppressing useless output 2016-03-06 20:43:35 +01:00
mudler 67a689f217 [builder sabayon-buildpackages] renaming SKIP_SYNC in SKIP_PORTAGE_SYNC 2016-03-06 20:37:02 +01:00
mudler 2c38ae1c0c [builder sabayon-buildpackages] adding SKIP_SYNC and WEBRSYNC to control portage sync 2016-03-06 20:04:52 +01:00
mudler f35a2e14cd [builder] dumb fix to virtual's dependencies exclusion 2016-03-06 19:54:24 +01:00
mudler 23d9c86cae [builder] minor changes, fix to virtual's dependencies exclusion 2016-03-06 19:42:59 +01:00
Ettore Di Giacinto c7d05296f9 Merge pull request #5 from optiz0r/feature_handle_virtual_dependencies
Don't install dependencies brought in by virtual packages
2016-03-06 19:41:22 +01:00
Ben Roberts 1c29cba964 Don't install dependencies brought in by virtual packages
When calculating the missing dependencies for an ebuild to be installed
by entropy, it's necessary to walk two levels deep minimum to handle meta
packages and split ebuilds. This has a nasty side effect for virtual packages
since all the potential candidates that could satisfy the virtual are
included. This means for anything that has a dependency on virtual/jdk, every
possible jdk is installed side-by-side. For anything that depends on
virtual/mta, every possible mta is installed one by one (because these conflict
and substitute each other, each subsequent install uninstalls the previous
package which is a massive waste of time, bandwidth and effort).

This commit walks through the dependency list looking for any virtual packages.
For each one, the first-level dependencies of the virtual are collected. Only
dependencies of the target package which are not also dependencies of the virtual
are installed. This means only one package that satisfies the virtual will end up
being installed.
2016-03-06 17:35:53 +00:00
mudler 5895b63ef6 [builder] moving @Installed_Packages chomp to a more logic part 2016-03-06 17:00:55 +01:00
mudler 90121cd3b8 [builder] fix, force shift to be evaluated in expression context inside dereference 2016-03-06 16:59:33 +01:00
mudler caf7e76b9b [sabayon-buildpackages] read DEPENDENCY_SCAN_DEPTH env variable and propagating to builder #4 2016-03-06 13:39:36 +01:00
mudler 42dab39689 [builder] checking if installation of packages is required at all #3 2016-03-06 13:24:54 +01:00
mudler aebe2c8783 [builder] Speed up Available/Installed Packages computation #3 2016-03-06 13:13:55 +01:00
mudler f37168a9e8 [builder] enabling depth override with DEPENDENCY_SCAN_DEPTH env variable #4 2016-03-06 13:03:14 +01:00
Ettore Di Giacinto c40be91df5 Merge pull request #1 from optiz0r/bugfix_dont_reinstall_deps
Fix equo query to prevent dependencies being reinstalled
2016-03-06 12:38:59 +01:00
Ettore Di Giacinto aa31b5865b Merge pull request #2 from optiz0r/feature_disable_mirrorsort
Allow disabling mirrorsort with EQUO_MIRRORSORT=0 env var
2016-03-06 12:33:30 +01:00
Ben Roberts cea7504964 Allow disabling mirrorsort with EQUO_MIRRORSORT=0 env var
When doing repeated testing, the mirrorsort can add unwanted delay.
This commit adds support for setting EQUO_MIRRORSORT=0 to disable this
and use the default sort order while testing.
It preserves the previous behaviour and defaults to 1.
2016-03-05 22:52:20 +00:00
Ben Roberts 3d51d160c5 Remove workaround for equery output not being quiet as requested 2016-03-05 22:47:49 +00:00
Ben Roberts cbd7a010ba Fix equo query to prevent dependencies being reinstalled
Call to equo query puts arg '--quiet' in the wrong place, receiving
prettified output which doesn't match string comparisons against
package names, leading to all dependencies being reinstalled every
time. This commit puts the --quiet arg in to correct place so that
only missing dependencies are installed.
2016-03-05 20:17:19 +00:00
mudler c3e313ef60 add sabayon-tbz2truncate 2016-03-03 00:43:00 +01:00
mudler 0f1f702c66 add sabayon-tbz2extract and sabayon-xpakextract 2016-03-02 21:19:12 +01:00
mudler c9effe3053 portage should be mounted before the other caches directories 2016-03-02 17:21:08 +01:00
mudler 20056cb0d5 [sabayon-buildpackages] adding PORTAGE_CACHE env variable 2016-03-02 14:07:50 +01:00
mudler 1076f1c2e3 ENTROPY_DOWNLOADED_PACKAGES defaults to entropy defaults 2016-02-28 15:48:54 +01:00
mudler f29cd8dabc [sabayon-buildpackages] enabling mounting of ENTROPY_DOWNLOADED_PACKAGES, but must be in complete form (localdirectory:containerdirectory) since it's arch-dependent 2016-02-28 13:52:41 +01:00
mudler a228567ab9 [sabayon-createrepo] dumb fix 2016-02-27 12:11:44 +01:00
mudler 26389080f2 calling equo rm if necessary 2016-02-26 23:49:40 +01:00
mudler 59ef11dc13 [sabayon-buildpackages] now with REMOTE_OVERLAY you can specify a git repository to clone instead of a local one 2016-02-25 23:00:50 +01:00
mudler aa11986503 [sabayon-buildpackages] adding DISTFILES env 2016-02-25 21:48:17 +01:00
mudler a37db57b82 entrypoint in createrepo is forced 2016-02-24 22:11:48 +01:00
mudler 88fb0d890a adding DOCKER_OPTS 2016-02-24 22:06:28 +01:00
mudler 1d14348bd8 adding --remove to remove packages with equo before the build 2016-02-24 17:52:33 +01:00
mudler 4af1209a33 fix OUTPUT_DIR instead WORKSPACE 2016-02-24 14:47:25 +01:00
mudler a13f89ee22 adding tools to remove packages and cleanup 2016-02-23 22:50:27 +01:00
mudler fae9e91583 adding brokenlibs checker scripts 2016-02-22 16:37:54 +01:00
mudler c7abf2e24b Adding sabayon-entropypreservedlibs, enabling ENTROPY_REPO environment to define which repo enable before upgrade in the builder script 2016-02-21 23:27:27 +01:00
Ettore Di Giacinto b07d658d88 [script/builder] default repo is main 2016-02-19 22:42:39 +01:00
mudler 18148617ea [builder] disabling quiet build as default emerge options 2016-02-15 00:01:28 +01:00
mudler 11f56726d5 [createrepo] using custom image for eit usage 2016-02-12 11:21:00 +01:00
15 changed files with 872 additions and 92 deletions
+1 -2
View File
@@ -25,5 +25,4 @@ install:
install -m 0755 builder $(DESTDIR)/$(USBINDIR)/
install -d $(DESTDIR)/$(UBINDIR)
install -m 0755 sabayon-buildpackages $(DESTDIR)/$(UBINDIR)/
install -m 0755 sabayon-createrepo $(DESTDIR)/$(UBINDIR)/
install -m 0755 sabayon-* $(DESTDIR)/$(UBINDIR)/
+3 -1
View File
@@ -11,7 +11,7 @@ sudo equo i sabayon-devkit
## Prerequisites
* docker installed in the machine (`sudo equo i docker`), and the daemon started (`sudo systemctl start docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`), or granting permission to yourself adding your user to the sudoer file.
Packages can be built in a clean environment with docker by running `sabayon-buildpackages`.
@@ -92,6 +92,8 @@ you can override the Architecture folder in which files are placed specifying in
- DOCKER_PULL_IMAGE -- tells the script to update the docker image before compiling, enable it with 1, disable with 0
- OUTPUT_DIR -- optional, default to "portage_artifacts" in your current working directory, it is the path where emerge generated tbz2 are stored (absolute path)
- LOCAL_OVERLAY -- optional, you can specify the path to your local overlay (absolute path)
- REMOTE_OVERLAY -- optional, a space separated list of overlays that can be cloned with git.
The arguments are the packages that you want compile, they can be also in the complete form *e.g. =foo-bar/misc-1.2*
+402 -71
View File
@@ -1,45 +1,157 @@
#!/usr/bin/env perl
use Getopt::Long;
use v5.10;
no feature "say";
my $profile = $ENV{BUILDER_PROFILE} // 3;
my $jobs = $ENV{BUILDER_JOBS} // 1;
my $use_equo = $ENV{USE_EQUO} // 1;
my $preserved_rebuild = $ENV{PRESERVED_REBUILD} // 0;
my $emerge_defaults_args = $ENV{EMERGE_DEFAULTS_ARGS}
// "--accept-properties=-interactive --verbose --oneshot --nospinner --quiet-build=y --complete-graph --buildpkg";
// "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg";
$ENV{FEATURES} = $ENV{FEATURES}
// "parallel-fetch protect-owned compressdebug splitdebug -userpriv";
my $equo_install_atoms = $ENV{EQUO_INSTALL_ATOMS} // 1;
my $equo_install_version = $ENV{EQUO_INSTALL_VERSION} // 0;
my $equo_split_install = $ENV{EQUO_SPLIT_INSTALL} // 0;
my $artifacts_folder = $ENV{ARTIFACTS_DIR};
my $equo_split_install = $ENV{EQUO_SPLIT_INSTALL} // 1;
my $equo_mirrorsort = $ENV{EQUO_MIRRORSORT} // 1;
my $entropy_repository = $ENV{ENTROPY_REPOSITORY}
// "main"; # Can be weekly, main, testing
my $artifacts_folder = $ENV{ARTIFACTS_DIR};
my $dep_scan_depth = $ENV{DEPENDENCY_SCAN_DEPTH} // 2;
my $skip_portage_sync = $ENV{SKIP_PORTAGE_SYNC} // 0;
my $emerge_split_install = $ENV{EMERGE_SPLIT_INSTALL} // 0;
my $webrsync = $ENV{WEBRSYNC} // 0;
my $enman_repositories = $ENV{ENMAN_REPOSITORIES};
my $emerge_remove = $ENV{EMERGE_REMOVE};
my $remove_enman_repositories = $ENV{REMOVE_ENMAN_REPOSITORIES};
my $remove_remote_overlay = $ENV{REMOVE_REMOTE_OVERLAY};
my $remove_layman_overlay = $ENV{REMOVE_LAYMAN_OVERLAY};
my $prune_virtuals = $ENV{PRUNE_VIRTUALS} // 0;
my $repository_name = $ENV{REPOSITORY_NAME};
my $enman_add_self = $ENV{ENMAN_ADD_SELF} // 0;
my $build_injected_args = $ENV{BUILD_INJECTED_ARGS};
my $equo_masks = $ENV{EQUO_MASKS};
my $equo_unmasks = $ENV{EQUO_UNMASKS};
my $equo_install_args = $ENV{EQUO_INSTALL_ARGS} // "--multifetch=10";
my $remote_overlay = $ENV{REMOTE_OVERLAY};
my $repoman_check = $ENV{QA_CHECKS} // 0;
my $remote_conf_portdir = $ENV{REMOTE_CONF_PORTDIR};
my $remote_portdir = $ENV{REMOTE_PORTDIR};
my $make_conf = $ENV{MAKE_CONF};
my @overlays;
my $help = 0;
GetOptions(
'layman|overlay:s{,}' => \@overlays,
'equo|install:s{,}' => \@equo_install,
'equorm|remove:s{,}' => \@equo_remove,
'help|?' => \$help
);
GetOptions( 'layman|overlay:s{,}' => \@overlays, 'equo|install:s{,}' => \@equo_install );
help() if $help;
if ( @ARGV == 0 ) {
help();
die();
}
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
$ENV{ETP_NONINTERACTIVE} = 1;
$ENV{ACCEPT_LICENSE} = "*"; # we can use wildcard since entropy 302
# A barely print replacement
sub say { print join( "\n", @_ ) . "\n"; }
sub safe_call {
my $cmd = shift;
my $rt = system($cmd);
my $return = $rt >> 8;
exit($return) if ($rt);
}
sub append_to_file {
my ( $file_name, $package ) = @_;
if ( -f $file_name ) {
# Check that the package was not already there
open my $fh_ro, '<:encoding(UTF-8)', $file_name
or die("Cannot open: $file_name");
while ( my $line = <$fh_ro> ) {
return if $line eq $package . "\n";
}
close $fh_ro;
}
open( my $fh_a, '>>', $file_name )
or die "Could not open file '$filename' $!";
print $fh_a $package . "\n";
close $fh_a;
}
sub add_portage_repository {
my $repo = $_[0];
my $reponame;
my $sync_type;
my @repodef = split( /\|/, $repo );
( $reponame, $repo ) = @repodef if ( @repodef == 2 );
( $reponame, $sync_type, $repo ) = @repodef if ( @repodef == 3 );
# try to detect sync-type
if ( !$sync_type ) {
$sync_type = ( split( /\:/, $repo ) )[0];
$sync_type = "git"
if $repo =~ /github|bitbucket/
or $sync_type eq "https"
or $sync_type eq "http";
$sync_type = "svn" if $repo =~ /\/svn\//;
}
$reponame = ( split( /\//, $repo ) )[-1] if !$reponame;
$reponame =~ s/\.|//g; #clean
system("mkdir -p /etc/portage/repos.conf/")
if ( !-d "/etc/portage/repos.conf/" );
say "==== Adding $reponame ====";
qx{
echo '[$reponame]
location = /usr/local/overlay/$reponame
sync-type = $sync_type
sync-uri = $repo
auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
}; # Declaring the repo and giving priority
system("emaint sync -r $reponame");
}
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
sub package_deps {
my $package = shift;
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $atom = shift // 0;
return
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
# Since we expect this sub to be called multiple times with the same arguments, cache the results
state %cache;
$cache_key = "${package}:${depth}:${atom}";
if ( !exists $cache{$cache_key} ) {
@dependencies =
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
chomp @dependencies;
# If an unversioned atom is given, equery returns results for all versions in the portage tree
# leading to duplicates. The sanest thing to do is dedup the list. This gives the superset of all
# possible dependencies, which isn't perfectly accurate but should be good enough. For completely
# accurate results, pass in a versioned atom.
@dependencies = uniq(
sort
grep { $_ }
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
@dependencies
);
$cache{$cache_key} = \@dependencies;
}
return @{ $cache{$cache_key} };
}
#Input: nothing
@@ -56,26 +168,43 @@ sub available_packages {
# Input: package (sys-fs/foobarfs)
# Output: Array of packages to be installed, that aren't installed in a Sabayon machine
sub calculate_missing {
my $package = shift;
my $depth = shift;
my $package = shift;
my $depth = shift;
my @Installed_Packages = @{ +shift };
my @Available_Packages = @{ +shift };
my $prune_virtuals = shift;
# Getting the package dependencies and the installed packages
say "[$package] Getting the package dependencies and the installed packages";
my @Packages = package_deps( $package, $depth, 1 );
my @Installed_Packages = qx/equo q --quiet list installed/;
chomp(@Installed_Packages);
say "[$package] Getting the package dependencies and the installed packages";
my @dependencies = package_deps( $package, $depth, 1 );
if ($prune_virtuals) {
say "[$package] Pruning dependencies of virtual packages";
my %install_dependencies = map { $_ => 1 } @dependencies;
# Look for any virtuals and remove its immediate dependencies to avoid
# installing multiple conflicting packages one by one
my @virtual_deps;
for my $dep (@dependencies) {
push( @virtual_deps, package_deps( $dep, 1, 1 ) )
if ( $dep =~ /^virtual\// );
}
for my $dep (@virtual_deps) {
$install_dependencies{$dep} = 0 if ( $dep !~ /^virtual\// );
}
@dependencies = grep { $install_dependencies{$_} } @dependencies;
}
#taking only the 4th column of output as key of the hashmap
my %installed_packs =
map { ( split( /\s/, $_ ) )[3] => 1 } @Installed_Packages;
my %available_packs = map { $_ => 1 } available_packages();
map { $_ => 1 } @Installed_Packages;
my %available_packs = map { $_ => 1 } @Available_Packages;
# removing from packages the one that are already installed and keeping only the available in the entropy repositories
my @to_install = grep( defined $available_packs{$_},
uniq( grep( !defined $installed_packs{$_}, @Packages ) ) );
@to_install=grep { length } @to_install;
say "[$package] packages that will be installed with equo: @to_install" if @to_install>0;
uniq( grep( !defined $installed_packs{$_}, @dependencies ) ) );
@to_install = grep { length } @to_install;
say "[$package] packages that will be installed with equo: @to_install"
if @to_install > 0;
return @to_install;
}
@@ -90,17 +219,66 @@ sub uniq {
keys %{ { map { $_ => 1 } @_ } };
}
sub detect_useflags
{ # Detect useflags defined as [-alsa,avahi] in atom, and fill $hash within the $target sub-hash
my ( $hash, $target, $packages ) = @_;
my @packs = @{$packages};
for my $i ( 0 .. $#packs ) {
if ( $packages->[$i] =~ /\[(.*?)\]/ ) {
my $flags = $1;
$packages->[$i] =~ s/\[.*?\]//g;
$hash->{$target}->[$i] = [ +split( /,/, $flags ) ];
}
}
}
sub compile_packs {
my ( $per_package_useflags, $target, @packages ) = @_;
my $extra_arg;
$extra_arg = "-B" if $target eq "injected_targets";
my $package_counter = 0;
my $return;
for my $pack (@packages) {
my $tmp_rt;
say "\n" x 2, "==== Compiling $pack ====", "\n" x 2;
if ( defined $per_package_useflags->{$target}->[$package_counter]
and @{ $per_package_useflags->{$target}->[$package_counter] } > 0 )
{
say "USEFLAGS: "
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } );
$tmp_rt = system(
"USE=\""
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } )
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg $pack"
);
}
else {
$tmp_rt =
system("emerge $emerge_defaults_args -j $jobs $extra_arg $pack");
}
$package_counter++;
$return = $tmp_rt
if ( $? == -1 or $? & 127 or !$rt )
; # if one fails, the build should be considered failed!
}
return $return;
}
sub help {
say "-> You should feed me with something", "", "Examples:", "",
"\t$0 app-text/tree", "\t$0 plasma-meta --layman kde", "",
"\t$0 app-foo/foobar --equo foo-misc/foobar --equo net-foo/foobar --layman foo --layman bar foo",
"\t$0 app-foo/foobar --equo foo-misc/foobar --equo net-foo/foobar --layman foo --layman bar foo",
"**************************", "",
"You can supply multiple overlays as well: $0 plasma-meta --layman kde plab",
"The documentation is available at https://github.com/Sabayon/devkit",
"";
exit 0;
}
say
"************* IF YOU WANT TO SUPPLY ADDITIONAL ARGS TO EMERGE, pass to docker EMERGE_DEFAULT_OPTS env with your options *************";
say "****************************************************";
if ( @overlays > 0 ) {
say "Overlay(s) to add";
@@ -109,22 +287,32 @@ if ( @overlays > 0 ) {
}
}
say "Installing:";
say "[*] Installing:";
say "\t* " . $_ for @ARGV;
say "* Syncing stuff for you, if it's the first time, can take a while";
say "[*] Syncing configurations files, Layman and Portage";
# Syncronizing portage configuration and adding overlays
system("echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen"); #be sure about that.
system(
"cd /etc/portage/;git checkout master; git stash; git pull"
);
if (`uname -m` eq "x86_64\n"){
system(
"cd /etc/portage/;rm -rfv make.conf;ln -s make.conf.amd64 make.conf"
);
# If defined, fetch a remote /etc/portage
if ( $remote_conf_portdir ne "" ) {
system("rm -rf /etc/portage");
system("git clone $remote_conf_portdir /etc/portage");
system("chown -R portage:portage /etc/portage");
system("chmod -R ug+w,a+rX /etc/portage");
}
else {
system("cd /etc/portage/;git checkout master; git stash; git pull");
}
# If defined, fetch a remote /usr/portage
if ( $remote_portdir ne "" ) {
system("rm -rf /usr/portage");
system("git clone $remote_portdir /usr/portage");
system("chown -R portage:portage /usr/portage");
system("chmod -R ug+w,a+rX /usr/portage");
}
system("echo 'y' | layman -f -a $_") for @overlays;
@@ -132,11 +320,14 @@ system("echo 'y' | layman -f -a $_") for @overlays;
my $reponame = "LocalOverlay";
# Setting up a local overlay if doesn't exists
system(
"rm -rf /usr/local/portage;cp -rf /usr/local/local_portage /usr/local/portage"
) if ( -d "/usr/local/local_portage" );
if ( !-f "/usr/local/portage/profiles/repo_name" ) {
system("mkdir -p /usr/local/portage/{metadata,profiles}");
system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
system("echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
system("chown -R portage:portage /usr/local/portage");
}
else {
open FILE, "</usr/local/portage/profiles/repo_name";
@@ -145,6 +336,8 @@ else {
chomp(@FILE);
$reponame = $FILE[0];
}
system("chown -R portage:portage /usr/local/portage");
system("chmod -R 755 /usr/local/portage");
qx{
echo '[$reponame]
@@ -154,53 +347,191 @@ priority=9999
auto-sync = no' > /etc/portage/repos.conf/local.conf
}; # Declaring the repo and giving priority
if ( $remote_overlay and $remote_overlay ne "" ) {
add_portage_repository($_) for ( split( / /, $remote_overlay ) );
}
if ( $remove_layman_overlay and $remove_layman_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
system("layman -d $_") for ( split( / /, $remove_layman_overlay ) );
}
if ( $remove_remote_overlay and $remove_remote_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
system( "rm -rfv /etc/portage/" . $_ . ".conf" )
for ( split( / /, $remote_overlay ) );
}
system("mkdir -p /usr/portage/distfiles/git3-src");
# sync portage and overlays
system("layman -S;emerge --sync");
unless ( $skip_portage_sync == 1 ) {
# preparing for MOAR automation
qx|eselect profile set $profile|;
qx{ls /usr/portage/licenses -1 | xargs -0 > /etc/entropy/packages/license.accept}
; #HAHA
system("equo repo mirrorsort sabayonlinux.org;equo up && equo u")
if $use_equo; # Better don't be behind
system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
qx|echo 'ACCEPT_LICENSE="*"' >> /etc/portage/make.conf|; #just plain evil
my @packages = @ARGV;
if ($use_equo) {
my @packages_deps;
foreach my $p (@packages) {
say "[$p] Getting the package dependencies which aren't already installed on the system.. ";
push( @packages_deps, calculate_missing( $p , 2) )
if $equo_install_atoms;
push( @packages_deps, package_deps( $p, 2, 0 ) )
if $equo_install_version;
say "[$p] Done"
}
@packages_deps = grep { defined() and length() } @packages_deps; #cleaning
say "", "[install] Installing missing dependencies with equo", @packages_deps, "";
if ($equo_split_install) {
system("equo i --bdeps $_") for (@packages_deps,@equo_install);
# sync portage and overlays
system("layman -S");
if ( $webrsync == 1 ) {
system("emerge-webrsync");
}
else {
system("equo i --bdeps @packages_deps @equo_install");
system("emerge --sync");
}
}
say "* Ready to compile, finger crossed";
# preparing for MOAR automation
qx|eselect profile set $profile|;
my $rt = system("emerge $emerge_defaults_args -j $jobs @packages");
if ( $use_equo && $entropy_repository eq "weekly" ) {
qx|equo repo disable sabayonlinux.org|;
qx|equo repo enable sabayon-weekly|;
}
elsif ( $use_equo && $entropy_repository eq "testing" ) {
qx|equo repo disable sabayon-weekly|;
qx|equo repo enable sabayonlinux.org|;
qx|equo repo enable sabayon-limbo|;
}
if ($use_equo) {
say "Devkit version:";
system("equo s -vq app-misc/sabayon-devkit");
if ( $enman_repositories and $enman_repositories ne "" ) {
my @enman_toadd = split( / /, $enman_repositories );
safe_call("enman add $_") for @enman_toadd;
}
if ( $remove_enman_repositories and $remove_enman_repositories ne "" ) {
my @enman_toremove = split( / /, $remove_enman_repositories );
system("enman remove $_") for @enman_toremove;
}
system("enman add $repository_name")
if ( $enman_add_self and $repository_name and $repository_name ne "" );
system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
system("equo up && equo u");
}
system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
my $per_package_useflags;
my @packages = @ARGV;
my @injected_packages = ();
if ($build_injected_args) {
@injected_packages = split( / /, $build_injected_args );
say "[*] Injected installs:";
say "\t* " . $_ for @injected_packages;
}
# Allow users to specify atoms as: media-tv/kodi[-alsa,avahi]
if ($emerge_split_install)
{ # For targets this will be available only if split_install is enabled
detect_useflags( $per_package_useflags, "targets", \@packages );
}
else {
map { $_ =~ s/\[.*?\]//g; $_; }
@packages
; # Clean up [] if user didn't specified split_install, but specified a useflag combination
}
detect_useflags( $per_package_useflags, "injected_targets",
\@injected_packages );
if ($use_equo) {
# best effort mask
if ($equo_masks) {
append_to_file( "/etc/entropy/packages/package.mask", $_ )
for ( split( / /, $equo_masks ) );
}
# best effort unmask
if ($equo_unmasks) {
append_to_file( "/etc/entropy/packages/package.unmask", $_ )
for ( split( / /, $equo_unmasks ) );
}
my @packages_deps;
my @Installed_Packages = qx/equo q list installed --quiet/;
my @Available_Packages = available_packages();
chomp(@Installed_Packages);
my %installed_packs =
map { $_ => 1 } @Installed_Packages;
# Remove any already installed packages from the list of entropy packages to install in the build spec
@equo_install = grep { !exists $installed_packs{$_} } @equo_install;
foreach my $p (@packages) {
say
"[$p] Getting the package dependencies which aren't already installed on the system.. ";
push(
@packages_deps,
calculate_missing(
$p, $dep_scan_depth,
\@Installed_Packages, \@Available_Packages,
$prune_virtuals
)
) if $equo_install_atoms;
push( @packages_deps, package_deps( $p, $dep_scan_depth, 0 ) )
if $equo_install_version;
}
@packages_deps = grep { defined() and length() } @packages_deps; #cleaning
say "", "[install] Those dependencies will be installed with equo :",
@packages_deps, "";
if ($equo_split_install) {
safe_call("equo i $equo_install_args --bdeps $_")
for ( @packages_deps, @equo_install )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
if ( @equo_remove > 0 ) {
system("equo rm --nodeps $_") for (@equo_remove);
}
}
else {
safe_call(
"equo i $equo_install_args --bdeps @packages_deps @equo_install")
if ( @packages_deps > 0 or @equo_install > 0 )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
system("equo rm --nodeps @equo_remove") if ( @equo_remove > 0 );
}
}
if ( $repoman_check == 1 ) {
say "*** Repoman checks ***";
for ( @packages, @injected_packages ) {
say "*** QA checks for $_";
system(
"pushd \$(dirname \$(equery which $_ 2>/dev/null)); repoman; popd");
}
}
say "*** Ready to compile, finger crossed ***";
system("emerge --info")
; #always give detailed information about the building environment, helpful to debug
my $rt;
if ( $emerge_remove and $emerge_remove ne "" ) {
system("emerge -C $_") for split( / /, $emerge_remove );
}
if ($emerge_split_install) {
compile_packs( $per_package_useflags, "targets", @packages );
$rt = 0; #consider the build good anyway, like a "keep-going"
}
else {
$rt = system("emerge $emerge_defaults_args -j $jobs @packages");
}
my $return = $rt >> 8;
# best effort -B
compile_packs( $per_package_useflags, "injected_targets", @injected_packages );
if ($preserved_rebuild) {
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
system("revdep-rebuild");
}
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
PACKAGES=()
bin=$1
. /sbin/sabayondevkit-functions.sh
[ -z "$bin" ] && die "No Arg given"
# Getting linked libraries
for i in $(ldd $1 | cut -d \( -f1 | cut -d \> -f2 | grep "/" | xargs echo)
do
package=$(equo q belongs -q $i)
[ -z "$package" ] && die "borked: $i"
PACKAGES+=($package)
done
# Unique and ordered
U_PACKAGES=$(echo "${PACKAGES[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
if [ "${#PACKAGES}" -ne 0 ]; then
for i in ${U_PACKAGES[@]}
do
echo " $i"
done
fi
+33 -4
View File
@@ -7,6 +7,8 @@ DOCKER_PULL_IMAGE="${DOCKER_PULL_IMAGE:-0}"
MAKE_CONF="${MAKE_CONF:-$SAB_WORKSPACE/specs/make.conf}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/portage_artifacts/}"
LOCAL_OVERLAY="${LOCAL_OVERLAY:-$SAB_WORKSPACE/local_overlay}"
ENTROPY_REPOSITORY="${ENTROPY_REPOSITORY:-main}" # Can be weekly, main, testing
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
. /sbin/sabayondevkit-functions.sh
@@ -19,16 +21,42 @@ fi
docker_env=(-e "LC_ALL=en_US.UTF-8")
docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -z "$PORTAGE_CACHE" ] || docker_volumes+=(-v "$PORTAGE_CACHE:/usr/portage")
[ -z "$BUILDER_PROFILE" ] || docker_env+=(-e "BUILDER_PROFILE=$BUILDER_PROFILE")
[ -z "$EMERGE_SPLIT_INSTALL" ] || docker_env+=(-e "EMERGE_SPLIT_INSTALL=$EMERGE_SPLIT_INSTALL")
[ -z "$BUILDER_JOBS" ] || docker_env+=(-e "BUILDER_JOBS=$BUILDER_JOBS")
[ -z "$USE_EQUO" ] || docker_env+=(-e "USE_EQUO=$USE_EQUO")
[ -z "$PRESERVED_REBUILD" ] || docker_env+=(-e "PRESERVED_REBUILD=$PRESERVED_REBUILD")
[ -z "$EQUO_INSTALL_ATOMS" ] || docker_env+=(-e "EQUO_INSTALL_ATOMS=$EQUO_INSTALL_ATOMS")
[ -z "$DEPENDENCY_SCAN_DEPTH" ] || docker_env+=(-e "DEPENDENCY_SCAN_DEPTH=$DEPENDENCY_SCAN_DEPTH")
[ -z "$FEATURES" ] || docker_env+=(-e "FEATURES=$FEATURES")
[ -z "$EMERGE_DEFAULTS_ARGS" ] || docker_env+=(-e "EMERGE_DEFAULTS_ARGS=$EMERGE_DEFAULTS_ARGS")
[ -z "$EQUO_INSTALL_VERSION" ] || docker_env+=(-e "EQUO_INSTALL_VERSION=$EQUO_INSTALL_VERSION")
[ -z "$EQUO_SPLIT_INSTALL" ] || docker_env+=(-e "EQUO_SPLIT_INSTALL=$EQUO_SPLIT_INSTALL")
[ -z "$ARTIFACTS_DIR" ] || docker_env+=(-e "ARTIFACTS_DIR=$ARTIFACTS_DIR")
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/portage")
[ -z "$ENTROPY_REPOSITORY" ] || docker_env+=(-e "ENTROPY_REPOSITORY=$ENTROPY_REPOSITORY")
[ -z "$SKIP_PORTAGE_SYNC" ] || docker_env+=(-e "SKIP_PORTAGE_SYNC=$SKIP_PORTAGE_SYNC")
[ -z "$EQUO_MIRRORSORT" ] || docker_env+=(-e "EQUO_MIRRORSORT=$EQUO_MIRRORSORT")
[ -z "$WEBRSYNC" ] || docker_env+=(-e "WEBRSYNC=$WEBRSYNC")
[ -z "$ENMAN_REPOSITORIES" ] || docker_env+=(-e "ENMAN_REPOSITORIES=$ENMAN_REPOSITORIES")
[ -z "$REMOVE_ENMAN_REPOSITORIES" ] || docker_env+=(-e "REMOVE_ENMAN_REPOSITORIES=$REMOVE_ENMAN_REPOSITORIES")
[ -z "$DISTFILES" ] || docker_volumes+=(-v "$DISTFILES:/usr/portage/distfiles")
[ -z "$ENTROPY_DOWNLOADED_PACKAGES" ] || docker_volumes+=(-v "$ENTROPY_DOWNLOADED_PACKAGES:/var/lib/entropy/client/packages")
[ -z "$DISTCC_HOSTS" ] || docker_env+=(-e "DISTCC_HOSTS=$DISTCC_HOSTS")
[ -z "${PRUNE_VIRTUALS}" ] || docker_env+=(-e "PRUNE_VIRTUALS=$PRUNE_VIRTUALS")
[ -z "$REPOSITORY_NAME" ] || docker_env+=(-e "REPOSITORY_NAME=$REPOSITORY_NAME")
[ -z "$ENMAN_ADD_SELF" ] || docker_env+=(-e "ENMAN_ADD_SELF=$ENMAN_ADD_SELF")
[ -z "$EQUO_MASKS" ] || docker_env+=(-e "EQUO_MASKS=$EQUO_MASKS")
[ -z "$EQUO_UNMASKS" ] || docker_env+=(-e "EQUO_UNMASKS=$EQUO_UNMASKS")
[ -z "$EMERGE_REMOVE" ] || docker_env+=(-e "EMERGE_REMOVE=$EMERGE_REMOVE")
[ -z "$REMOTE_OVERLAY" ] || docker_env+=(-e "REMOTE_OVERLAY=$REMOTE_OVERLAY")
[ -z "$REMOVE_LAYMAN_OVERLAY" ] || docker_env+=(-e "REMOVE_LAYMAN_OVERLAY=$REMOVE_LAYMAN_OVERLAY")
[ -z "$REMOVE_REMOTE_OVERLAY" ] || docker_env+=(-e "REMOVE_REMOTE_OVERLAY=$REMOVE_REMOTE_OVERLAY")
[ -z "$QA_CHECKS" ] || docker_env+=(-e "QA_CHECKS=$QA_CHECKS")
[ -z "$REMOTE_CONF_PORTDIR" ] || docker_env+=(-e "REMOTE_CONF_PORTDIR=$REMOTE_CONF_PORTDIR")
[ -z "$REMOTE_PORTDIR" ] || docker_env+=(-e "REMOTE_PORTDIR=$REMOTE_PORTDIR")
[ -z "$ETP_NOCACHE" ] || docker_env+=(-e "ETP_NOCACHE=$ETP_NOCACHE")
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/local_portage")
if [ -e $MAKE_CONF ]; then
echo "You specified a make.conf. I hope you know what are you doing"
@@ -45,13 +73,14 @@ if [ -d "$SAB_WORKSPACE"/specs ]; then
[ -e "$SAB_WORKSPACE"/specs/custom.mask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.mask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.mask/99-custom.mask")
[ -e "$SAB_WORKSPACE"/specs/custom.unmask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.unmask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.unmask/99-custom.unmask")
[ -e "$SAB_WORKSPACE"/specs/custom.use ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.use:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.use/99-custom.use")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env/99-custom.env")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env")
[ -e "$SAB_WORKSPACE"/specs/custom.keywords ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.keywords:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.keywords/99-custom.keywords")
[ -d "$SAB_WORKSPACE"/specs/env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/env/:/opt/sabayon-build/conf/$SAB_ARCH/portage/env/")
fi
echo "Spawning the package builder container for '$@'."
echo ""
echo "docker run --rm ${docker_env[@]} ${docker_volumes[@]} -ti $DOCKER_IMAGE $@"
#echo "docker run $DOCKER_OPTS ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE $@"
docker run --rm "${docker_env[@]}" "${docker_volumes[@]}" -ti $DOCKER_IMAGE $@
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE $@
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
. /sbin/sabayondevkit-functions.sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
WORK_DIR=`mktemp -d -p "$DIR"`
# deletes the temp directory
function cleanup {
rm -rf "$WORK_DIR"
}
# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
tbz=$1
[ -z "$tbz" ] && die "No Arg given"
tar xjf "$tbz" -C "$WORK_DIR"
for file in $(find "$WORK_DIR" | xargs echo)
do
[ -f "$file" ] && /usr/bin/sabayon-brokenlibs "$file"
done
+29 -10
View File
@@ -7,9 +7,10 @@ entropysrv=$(mktemp)
createrepo=$(mktemp)
REPOSITORY_NAME="${REPOSITORY_NAME:-default}"
REPOSITORY_DESCRIPTION="${REPOSITORY_DESCRIPTION:-My Sabayon repository}"
DOCKER_IMAGE="${DOCKER_IMAGE:-sabayon/builder-amd64}"
DOCKER_IMAGE="${DOCKER_IMAGE:-sabayon/eit-amd64}"
PORTAGE_ARTIFACTS="${PORTAGE_ARTIFACTS:-$SAB_WORKSPACE/portage_artifacts}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/entropy_artifacts}"
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
args=("$@")
EDITOR=cat
@@ -24,6 +25,10 @@ docker_volumes=(
-v "$entropysrv:/etc/entropy/server.conf"
)
[ -z "$PUBKEY" ] || docker_volumes+=(-v "$PUBKEY:/etc/entropy/mykeys/key.pub")
[ -z "$PRIVATEKEY" ] || docker_volumes+=(-v "$PRIVATEKEY:/etc/entropy/mykeys/private.key")
if [ $# -eq 0 ]
then
docker_volumes+=(-v "$PORTAGE_ARTIFACTS:/usr/portage/packages" )
@@ -44,22 +49,29 @@ cat >$createrepo <<EOF
set -e
built_pkgs=\$(find /usr/portage/packages -name "*.tbz2" | xargs)
repo="\${REPOSITORY:-default}"
equo i entropy-server
mkdir -p /sabayon/artifacts
[[ -z "\${built_pkgs}" ]] && echo "ERROR: no tbz2s found" && exit 2
if [ -d "/sabayon/artifacts/standard" ]; then
echo "=== Repository already exists, syncronizing ==="
eit unlock \$repo || true
eit pull --quick $repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "=== Repository is empty, intializing ==="
echo "Yes" | eit init --quick \$repo
eit push --quick --force
fi
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
echo "=== Injecting packages ==="
echo "Yes" | eit inject \${built_pkgs} || { echo "ouch unable to inject" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
echo "=== Pushing built packages locally ==="
eit push --quick --force
EOF
@@ -90,12 +102,19 @@ default-repository = $REPOSITORY_NAME
repository=$REPOSITORY_NAME|$REPOSITORY_DESCRIPTION|file:///sabayon/artifacts
EOF
echo "docker run --rm --entrypoint /bin/bash ${docker_env[@]} ${docker_volumes[@]} -ti $DOCKER_IMAGE /sabayon/bin/create_repo.sh"
function cleanup {
rm -rf $createrepo
rm -rf $entropysrv
}
docker run --rm --entrypoint /bin/bash "${docker_env[@]}" "${docker_volumes[@]}" -ti $DOCKER_IMAGE /sabayon/bin/create_repo.sh || true
trap cleanup EXIT
if [ -d "$SAB_WORKSPACE/entropy_artifacts/standard" ]; then
echo "The Sabayon repository files are in $SAB_WORKSPACE/entropy_artifacts"
echo "docker $DOCKER_OPTS ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE /sabayon/bin/create_repo.sh"
docker run $DOCKER_OPTS --entrypoint /bin/bash "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE /sabayon/bin/create_repo.sh || true
if [ -d "$OUTPUT_DIR/standard" ]; then
echo "The Sabayon repository files are in $OUTPUT_DIR"
echo "Now you can upload its content where you want"
echo ""
@@ -104,9 +123,9 @@ if [ -d "$SAB_WORKSPACE/entropy_artifacts/standard" ]; then
echo "
[$REPOSITORY_NAME]
desc = $REPOSITORY_DESCRIPTION
repo=file://$SAB_WORKSPACE/entropy_artifacts#bz2
repo=file://$OUTPUT_DIR#bz2
enabled = true
pkg = file://$SAB_WORKSPACE/entropy_artifacts
pkg = file://$OUTPUT_DIR
"
else
echo "Something failed :("
+99
View File
@@ -0,0 +1,99 @@
#!/bin/bash
set -e
. /sbin/sabayondevkit-functions.sh
SAB_WORKSPACE="${SAB_WORKSPACE:-$PWD}"
entropysrv=$(mktemp)
createrepo=$(mktemp)
REPOSITORY_NAME="${REPOSITORY_NAME:-default}"
REPOSITORY_DESCRIPTION="${REPOSITORY_DESCRIPTION:-My Sabayon repository}"
DOCKER_IMAGE="${DOCKER_IMAGE:-sabayon/eit-amd64}"
PORTAGE_ARTIFACTS="${PORTAGE_ARTIFACTS:-$SAB_WORKSPACE/portage_artifacts}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/entropy_artifacts}"
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
args=("$@")
EDITOR=cat
docker_env=(-e "EDITOR=$EDITOR"
-e "REPOSITORY=$REPOSITORY_NAME"
-e "LC_ALL=en_US.UTF-8")
docker_volumes=(
-v "$OUTPUT_DIR:/sabayon/artifacts"
-v "$createrepo:/sabayon/bin/create_repo.sh"
-v "$entropysrv:/etc/entropy/server.conf"
-v "$PORTAGE_ARTIFACTS:/usr/portage/packages" )
[ -z "$PUBKEY" ] || docker_volumes+=(-v "$PUBKEY:/etc/entropy/mykeys/key.pub")
[ -z "$PRIVATEKEY" ] || docker_volumes+=(-v "$PRIVATEKEY:/etc/entropy/mykeys/private.key")
check_docker_requirements
echo "Repository: $REPOSITORY_NAME"
echo "Repository Description: $REPOSITORY_DESCRIPTION"
echo "Remove: ${args[@]}"
# Creating the building script on-the-fly
cat >$createrepo <<EOF
#!/bin/bash
set -e
repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
fi
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
eit clean --quick || { echo "ouch unable to remove" && exit 3; }
eit vacuum --quick || { echo "ouch unable to remove" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
eit push --quick --force
EOF
chmod +x $createrepo
# Creating the entropy repository configuration on-the-fly
cat >$entropysrv <<EOF
# expiration-days = <internal value>
community-mode = enable
weak-package-files = disable
database-format = bz2
# sync-speed-limit =
# server-basic-languages = en_US C
# disabled-eapis = 1,2
# expiration-based-scope = disable
# nonfree-packages-directory-support = disable
rss-feed = disable
changelog = disable
rss-name = packages.rss
rss-base-url = http://packages.sabayon.org/?quicksearch=
rss-website-url = http://www.sabayon.org/
max-rss-entries = 10000
# max-rss-light-entries = 100
rss-light-name = updates.rss
managing-editor =
broken-reverse-deps = disable
default-repository = $REPOSITORY_NAME
repository=$REPOSITORY_NAME|$REPOSITORY_DESCRIPTION|file:///sabayon/artifacts
EOF
function cleanup {
rm -rf $createrepo
rm -rf $entropysrv
}
trap cleanup EXIT
echo "docker run $DOCKER_OPTS --entrypoint /bin/bash ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE /sabayon/bin/create_repo.sh"
docker run $DOCKER_OPTS --entrypoint /bin/bash "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE /sabayon/bin/create_repo.sh || true
+96
View File
@@ -0,0 +1,96 @@
#!/bin/bash
set -e
. /sbin/sabayondevkit-functions.sh
SAB_WORKSPACE="${SAB_WORKSPACE:-$PWD}"
entropysrv=$(mktemp)
createrepo=$(mktemp)
REPOSITORY_NAME="${REPOSITORY_NAME:-default}"
REPOSITORY_DESCRIPTION="${REPOSITORY_DESCRIPTION:-My Sabayon repository}"
DOCKER_IMAGE="${DOCKER_IMAGE:-sabayon/eit-amd64}"
PORTAGE_ARTIFACTS="${PORTAGE_ARTIFACTS:-$SAB_WORKSPACE/portage_artifacts}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/entropy_artifacts}"
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
args=("$@")
EDITOR=cat
docker_env=(-e "EDITOR=$EDITOR"
-e "REPOSITORY=$REPOSITORY_NAME"
-e "LC_ALL=en_US.UTF-8")
docker_volumes=(
-v "$OUTPUT_DIR:/sabayon/artifacts"
-v "$createrepo:/sabayon/bin/create_repo.sh"
-v "$entropysrv:/etc/entropy/server.conf"
-v "$PORTAGE_ARTIFACTS:/usr/portage/packages" )
[ -z "$PUBKEY" ] || docker_volumes+=(-v "$PUBKEY:/etc/entropy/mykeys/key.pub")
[ -z "$PRIVATEKEY" ] || docker_volumes+=(-v "$PRIVATEKEY:/etc/entropy/mykeys/private.key")
check_docker_requirements
echo "Repository: $REPOSITORY_NAME"
echo "Repository Description: $REPOSITORY_DESCRIPTION"
echo "Remove: ${args[@]}"
# Creating the building script on-the-fly
cat >$createrepo <<EOF
#!/bin/bash
set -e
repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
fi
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
echo "Yes" | eit rm --from \$repo ${args[@]} || { echo "ouch unable to remove" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
eit push --quick --force
EOF
chmod +x $createrepo
# Creating the entropy repository configuration on-the-fly
cat >$entropysrv <<EOF
# expiration-days = <internal value>
community-mode = enable
weak-package-files = disable
database-format = bz2
# sync-speed-limit =
# server-basic-languages = en_US C
# disabled-eapis = 1,2
# expiration-based-scope = disable
# nonfree-packages-directory-support = disable
rss-feed = disable
changelog = disable
rss-name = packages.rss
rss-base-url = http://packages.sabayon.org/?quicksearch=
rss-website-url = http://www.sabayon.org/
max-rss-entries = 10000
# max-rss-light-entries = 100
rss-light-name = updates.rss
managing-editor =
broken-reverse-deps = disable
default-repository = $REPOSITORY_NAME
repository=$REPOSITORY_NAME|$REPOSITORY_DESCRIPTION|file:///sabayon/artifacts
EOF
function cleanup {
rm -rf $createrepo
rm -rf $entropysrv
}
trap cleanup EXIT
echo "docker run $DOCKER_OPTS --entrypoint /bin/bash ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE /sabayon/bin/create_repo.sh"
docker run $DOCKER_OPTS --entrypoint /bin/bash "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE /sabayon/bin/create_repo.sh || true
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/perl
# Author: mudler@sabayonlinux.org, skullbocks@sabayonlinux.org
use strict;
use DBI;
use feature 'say';
my $arch = $ENV{ARCH} // "amd64";
my $dbh = DBI->connect(
"dbi:SQLite:dbname=/var/lib/entropy/client/database/$arch/equo.db",
"", "", { RaiseError => 1 },
) or die $DBI::errstr;
my $to_build = {};
my $sth = $dbh->prepare(
"SELECT DISTINCT baseinfo.category, baseinfo.name, baseinfo.version FROM baseinfo JOIN needed_libs ON baseinfo.idpackage = needed_libs.idpackage JOIN preserved_libs ON needed_libs.soname = preserved_libs.library"
);
$sth->execute();
my $row;
while ( $row = $sth->fetchrow_arrayref() ) {
$to_build->{"@$row[0]/@$row[1]-@$row[2]"}++;
}
$sth->finish();
my $to_install = join( " ", keys %{$to_build} );
if ( $to_install ne "" ) {
say "Those packages seems to request libs no longer available: $to_install";
}
else {
say "No packages request outdated libs";
}
$dbh->disconnect();
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
sudo bash << EOF
echo "Grabbing system informations, the url to share will happear in a minute"
(echo 'lspci'; lspci; echo 'network'; ifconfig -a; echo 'drivers'; lsmod; find /lib/modules; echo 'kernel'; uname -a) | pastebunz
EOF
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/python
# mudler <mudler@sabayon.org>
# Edit: create a truncated tbz2 with just data
import os
import sys
from portage import xpak
def usage():
sys.stderr.write("usage: %s <tbz2_file>\n" % os.path.basename(sys.argv[0]))
def main():
if len(sys.argv) != 2:
usage()
return 1
input_file = sys.argv[1]
if not os.path.isfile(input_file):
usage()
return 1
output_file = input_file
if output_file.endswith('.tbz2'):
output_file = output_file[:-5]
output_file += '.truncated'
t = xpak.tbz2(input_file)
t.scan()
f = open(input_file, 'rb')
data = f.read(os.stat(input_file).st_size - t.xpaksize)
f.close()
f = open(output_file, 'wb')
f.write(data)
f.close()
return 0
if __name__ == '__main__':
sys.exit(main())
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/python
# mudler <mudler@sabayon.org>
# Edit: truncate a tbz2 with just data
import os
import sys
from portage import xpak
def usage():
sys.stderr.write("usage: %s <tbz2_file>\n" % os.path.basename(sys.argv[0]))
def main():
if len(sys.argv) != 2:
usage()
return 1
input_file = sys.argv[1]
if not os.path.isfile(input_file):
usage()
return 1
t = xpak.tbz2(input_file)
t.scan()
f = open(input_file, 'r+')
f.seek(-t.xpaksize, os.SEEK_END)
f.truncate()
f.close()
return 0
if __name__ == '__main__':
sys.exit(main())
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/python
import os
import sys
from portage import xpak
def usage():
sys.stderr.write("usage: %s <tbz2_file>\n" % os.path.basename(sys.argv[0]))
def main():
if len(sys.argv) != 2:
usage()
return 1
input_file = sys.argv[1]
if not os.path.isfile(input_file):
usage()
return 1
output_file = input_file
if output_file.endswith('.tbz2'):
output_file = output_file[:-5]
output_file += '.xpak'
t = xpak.tbz2(input_file)
t.scan()
f = open(input_file, 'rb')
f.seek(-t.xpaksize, 2)
data = f.read()
f.close()
f = open(output_file, 'wb')
f.write(data)
f.close()
return 0
if __name__ == '__main__':
sys.exit(main())
+7 -4
View File
@@ -4,14 +4,17 @@ check_docker_requirements(){
if [ "$(id -u)" != "0" ]; then
groups | grep -q docker || echo "--> If you are not running the script as root, your user should be in the docker group to use it. (sudo gpasswd -a $USER docker)"
fi
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && sudo systemctl start docker
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && sudo systemctl start docker || true
}
die() { echo "$@" 1>&2 ; exit 1; }
build() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --verbose --oneshot --nospinner --noreplace --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
done
@@ -19,11 +22,11 @@ for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo
build_installed() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --newuse --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --newuse --noreplace --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
for i in $(EIX_LIMIT=0 eix -I --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
#emerge $EMERGE_DEFAULT_ARGS -o $i && \
echo "Building $i"
emerge $EMERGE_DEFAULT_ARGS $i
done
}