#!/bin/bash echo "[i] Verifying if /dev/null is a device" if [ ! -c /dev/null ]; then echo "[!] /dev/null appears to NOT be a device! This issue will be repaired." rm -f /dev/null mknod -m 666 /dev/null c 1 3 chown root:root /dev/null if [ ! -c /dev/null ]; then echo "[!] The issue could not be repaired. Manual intervention is required." /bin/sh fi echo "/dev/null has been fixed." fi echo "PATH=/usr/bin:/usr/local/bin:/usr/sbin" > /etc/environment chmod 755 /bin/bash chown root:root /bin/bash echo "Switched to Einrichter-in-chroot mode. Type eic.help for list of commands, exit to exit." function main() { read -p "einrichter/eic> " OPT $OPT main } function eic.help() { echo " eic.dirs.create - set up directories eic.essentials.create - set up essentials eic.essentials.install - install essential tools eic.essentials.verify - verify installation eic.clean - clean up environment eic.bugfix.RrX - runs bugfix RrX which extracts the packages again eic.system.build - build the system eic.system.build.gcc - build GCC. this has been put in a separate function because building GCC alone takes 46 SBU. eic.system.build.continue - continue building the system after successfully building GCC eic.strip - removes unnecessary debug symbols eic.system.build.clean - clean up files after the build process eic.config.network.devicenaming - sets up network interface names eic.config.network.staticip - creates basic config for static ip eic.config.network.dhcp - sets up a basic IPv4 DHCP config eic.config.network.systemd.resolve - enables/disables systemd-resolved service eic.config.network.hostname - writes hostname to /etc/hostname eic.config.network.staticresolver - use static /etc/resolv.conf configuration after disabling systemd-resolved eic.config.time.createAdj - adjust /etc/adjtime to local time if hardware clock is set to that eic.config.time.clarifyUTC - tell systemd-timedated your hardware clock is set to UTC/Local Time (only works when booted) eic.config.time.set - enter the time to set in YYYY-MM-DD HH:MM:SS format (only works when booted) eic.config.time.tz - set a timezone. use command 'timedatectl list-timezones' to get a list of all timezones (only works when booted) eic.config.time.nts - switch systemd's Network Time Synchronisation on or off eic.config.console.preset - wipe /etc/vconsole.conf and simply write 'FONT=Lat2-Terminus16' to it eic.config.console.keymap - write default keymap to /etc/vconsole.conf eic.config.create.inputrc - creates the simple but necessary /etc/inputrc file eic.config.create.shells - creates the simple but necessary /etc/shells file eic.config.systemd.disableScreenClearing - decide whether systemd should clear the screen at the end of the boot sequence or not eic.config.systemd.limitCoreDumpSize <(Number)(G/M/K/B) - limits core dump size to value specified as argument eic.linux.install - the final boss: install the Linux kernel to the system. can take 0.4-32 SBUs (typically 2.5), MIGHT also be heavy eic.rpm.install - installs RPM eic.tdnf.install - installs VMware Photon's RPM frontend: TDNF (tiny dandified yum) eic.help - show this message " } function eic.dirs.create() { mkdir -pv /{boot,home,mnt,opt,srv} mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/lib/locale mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp } function eic.essentials.create() { ln -s /bin/bash /bin/sh ln -sv /proc/self/mounts /etc/mtab cat > /etc/hosts << EOF 127.0.0.1 localhost $(hostname) ::1 localhost EOF cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/usr/bin/false daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false EOF cat > /etc/group << "EOF" root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: cdrom:x:15: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: kvm:x:61: systemd-journal-gateway:x:73: systemd-journal-remote:x:74: systemd-journal-upload:x:75: systemd-network:x:76: systemd-resolve:x:77: systemd-timesync:x:78: systemd-coredump:x:79: uuidd:x:80: systemd-oom:x:81: wheel:x:97: users:x:999: nogroup:x:65534: EOF localedef -i C -f UTF-8 C.UTF-8 echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp } function eic.essentials.install() { pushd /sources/ || eic.error D404_SRC pushd gettext/ ./configure --disable-shared make cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin popd pushd bison/ ./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.8.2 make make install popd pushd perl/ sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D useshrplib \ -D privlib=/usr/lib/perl5/5.40/core_perl \ -D archlib=/usr/lib/perl5/5.40/core_perl \ -D sitelib=/usr/lib/perl5/5.40/site_perl \ -D sitearch=/usr/lib/perl5/5.40/site_perl \ -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \ -D vendorarch=/usr/lib/perl5/5.40/vendor_perl make make install popd pushd python/ ./configure --prefix=/usr \ --enable-shared \ --without-ensurepip make make install popd pushd texinfo/ ./configure --prefix=/usr make make install popd pushd util-linux/ mkdir -pv /var/lib/hwclock ./configure --libdir=/usr/lib \ --runstatedir=/run \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --disable-liblastlog2 \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.40.2 make make install popd popd } function eic.essentials.verify() { ver_check Gettext gettext 0.22.5 ver_check Bison bison 3.8.2 ver_check Perl perl 5.40.0 ver_check Python python3 3.12.5 ver_check Texinfo info 7.1 ver_check Util-linux cal 2.40.2 } function eic.clean() { rm -rf /usr/share/{info,man,doc}/* find /usr/{lib,libexec} -name \*.la -delete rm -rf /tools } function eic.system.build() { pushd /sources pushd man-pages rm -v man3/crypt* make prefix=/usr install popd pushd iana-etc-20240806 cp services protocols /etc popd pushd glibc/ patch -Np1 -i ../glibc-2.40-fhs-1.patch rm -r build mkdir -v build cd build echo "rootsbindir=/usr/sbin" > configparms ../configure --prefix=/usr \ --disable-werror \ --enable-kernel=4.19 \ --enable-stack-protector=strong \ --disable-nscd \ libc_cv_slibdir=/usr/lib make make check echo "[!] Please read! There are cases where Glibc fails the test, and in SOME cases they may be safe to ignore! Please read the recent output to see if only two to three test failed. If io/tst-lchmod failed, that is normal. It is known to fail in the TylkoLinux live environment." echo "[i] Some tests, for example nss/tst-nss-files-hosts-multi and nptl/tst-thread-affinity\* are known to fail due to a timeout (especially when the system is relatively slow and/or running the test suite with multiple parallel make jobs). These tests can be identified with: $ grep \"Timed out\" \$(find -name \*.out) It is possible to re-run a single test with enlarged timeout with \"TIMEOUTFACTOR= make test t=\". For example, \"TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi\" will re-run nss/tst-nss-files-hosts-multi with ten times the original timeout. Additionally, some tests may fail with a relatively old CPU model (for example elf/tst-cpu-features-cpuinfo) or host kernel version (for example stdlib/tst-arc4random-thread). " read -p "[i] To enter a shell and verify the test (or re-run), press enter now. " OPT echo "[i] Run \"exit\" to return to the installer when done." /bin/sh touch /etc/ld.so.conf sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile make install sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd localedef -i C -f UTF-8 C.UTF-8 localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i el_GR -f ISO-8859-7 el_GR localedef -i en_GB -f ISO-8859-1 en_GB localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_ES -f ISO-8859-15 es_ES@euro localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i is_IS -f ISO-8859-1 is_IS localedef -i is_IS -f UTF-8 is_IS.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f ISO-8859-15 it_IT@euro localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i se_NO -f UTF-8 se_NO.UTF-8 localedef -i ta_IN -f UTF-8 ta_IN.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS localedef -i zh_TW -f UTF-8 zh_TW.UTF-8 echo "[i] Add an additional locale you'd like to add by defining it in the shell below, using the localedef command. Exit when done." /bin/sh localedef -i C -f UTF-8 C.UTF-8 localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files systemd group: files systemd shadow: files systemd hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF tar -xvf ../../tzdata2024a.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward; do zic -L /dev/null -d $ZONEINFO ${tz} zic -L /dev/null -d $ZONEINFO/posix ${tz} zic -L leapseconds -d $ZONEINFO/right ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO eic.system.build.tz() { tzselect read -p "[i] Type the timezone that has been outputted (with the slash): " TZ ln -sfv /usr/share/zoneinfo/$TZ /etc/localtime || eic.system.build.tz } eic.system-build.tz cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF cat >> /etc/ld.so.conf << "EOF" # Add an include directory include /etc/ld.so.conf.d/*.conf EOF mkdir -pv /etc/ld.so.conf.d popd pushd zlib/ ./configure --prefix=/usr make make check make install rm -fv /usr/lib/libz.a popd pushd bzip2/ patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile make -f Makefile-libbz2_so make clean make CFLAGS="-fPIC" LDFLAGS="-fPIC" make PREFIX=/usr install cp -av libbz2.so.* /usr/lib ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so cp -v bzip2-shared /usr/bin/bzip2 for i in /usr/bin/{bzcat,bunzip2}; do ln -sfv bzip2 $i done rm -fv /usr/lib/libbz2.a popd pushd xz/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.6.2 make make check make install popd pushd lz4/ make BUILD_STATIC=no PREFIX=/usr make -j1 check make BUILD_STATIC=no PREFIX=/usr install popd pushd zstd/ make prefix=/usr make check make prefix=/usr install rm -v /usr/lib/libzstd.a popd pushd file/ ./configure --prefix=/usr make make check make install popd pushd readline/ sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install sed -i 's/-Wl,-rpath,[^ ]*//' support/shobj-conf ./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.2.13 make SHLIB_LIBS="-lncursesw" make SHLIB_LIBS="-lncursesw" install install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2.13 popd pushd m4/ ./configure --prefix=/usr make make check make install popd pushd bc/ CC=gcc ./configure --prefix=/usr -G -O3 -r make make test make install popd pushd flex/ ./configure --prefix=/usr \ --docdir=/usr/share/doc/flex-2.6.4 \ --disable-static make make check make install ln -sv flex /usr/bin/lex ln -sv flex.1 /usr/share/man/man1/lex.1 popd pushd tcl/ SRCDIR=$(pwd) cd unix ./configure --prefix=/usr \ --mandir=/usr/share/man \ --disable-rpath make sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.7|/usr/lib/tdbc1.1.7|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7|/usr/include|" \ -i pkgs/tdbc1.1.7/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.4|/usr/lib/itcl4.2.4|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4|/usr/include|" \ -i pkgs/itcl4.2.4/itclConfig.sh unset SRCDIR make test make install chmod -v u+w /usr/lib/libtcl8.6.so make install-private-headers ln -sfv tclsh8.6 /usr/bin/tclsh mv /usr/share/man/man3/{Thread,Tcl_Thread}.3 cd .. tar -xf ../tcl8.6.14-html.tar.gz --strip-components=1 mkdir -v -p /usr/share/doc/tcl-8.6.14 cp -v -r ./html/* /usr/share/doc/tcl-8.6.14 popd pushd expect/ eic.system.build.expect.intervention() { if [[ $(python3 -c 'from pty import spawn; spawn(["echo", "ok"])') != "ok" ]]; then echo "[i] PS: The error is caused by the chroot environment not being set up for proper PTY operation." read -p "[!] Answer unexpected. Continue, enter shell or quit? [c/s/q]: " OPT case "$OPT" in c) echo "OK!" ;; s) /bin/sh eic.system.build.expect.intervention ;; q) exit 1 ;; *) echo "Invalid command!" eic.system.build.expect.intervention ;; esac fi } eic.system.build.expect.intervention patch -Np1 -i ../expect-5.45.4-gcc14-1.patch ./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --disable-rpath \ --mandir=/usr/share/man \ --with-tclinclude=/usr/include make make test make install ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib popd pushd dejagnu/ mkdir -v build cd build ../configure --prefix=/usr makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi make check make install install -v -dm755 /usr/share/doc/dejagnu-1.6.3 install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3 popd pushd pkgconf/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/pkgconf-2.3.0 make make install ln -sv pkgconf /usr/bin/pkg-config ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1 popd pushd binutils/ rm -r build mkdir -v build cd build ../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd \ --enable-new-dtags \ --with-system-zlib \ --enable-default-hash-style=gnu make tooldir=/usr make -k check grep '^FAIL:' $(find -name '*.log') make tooldir=/usr install rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a popd pushd gmp/ ./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --host=none-linux-gnu \ --docdir=/usr/share/doc/gmp-6.3.0 make make html make check 2>&1 | tee gmp-check-log GMP_CHECK=$(awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log) eic.system.build.gmp.intervention() { if [ ! "$GMP_CHECK" -ge "199" ]; then echo "[i] PS: The check did not reach the minimum amount of passed tests required." read -p "[!] Answer unexpected. Continue, enter shell or quit? [c/s/q]: " OPT case "$OPT" in c) echo "OK!" ;; s) /bin/sh eic.system.build.gmp.intervention ;; q) exit 1 ;; *) echo "Invalid command!" eic.system.build.gmp.intervention ;; esac fi } eic.system.build.gmp.intervention make install make install-html popd pushd mpfr/ ./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-4.2.1 make make html make check make install make install-html popd pushd mpc/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.3.1 make make html make check make install make install-html popd pushd attr/ ./configure --prefix=/usr \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.5.2 make make check make install popd pushd acl/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/acl-2.3.2 make make install popd pushd libcap/ sed -i '/install -m.*STA/d' libcap/Makefile make prefix=/usr lib=lib make test make prefix=/usr lib=lib install popd pushd libxcrypt/ ./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=no \ --disable-static \ --disable-failure-tokens make make check make install echo "[i] Reinstalling with ABIv1 features..." make distclean ./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=glibc \ --disable-static \ --disable-failure-tokens make cp -av --remove-destination .libs/libcrypt.so.1* /usr/lib popd pushd shadow/ sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \; sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \ -e 's:/var/spool/mail:/var/mail:' \ -e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \ -i etc/login.defs touch /usr/bin/passwd ./configure --sysconfdir=/etc \ --disable-static \ --with-{b,yes}crypt \ --without-libbsd \ --with-group-name-max-length=32 make make exec_prefix=/usr install make -C man install-man pwconv grpconv mkdir -p /etc/default useradd -D --gid 999 sed -i '/MAIL/s/yes/no/' /etc/default/useradd echo "[i] Set the new root password." passwd root popd popd } function eic.system.build.gcc() { pushd /sources/ pushd gcc/ case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac rm -rv build mkdir -v build cd build ../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --enable-default-pie \ --enable-default-ssp \ --enable-host-pie \ --disable-multilib \ --disable-bootstrap \ --disable-fixincludes \ --with-system-zlib make ulimit -s -H unlimited sed -e '/cpython/d' -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp sed -e 's/no-pic /&-no-pie /' -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c sed -e 's/300000/(1|300000)/' -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c sed -e 's/{ target nonpic } //' \ -e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c eic.system.build.gcc.ask() { read -p "Pending step: Running test suite. Run, skip or quit? [R/S/Q]: " OPT case "$OPT" in R) chown -R tester . su tester -c "PATH=$PATH make -k check" ../contrib/test_summary > /eilogs/8.29-gcc-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.gcc.ask ;; esac } eic.system.build.gcc.ask read -p "[i] Press enter to continue." ANY make install chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/14.2.0/include{,-fixed} ln -svr /usr/bin/cpp /usr/lib ln -sv gcc.1 /usr/share/man/man1/cc.1 ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/14.2.0/liblto_plugin.so \ /usr/lib/bfd-plugins/ echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib' grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log || read -p "[!] The toolchain did not find the correct start files. Press enter to continue." ANY grep -B4 '^ /usr/include' dummy.log || read -p "[!] The toolchain did not find the correct header files. Press enter to continue." ANY grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' || read -p "[!] The toolchain was unable to verify that the new linker is being used with the correct search paths. Press enter to continue." ANY grep "/lib.*/libc.so.6 " dummy.log || read -p "[!] The toolchain did not find the correct libc. Press enter to continue." ANY grep found dummy.log || read -p "[!] The toolchain did not find the correct dynamic linker. Press enter to continue." ANY rm -v dummy.c a.out dummy.log mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib popd popd echo "[i] Finished building GCC" } function eic.system.build.continue() { pushd /sources/ pushd ncurses/ ./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --with-cxx-shared \ --enable-pc-files \ --with-pkg-config-libdir=/usr/lib/pkgconfig make make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/libncursesw.so.6.5 /usr/lib rm -v dest/usr/lib/libncursesw.so.6.5 sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i dest/usr/include/curses.h cp -av dest/* / for lib in ncurses form panel menu ; do ln -sfv lib${lib}w.so /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc done ln -sfv libncursesw.so /usr/lib/libcurses.so cp -v -R doc -T /usr/share/doc/ncurses-6.5 popd pushd sed/ ./configure --prefix=/usr make make html chown -R tester . su tester -c "PATH=$PATH make check" make install install -d -m755 /usr/share/doc/sed-4.9 install -m644 doc/sed.html /usr/share/doc/sed-4.9 popd pushd psmisc/ ./configure --prefix=/usr make make check make install popd pushd gettext/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.22.5 make eic.system.build.continue.gettext.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) make check > /eilogs/8.33-gettext-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.gettext.ask ;; esac } eic.system.build.continue.gettext.ask make install chmod -v 0755 /usr/lib/preloadable_libintl.so popd pushd bison/ ./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2 make eic.system.build.continue.bison.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) make check > /eilogs/8.34-bison-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.bison.ask ;; esac } eic.system.build.continue.bison.ask make install popd pushd grep/ sed -i "s/echo/#echo/" src/egrep.sh ./configure --prefix=/usr make make check make install popd pushd bash/ ./configure --prefix=/usr \ --without-bash-malloc \ --with-installed-readline \ bash_cv_strtold_broken=no \ --docdir=/usr/share/doc/bash-5.2.32 make eic.system.build.continue.bash.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) chown -R tester . su -s /usr/bin/expect tester << "EOF" set timeout -1 spawn make tests expect eof lassign [wait] _ _ _ value exit $value EOF ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.bash.ask ;; esac } eic.system.build.continue.bash.ask make install popd pushd libtool/ ./configure --prefix=/usr make make -k check > /eilogs/8.37-libtool-test.log make install rm -fv /usr/lib/libltdl.a popd pushd gdbm/ ./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat make make check make install popd pushd gperf/ ./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1 make make -j1 check make install popd pushd expat/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/expat-2.6.4 make make check make install install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.6.4 popd pushd inetutils/ sed -i 's/def HAVE_TERMCAP_TGETENT/ 1/' telnet/telnet.c ./configure --prefix=/usr \ --bindir=/usr/bin \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers make make check make install mv -v /usr/{,s}bin/ifconfig popd pushd less/ ./configure --prefix=/usr --sysconfdir=/etc make make check make install popd pushd perl/ export BUILD_ZLIB=False export BUILD_BZIP2=0 sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D privlib=/usr/lib/perl5/5.40/core_perl \ -D archlib=/usr/lib/perl5/5.40/core_perl \ -D sitelib=/usr/lib/perl5/5.40/site_perl \ -D sitearch=/usr/lib/perl5/5.40/site_perl \ -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \ -D vendorarch=/usr/lib/perl5/5.40/vendor_perl \ -D man1dir=/usr/share/man/man1 \ -D man3dir=/usr/share/man/man3 \ -D pager="/usr/bin/less -isR" \ -D useshrplib \ -D usethreads make make install eic.system.build.continue.perl.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) TEST_JOBS=$(nproc) make test_harness > /eilogs/8.43-perl-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.perl.ask ;; esac } eic.system.build.continue.perl.ask make install unset BUILD_ZLIB BUILD_BZIP2 popd pushd XML-Parser/ perl Makefile.PL make make test make install popd pushd intltool/ sed -i 's:\\\${:\\\$\\{:' intltool-update.in ./configure --prefix=/usr make make check make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO popd pushd autoconf/ ./configure --prefix=/usr make eic.system.build.continue.autoconf.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) make check > /eilogs/8.46-autoconf-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.autoconf.ask ;; esac } eic.system.build.continue.autoconf.ask make install popd pushd automake/ ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.17 make eic.system.build.continue.automake.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) make -j$(($(nproc)>4?$(nproc):4)) check > /eilogs/8.47-automake-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.automake.ask ;; esac } eic.system.build.continue.automake.ask make install popd pushd openssl/ ./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic make HARNESS_JOBS=$(nproc) make test > /eilogs/8.48-openssl-test.log sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile make MANSUFFIX=ssl install mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.3.1 cp -vfr doc/* /usr/share/doc/openssl-3.3.1 popd pushd kmod ./configure --prefix=/usr \ --sysconfdir=/etc \ --with-openssl \ --with-xz \ --with-zstd \ --with-zlib \ --disable-manpages make make install for target in depmod insmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /usr/sbin/$target rm -fv /usr/bin/$target done popd pushd elfutils/ ./configure --prefix=/usr \ --disable-debuginfod \ --enable-libdebuginfod=dummy make make check make -C libelf install install -vm644 config/libelf.pc /usr/lib/pkgconfig rm /usr/lib/libelf.a popd pushd libffi/ ./configure --prefix=/usr \ --disable-static \ --with-gcc-arch=native make make check make install popd pushd python/ ./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --enable-optimizations make eic.system.build.continue.python.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) make test TESTOPTS="--timeout 120" > /eilogs/8.52-python-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.python.ask ;; esac } eic.system.build.continue.python.ask make install cat > /etc/pip.conf << EOF [global] root-user-action = ignore disable-pip-version-check = true EOF install -v -dm755 /usr/share/doc/python-3.12.5/html tar --no-same-owner \ -xvf ../python-3.12.5-docs-html.tar.bz2 cp -R --no-preserve=mode python-3.12.5-docs-html/* \ /usr/share/doc/python-3.12.5/html popd pushd flit_core/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --no-user --find-links dist flit_core popd pushd wheel/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links=dist wheel popd pushd setuptools/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist setuptools popd pushd ninja/ export NINJAJOBS=4 sed -i '/int Guess/a \ int j = 0;\ char* jobs = getenv( "NINJAJOBS" );\ if ( jobs != NULL ) j = atoi( jobs );\ if ( j > 0 ) return j;\ ' src/ninja.cc python3 configure.py --bootstrap install -vm755 ninja /usr/bin/ install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja popd pushd meson/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist meson install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson popd pushd coreutils/ patch -Np1 -i ../coreutils-9.5-i18n-2.patch autoreconf -fiv FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime make make install mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8 popd pushd check/ ./configure --prefix=/usr --disable-static make make docdir=/usr/share/doc/check-0.15.2 install popd pushd diffutils/ ./configure --prefix=/usr make make install popd pushd gawk/ sed -i 's/extras//' Makefile.in ./configure --prefix=/usr rm -f /usr/bin/gawk-5.3.0 make install ln -sv gawk.1 /usr/share/man/man1/awk.1 mkdir -pv /usr/share/doc/gawk-5.3.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.3.0 popd pushd findutils/ ./configure --prefix=/usr --localstatedir=/var/lib/locate make make install popd pushd groff/ PAGE=A4 ./configure --prefix=/usr # European standard make make install popd pushd grub/ unset {C,CPP,CXX,LD}FLAGS echo depends bli part_gpt > grub-core/extra_deps.lst ./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror make make install mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions popd pushd gzip/ ./configure --prefix=/usr make make install popd pushd iproute/ sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8 make NETNS_RUN_DIR=/run/netns make SBINDIR=/usr/sbin install mkdir -pv /usr/share/doc/iproute2-6.10.0 cp -v COPYING README* /usr/share/doc/iproute2-6.10.0 popd pushd kbd/ patch -Np1 -i ../kbd-2.6.4-backspace-1.patch sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in ./configure --prefix=/usr --disable-vlock make make check make install cp -R -v docs/doc -T /usr/share/doc/kbd-2.6.4 popd pushd libpipeline/ ./configure --prefix=/usr make make check make install popd pushd make/ ./configure --prefix=/usr make eic.system.build.continue.make.ask() { read -p "Pending step: Running test suite. Run, skip or quit? (~3 SBUs) [R/S/Q]: " OPT case "$OPT" in R) chown -R tester . su tester -c "PATH=$PATH make check" > /eilogs/8.69-make-test.log ;; S) echo "Step skipped." ;; Q) exit ;; *) echo "Unknown command. Repeating questions." eic.system.build.continue.make.ask ;; esac } eic.system.build.continue.make.ask make install popd pushd patch/ ./configure --prefix=/usr make make check make install popd pushd tar/ FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr make make install make -C doc install-html docdir=/usr/share/doc/tar-1.35 popd pushd texinfo/ ./configure --prefix=/usr make make check make install make TEXMF=/usr/share/texmf install-tex popd pushd nano/ ./configure --prefix=/usr \ --sysconfdir=/etc \ --enable-utf8 \ --docdir=/usr/share/doc/nano-8.1 make make install install -v -m644 doc/{nano.html,sample.nanorc} /usr/share/doc/nano-8.1 popd pushd MarkupSafe/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --no-user --find-links dist Markupsafe popd pushd jinja/ pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --no-user --find-links dist Jinja2 popd pushd systemd/ sed -i -e 's/GROUP="render"/GROUP="video"/' \ -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in mkdir -p build cd build meson setup .. \ --prefix=/usr \ --buildtype=release \ -D default-dnssec=no \ -D firstboot=false \ -D install-tests=false \ -D ldconfig=false \ -D sysusers=false \ -D rpmmacrosdir=no \ -D homed=disabled \ -D userdb=false \ -D man=disabled \ -D mode=release \ -D pamconfdir=no \ -D dev-kvm-mode=0660 \ -D nobody-group=nogroup \ -D sysupdate=disabled \ -D ukify=disabled \ -D docdir=/usr/share/doc/systemd-256.4 ninja echo 'NAME="TylkoLinux"' > /etc/os-release ninja test ninja install tar -xf ../../systemd-man-pages-256.4.tar.xz \ --no-same-owner --strip-components=1 \ -C /usr/share/man systemd-machine-id-setup systemctl preset-all popd pushd dbus/ ./configure --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --runstatedir=/run \ --enable-user-session \ --disable-static \ --disable-doxygen-docs \ --disable-xml-docs \ --docdir=/usr/share/doc/dbus-1.14.10 \ --with-system-socket=/run/dbus/system_bus_socket make make check make install ln -sfv /etc/machine-id /var/lib/dbus popd pushd man-db/ ./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.12.1 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap make make check make install popd pushd procps-ng/ ./configure --prefix=/usr \ --docdir=/usr/share/doc/procps-ng-4.0.4 \ --disable-static \ --disable-kill \ --with-systemd make src_w_LDADD='$(LDADD) -lsystemd' chown -R tester . su tester -c "PATH=$PATH make check" make install popd pushd util-linux/ ./configure --bindir=/usr/bin \ --libdir=/usr/lib \ --runstatedir=/run \ --sbindir=/usr/sbin \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-liblastlog2 \ --disable-static \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.40.2 make make install popd pushd e2fsprogs/ mkdir -v build cd build ../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck make make check make install rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info popd pushd curl/ ./configure --prefix=/usr \ --disable-static \ --with-openssl \ --enable-threaded-resolver \ --with-ca-path=/etc/ssl/certs \ --without-libpsl make make install && rm -rf docs/examples/.deps && find docs \( -name Makefile\* -o \ -name \*.1 -o \ -name \*.3 -o \ -name CMakeLists.txt \) -delete && cp -v -R docs -T /usr/share/doc/curl-8.9.1 popd pushd git/ ./configure --prefix=/usr \ --with-gitconfig=/etc/gitconfig \ --with-python=python3 && make make perllibdir=/usr/lib/perl5/5.40/site_perl install ## Prone to certificate errors tar -xvf ../git-manpages-2.48.1.tar.xz \ -C /usr/share/man --no-same-owner --no-overwrite-dir mkdir -vp /usr/share/doc/git-2.48.1 && tar -xvf ../git-htmldocs-2.48.1.tar.xz \ -C /usr/share/doc/git-2.48.1 --no-same-owner --no-overwrite-dir && find /usr/share/doc/git-2.48.1 -type d -exec chmod 755 {} \; && find /usr/share/doc/git-2.48.1 -type f -exec chmod 644 {} \; mkdir -vp /usr/share/doc/git-2.48.1/man-pages/{html,text} && mv /usr/share/doc/git-2.48.1/{git*.txt,man-pages/text} && mv /usr/share/doc/git-2.48.1/{git*.,index.,man-pages/}html && mkdir -vp /usr/share/doc/git-2.48.1/technical/{html,text} && mv /usr/share/doc/git-2.48.1/technical/{*.txt,text} && mv /usr/share/doc/git-2.48.1/technical/{*.,}html && mkdir -vp /usr/share/doc/git-2.48.1/howto/{html,text} && mv /usr/share/doc/git-2.48.1/howto/{*.txt,text} && mv /usr/share/doc/git-2.48.1/howto/{*.,}html && sed -i '/^> trust/trust-extract-compat << "EOF" # Copy existing anchor modifications to /etc/ssl/local /usr/libexec/make-ca/copy-trust-modifications # Update trust stores /usr/sbin/make-ca -r EOF mkdir p11-build && cd p11-build && meson setup .. \ --prefix=/usr \ --buildtype=release \ -D trust_paths=/etc/pki/anchors && ninja ninja install && ln -sfv /usr/libexec/p11-kit/trust-extract-compat \ /usr/bin/update-ca-certificates ln -sfv ./pkcs11/p11-kit-trust.so /usr/lib/libnssckbi.so popd pushd make-ca/ make install && install -vdm755 /etc/ssl/local /usr/sbin/make-ca -g wget http://www.cacert.org/certs/root.crt && wget http://www.cacert.org/certs/class3.crt && openssl x509 -in root.crt -text -fingerprint -setalias "CAcert Class 1 root" \ -addtrust serverAuth -addtrust emailProtection -addtrust codeSigning \ > /etc/ssl/local/CAcert_Class_1_root.pem && openssl x509 -in class3.crt -text -fingerprint -setalias "CAcert Class 3 root" \ -addtrust serverAuth -addtrust emailProtection -addtrust codeSigning \ > /etc/ssl/local/CAcert_Class_3_root.pem && /usr/sbin/make-ca -r popd pushd cpio/ ./configure --prefix=/usr \ --enable-mt \ --with-rmt=/usr/libexec/rmt && make && makeinfo --html -o doc/html doc/cpio.texi && makeinfo --html --no-split -o doc/cpio.html doc/cpio.texi && makeinfo --plaintext -o doc/cpio.txt doc/cpio.texi make install && install -v -m755 -d /usr/share/doc/cpio-2.15/html && install -v -m644 doc/html/* \ /usr/share/doc/cpio-2.15/html && install -v -m644 doc/cpio.{html,txt} \ /usr/share/doc/cpio-2.15 popd pushd hwdata/ ./configure --prefix=/usr --disable-blacklist make install popd pushd pciutils/ sed -r '/INSTALL/{/PCI_IDS|update-pciids /d; s/update-pciids.8//}' \ -i Makefile make PREFIX=/usr \ SHAREDIR=/usr/share/hwdata \ SHARED=yes make PREFIX=/usr \ SHAREDIR=/usr/share/hwdata \ SHARED=yes \ install install-lib && chmod -v 755 /usr/lib/libpci.so popd pushd libgpg-error/ ./configure --prefix=/usr && make make install && install -v -m644 -D README /usr/share/doc/libgpg-error-1.50/README popd pushd libassaun/ ./configure --prefix=/usr && make && make -C doc html && makeinfo --html --no-split -o doc/assuan_nochunks.html doc/assuan.texi && makeinfo --plaintext -o doc/assuan.txt doc/assuan.texi make install && install -v -dm755 /usr/share/doc/libassuan-3.0.1/html && install -v -m644 doc/assuan.html/* \ /usr/share/doc/libassuan-3.0.1/html && install -v -m644 doc/assuan_nochunks.html \ /usr/share/doc/libassuan-3.0.1 && install -v -m644 doc/assuan.{txt,texi} \ /usr/share/doc/libassuan-3.0.1 popd pushd gpgme/ mkdir build && cd build && ../configure --prefix=/usr --disable-gpg-test && make PYTHONS= make install PYTHONS= popd cat > /usr/bin/which << "EOF" #!/bin/bash type -pa "$@" | head -n 1 ; exit ${PIPESTATUS[0]} EOF chmod -v 755 /usr/bin/which chown -v root:root /usr/bin/which popd echo "[i] The system build has successfully finished." } function eic.strip() { save_usrlib="$(cd /usr/lib; ls ld-linux*[^g]) libc.so.6 libthread_db.so.1 libquadmath.so.0.0.0 libstdc++.so.6.0.33 libitm.so.1.0.0 libatomic.so.1.2.0" cd /usr/lib for LIB in $save_usrlib; do objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg cp $LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done online_usrbin="bash find strip" online_usrlib="libbfd-2.43.1.so libsframe.so.1.0.0 libhistory.so.8.2 libncursesw.so.6.5 libm.so.6 libreadline.so.8.2 libz.so.1.3.1 libzstd.so.1.5.6 $(cd /usr/lib; find libnss*.so* -type f)" for BIN in $online_usrbin; do cp /usr/bin/$BIN /tmp/$BIN strip --strip-unneeded /tmp/$BIN install -vm755 /tmp/$BIN /usr/bin rm /tmp/$BIN done for LIB in $online_usrlib; do cp /usr/lib/$LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \ $(find /usr/lib -type f -name \*.a) \ $(find /usr/{bin,sbin,libexec} -type f); do case "$online_usrbin $online_usrlib $save_usrlib" in *$(basename $i)* ) ;; * ) strip --strip-unneeded $i ;; esac done unset BIN LIB save_usrlib online_usrbin online_usrlib } function eic.system.build.clean() { rm -rfv /tmp/{*,.*} find /usr/lib /usr/libexec -name \*.la -delete find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf userdel -r tester } function eic.config.network.devicenaming() { ln -s /dev/null /etc/systemd/network/99-default.link read -p "[i] Enter MAC address of desired device: " OPT_MAC read -p "[i] Enter the desired name of your interface: " OPT_NET_INT echo -e "[Match] # Change the MAC address as appropriate for your network device MACAddress=${OPT_MAC} [Link] Name=${OPT_NET_INT}" > /etc/systemd/network/10-ether0.link } function eic.config.network.staticip() { read -p "[i] Enter the name of the configured interface: " OPT_NET_INT echo -e "[Match] Name=${OPT_NET_INT} [Network] Address=192.168.0.2/24 Gateway=192.168.0.1" > /etc/systemd/network/10-eth-static.network echo "[?] Add DNS? If no, type N. If yes, type DNS address." read -p "> " OPT_NET_DNS case "$OPT_NET_DNS" in N|n|No|no|nO|NO) echo "[i] Skipped DNS addition." ;; *) echo -e "DNS=${OPT_NET_DNS}" >> /etc/systemd/network/10-eth-static.network ;; esac echo "[?] Add domain? If no, type N. If yes, type domain name." read -p "> " OPT_NET_DOMAIN case "$OPT_NET_DOMAIN" in N|n|No|no|nO|NO) echo "[i] Skipped domain addition." ;; *) echo -e "Domains=${OPT_NET_DOMAIN}" >> /etc/systemd/network/10-eth-static.network ;; esac } function eic.config.network.dhcp() { read -p "[i] Enter the name of the configured interface: " OPT_NET_INT echo -e " [Match] Name=${OPT_NET_INT} [Network] DHCP=ipv4 [DHCPv4] UseDomains=true" > /etc/systemd/network/10-eth-dhcp.network } function eic.config.network.systemd.resolve() { case "$@" in on|enable) echo "[i] Enabling systemd-resolved..." systemctl enable systemd-resolved ;; off|disable) echo "[i] Disabling systemd-resolved..." systemctl disable systemd-resolved ;; *) echo "[!] Unrecognised (or empty) argument." echo "[i] Syntax: eic.config.network.systemd.resolve (on/off/enable/disable)" ;; esac } function eic.config.network.staticresolver() { echo "[?] Add domain? If no, type N. If yes, type domain name." read -p "> " OPT_NET_DOMAIN case "$OPT_NET_DOMAIN" in N|n|No|no|nO|NO) echo "[i] Skipped domain addition." ;; *) echo -e "domain ${OPT_NET_DOMAIN}" >> /etc/resolv.conf ;; esac echo "[?] Add primary nameserver? If no, type N. If yes, type nameserver name." read -p "> " OPT_NET_NS1 case "$OPT_NET_NS1" in N|n|No|no|nO|NO) echo "[i] Skipped primary nameserver addition." ;; *) echo -e "nameserver ${OPT_NET_NS1}" >> /etc/resolv.conf ;; esac echo "[?] Add secondary nameserver? If no, type N. If yes, type nameserver name." read -p "> " OPT_NET_NS2 case "$OPT_NET_NS2" in N|n|No|no|nO|NO) echo "[i] Skipped secondary nameserver addition." ;; *) echo -e "nameserver ${OPT_NET_NS2}" >> /etc/resolv.conf ;; esac # echo -e " ## Begin /etc/resolv.conf # #domain ${OPT_NET_DOMAIN} #nameserver ${OPT_NET_NS1} #nameserver ${OPT_NET_NS2} ## End /etc/resolv.conf #" > /etc/resolv.conf } function eic.config.network.hostname() { echo "$@" > /etc/hostname } function eic.config.time.createAdj() { cat > /etc/adjtime << "EOF" 0.0 0 0.0 0 LOCAL EOF echo "[i] Adjusted /etc/adjtime according to LFS instructions." } function eic.config.time.clarifyUTC() { timedatectl set-local-rtc 1 } function eic.config.time.set() { read -p "[i] Enter year in 4 digits (no spaces): " YEAR read -p "[i] Enter month number in 2 digits (no spaces): " MONTH read -p "[i] Enter day number in 2 digits (no spaces): " DAY read -p "[i] Enter hour in 2 digits (no spaces) (24-hour format): " HOUR read -p "[i] Enter minute in 2 digits (no spaces): " MINUTE read -p "[i] Enter second in 2 digits (no spaces): " SECOND timedatectl set-time $YEAR-$MONTH-$DAY $HOUR:$MINUTE:$SECOND } function eic.config.time.tz() { timedatectl set-timezone "$@" } function eic.config.time.nts() { case "$@" in on|enable) echo "[i] Enabling Network Time Synchronisation..." systemctl enable systemd-timesyncd ;; off|disable) echo "[i] Disabling Network Time Synchronisation..." systemctl disable systemd-timesyncd ;; *) echo "[!] Unrecognised (or empty) argument." echo "[i] Syntax: eic.config.time.nts (on/off/enable/disable)" ;; esac } function eic.config.console.preset() { echo FONT=Lat2-Terminus16 > /etc/vconsole.conf } function eic.config.console.keymap() { echo "KEYMAP=$1" >> /etc/vconsole.conf } function eic.config.locale.set() { read -p "[i] Enter language code (for example de): " LANGUAGE read -p "[i] Enter country code (for example CH): " COUNTRY read -p "[i] Enter character map code (for example UTF-8): " CHARACTERMAP read -p "[i] Enter modifiers, leave empty if none (needs to start with @): " MODIFIERS echo -e "LANG=${LANGUAGE}_${COUNTRY}.${CHARACTERMAP}${MODIFIERS}" > /etc/locale.conf cat > /etc/profile << "EOF" # Begin /etc/profile for i in $(locale); do unset ${i%=*} done if [[ "$TERM" = linux ]]; then export LANG=C.UTF-8 else source /etc/locale.conf for i in $(locale); do key=${i%=*} if [[ -v $key ]]; then export $key fi done fi # End /etc/profile EOF } function eic.config.create.inputrc() { cat > /etc/inputrc << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn # Allow the command prompt to wrap to the next line set horizontal-scroll-mode Off # Enable 8-bit input set meta-flag On set input-meta On # Turns off 8th bit stripping set convert-meta Off # Keep the 8th bit for display set output-meta On # none, visible or audible set bell-style none # All of the following map the escape sequence of the value # contained in the 1st argument to the readline specific functions "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xterm "\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF } function eic.config.create.shells() { cat > /etc/shells << "EOF" # Begin /etc/shells /bin/sh /bin/bash # End /etc/shells EOF } function eic.config.systemd.disableScreenClearing() { case "$@" in yes|YES|Yes) mkdir -pv /etc/systemd/system/getty@tty1.service.d cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF [Service] TTYVTDisallocate=no EOF ;; no|NO|No) rm /etc/systemd/system/getty@tty1.service.d/noclear.conf ;; *) echo "[!] Unrecognised (or empty) argument." echo "[i] Syntax: eic.config.systemd.disableScreenClearing (yes/no)" ;; esac } function eic.config.systemd.limitCoreDumpSize() { mkdir -pv /etc/systemd/coredump.conf.d || echo "[i] Great, the directory already exists!" echo -e "[Coredump] MaxUse=$1" > /etc/systemd/coredump.conf.d/maxuse.conf } function eic.linux.install() { pushd /sources/linux/ read -p "[i] In this section, it is recommended to have the TylkoLinux build/installation guide open and ready. [ENTER]: " make mrproper # make menuconfig make make modules_install read -p "[i] Mount boot partition? [Y/N]: " OPT case $OPT in Y|y|Yes|yes|YES) mount /boot ;; *) echo "[i] Skipped mount." ;; esac cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.10.5-lfs-12.2-systemd cp -iv System.map /boot/System.map-6.10.5 cp -iv .config /boot/config-6.10.5 cp -r Documentation -T /usr/share/doc/linux-6.10.5 install -v -m755 -d /etc/modprobe.d cat > /etc/modprobe.d/usb.conf << "EOF" # Begin /etc/modprobe.d/usb.conf install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true # End /etc/modprobe.d/usb.conf EOF popd } function eic.plus() { pushd /sources/ tar -xvf NetworkManager-1.48.8.tar.xz mv NetworkManager-1.48.8 NetworkManager tar -xvf polkit-125.tar.gz mv polkit-125 polkit tar -xvf glib-2.80.4.tar.xz mv glib-2.80.4 glib tar -xvf packaging-24.1.tar.gz mv packaging-24.1 packaging tar -xvf newt-0.52.24.tar.gz mv newt-0.52.24 newt tar -xvf slang-2.3.3.tar.bz2 mv slang-2.3.3 slang tar -xvf gpm-1.20.7.tar.bz2 mv gpm-1.20.7 gpm tar -xvf icu4c-76_1-src.tgz tar -xvf libxml2-2.13.5.tar.xz mv libxml2-2.13.5 libxml2 tar -xvf libxslt-1.1.42.tar.xz mv libxslt-1.1.42 libxslt pushd icu/ cd source && ./configure --prefix=/usr && make make install popd pushd libxml2/ ./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-static \ --with-history \ --with-icu \ PYTHON=/usr/bin/python3 \ --docdir=/usr/share/doc/libxml2-2.13.5 && make make install rm -vf /usr/lib/libxml2.la && sed '/libs=/s/xml2.*/xml2"/' -i /usr/bin/xml2-config popd pushd libxslt/ ./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/libxslt-1.1.42 && make make install popd pushd gpm/ patch -Np1 -i ../gpm-1.20.7-consolidated-1.patch && ./autogen.sh && ./configure --prefix=/usr --sysconfdir=/etc ac_cv_path_emacs=no && make make install && install-info --dir-file=/usr/share/info/dir \ /usr/share/info/gpm.info && rm -fv /usr/lib/libgpm.a && ln -sfv libgpm.so.2.1.0 /usr/lib/libgpm.so && install -v -m644 conf/gpm-root.conf /etc && install -v -m755 -d /usr/share/doc/gpm-1.20.7/support && install -v -m644 doc/support/* \ /usr/share/doc/gpm-1.20.7/support && install -v -m644 doc/{FAQ,HACK_GPM,README*} \ /usr/share/doc/gpm-1.20.7 popd pushd slang/ ./configure --prefix=/usr \ --sysconfdir=/etc \ --with-readline=gnu && make -j1 RPATH= make install_doc_dir=/usr/share/doc/slang-2.3.3 \ SLSH_DOC_DIR=/usr/share/doc/slang-2.3.3/slsh \ RPATH= install popd if [ -d "/sources/popt" ]; then echo "[i] popt has already been extracted, it seems."; else tar -xvf popt-*.tar.gz mv popt-1.19 popt fi pushd popt/ ./configure --prefix=/usr --disable-static && make make install popd pushd newt/ sed -e '/install -m 644 $(LIBNEWT)/ s/^/#/' \ -e '/$(LIBNEWT):/,/rv/ s/^/#/' \ -e 's/$(LIBNEWT)/$(LIBNEWTSH)/g' \ -i Makefile.in && ./configure --prefix=/usr \ --with-gpm-support \ --with-python=python3.12 && make make install popd pushd packaging/ pip3 wheel -w dist --no-build-isolation --no-deps --no-cache-dir $PWD pip3 install --no-index --find-links=dist --no-cache-dir --no-user packaging popd pushd glib/ patch -Np1 -i ../glib-skip_warnings-1.patch if [ -e /usr/include/glib-2.0 ]; then rm -rf /usr/include/glib-2.0.old && mv -vf /usr/include/glib-2.0{,.old} fi mkdir build cd build && meson setup .. \ --prefix=/usr \ --buildtype=release \ -D introspection=disabled #\ # -D man-pages=enabled ninja ninja install tar xf ../../gobject-introspection-1.80.1.tar.xz && meson setup gobject-introspection-1.80.1 gi-build \ --prefix=/usr --buildtype=release && ninja -C gi-build ninja -C gi-build install meson configure -D introspection=enabled && ninja ninja install popd tar -xvf duktape-2.7.0.tar.xz mv duktape-2.7.0 duktape pushd duktape/ sed -i 's/-Os/-O2/' Makefile.sharedlibrary make -f Makefile.sharedlibrary INSTALL_PREFIX=/usr make -f Makefile.sharedlibrary INSTALL_PREFIX=/usr install popd tar -xvf Linux-PAM-1.6.1.tar.xz mv Linux-PAM-1.6.1 Linux-PAM pushd Linux-PAM/ autoreconf -fi tar -xvf ../Linux-PAM-1.6.1-docs.tar.xz --strip-components=1 ./configure --prefix=/usr \ --sbindir=/usr/sbin \ --sysconfdir=/etc \ --libdir=/usr/lib \ --enable-securedir=/usr/lib/security \ --docdir=/usr/share/doc/Linux-PAM-1.6.1 && make install -v -m755 -d /etc/pam.d && make install && chmod -v 4755 /usr/sbin/unix_chkpwd install -vdm755 /etc/pam.d && cat > /etc/pam.d/system-account << "EOF" && # Begin /etc/pam.d/system-account account required pam_unix.so # End /etc/pam.d/system-account EOF cat > /etc/pam.d/system-auth << "EOF" && # Begin /etc/pam.d/system-auth auth required pam_unix.so # End /etc/pam.d/system-auth EOF cat > /etc/pam.d/system-session << "EOF" && # Begin /etc/pam.d/system-session session required pam_unix.so # End /etc/pam.d/system-session EOF cat > /etc/pam.d/system-password << "EOF" # Begin /etc/pam.d/system-password # use yescrypt hash for encryption, use shadow, and try to use any # previously defined authentication token (chosen password) set by any # prior module. password required pam_unix.so yescrypt shadow try_first_pass # End /etc/pam.d/system-password EOF cat > /etc/pam.d/other << "EOF" # Begin /etc/pam.d/other auth required pam_warn.so auth required pam_deny.so account required pam_warn.so account required pam_deny.so password required pam_warn.so password required pam_deny.so session required pam_warn.so session required pam_deny.so # End /etc/pam.d/other EOF popd pushd shadow/ sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs sed -i 's/groups$(EXEEXT) //' src/Makefile.in && find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; && find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; && find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \; && sed -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD YESCRYPT@' \ -e 's@/var/spool/mail@/var/mail@' \ -e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \ -i etc/login.defs && ./configure --sysconfdir=/etc \ --disable-static \ --without-libbsd \ --with-{b,yes}crypt && make make exec_prefix=/usr pamddir= install install -v -m644 /etc/login.defs /etc/login.defs.orig && for FUNCTION in FAIL_DELAY \ FAILLOG_ENAB \ LASTLOG_ENAB \ MAIL_CHECK_ENAB \ OBSCURE_CHECKS_ENAB \ PORTTIME_CHECKS_ENAB \ QUOTAS_ENAB \ CONSOLE MOTD_FILE \ FTMP_FILE NOLOGINS_FILE \ ENV_HZ PASS_MIN_LEN \ SU_WHEEL_ONLY \ CRACKLIB_DICTPATH \ PASS_CHANGE_TRIES \ PASS_ALWAYS_WARN \ CHFN_AUTH ENCRYPT_METHOD \ ENVIRON_FILE do sed -i "s/^${FUNCTION}/# &/" /etc/login.defs done cat > /etc/pam.d/login << "EOF" # Begin /etc/pam.d/login # Set failure delay before next prompt to 3 seconds auth optional pam_faildelay.so delay=3000000 # Check to make sure that the user is allowed to login auth requisite pam_nologin.so # Check to make sure that root is allowed to login # Disabled by default. You will need to create /etc/securetty # file for this module to function. See man 5 securetty. #auth required pam_securetty.so # Additional group memberships - disabled by default #auth optional pam_group.so # include system auth settings auth include system-auth # check access for the user account required pam_access.so # include system account settings account include system-account # Set default environment variables for the user session required pam_env.so # Set resource limits for the user session required pam_limits.so # Display the message of the day - Disabled by default #session optional pam_motd.so # Check user's mail - Disabled by default #session optional pam_mail.so standard quiet # include system session and password settings session include system-session password include system-password # End /etc/pam.d/login EOF cat > /etc/pam.d/passwd << "EOF" # Begin /etc/pam.d/passwd password include system-password # End /etc/pam.d/passwd EOF cat > /etc/pam.d/su << "EOF" # Begin /etc/pam.d/su # always allow root auth sufficient pam_rootok.so # Allow users in the wheel group to execute su without a password # disabled by default #auth sufficient pam_wheel.so trust use_uid # include system auth settings auth include system-auth # limit su to users in the wheel group # disabled by default #auth required pam_wheel.so use_uid # include system account settings account include system-account # Set default environment variables for the service user session required pam_env.so # include system session settings session include system-session # End /etc/pam.d/su EOF cat > /etc/pam.d/chpasswd << "EOF" # Begin /etc/pam.d/chpasswd # always allow root auth sufficient pam_rootok.so # include system auth and account settings auth include system-auth account include system-account password include system-password # End /etc/pam.d/chpasswd EOF sed -e s/chpasswd/newusers/ /etc/pam.d/chpasswd >/etc/pam.d/newusers cat > /etc/pam.d/chage << "EOF" # Begin /etc/pam.d/chage # always allow root auth sufficient pam_rootok.so # include system auth and account settings auth include system-auth account include system-account # End /etc/pam.d/chage EOF for PROGRAM in chfn chgpasswd chsh groupadd groupdel \ groupmems groupmod useradd userdel usermod do install -v -m644 /etc/pam.d/chage /etc/pam.d/${PROGRAM} sed -i "s/chage/$PROGRAM/" /etc/pam.d/${PROGRAM} done if [ -f /etc/login.access ]; then mv -v /etc/login.access{,.NOUSE}; fi if [ -f /etc/limits ]; then mv -v /etc/limits{,.NOUSE}; fi popd pushd elfutils/ make -C libdwelf install make -C libdwfl install popd pushd systemd/ sed -i -e 's/GROUP="render"/GROUP="video"/' \ -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in rm -r build mkdir build && cd build && meson setup .. \ --prefix=/usr \ --buildtype=release \ -D default-dnssec=no \ -D firstboot=false \ -D install-tests=false \ -D ldconfig=false \ -D man=auto \ -D sysusers=false \ -D rpmmacrosdir=no \ -D homed=disabled \ -D userdb=false \ -D mode=release \ -D pam=enabled \ -D pamconfdir=/etc/pam.d \ -D dev-kvm-mode=0660 \ -D nobody-group=nogroup \ -D sysupdate=disabled \ -D ukify=disabled \ -D docdir=/usr/share/doc/systemd-256.4 && ninja ninja install grep 'pam_systemd' /etc/pam.d/system-session || cat >> /etc/pam.d/system-session << "EOF" # Begin Systemd addition session required pam_loginuid.so session optional pam_systemd.so # End Systemd addition EOF cat > /etc/pam.d/systemd-user << "EOF" # Begin /etc/pam.d/systemd-user account required pam_access.so account include system-account session required pam_env.so session required pam_limits.so session required pam_loginuid.so session optional pam_keyinit.so force revoke session optional pam_systemd.so auth required pam_deny.so password required pam_deny.so # End /etc/pam.d/systemd-user EOF systemctl daemon-reexec popd pushd polkit/ groupadd -fg 27 polkitd && useradd -c "PolicyKit Daemon Owner" -d /etc/polkit-1 -u 27 \ -g polkitd -s /bin/false polkitd mkdir build && cd build && meson setup .. \ --prefix=/usr \ --buildtype=release \ -D session_tracking=logind ninja ninja install popd tar -xvf libndp-1.9.tar.gz mv libndp-1.9 libndp pushd libndp/ ./configure --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --disable-static && make make install popd read -p "[?] Disable systemd-networkd? [Y/N]: " OPT case "$OPT" in y|Y|Yes|yes|YES) systemctl disable --now systemd-networkd ;; *) echo "[i] systemd-networkd will stay enabled." ;; esac pushd NetworkManager sed -i "s/option('libpsl', type: 'boolean', value: true, description: 'Link against libpsl')/option('libpsl', type: 'boolean', value: false, description: 'Link against libpsl')/g" meson_options.txt grep -rl '^#!.*python$' | xargs sed -i '1s/python/&3/' CXXFLAGS+="-O2 -fPIC" \ meson setup .. \ --prefix=/usr \ --buildtype=release \ -D libaudit=no \ -D nmtui=true \ -D ovs=false \ -D ppp=false \ -D selinux=false \ -D qt=false \ -D session_tracking=systemd \ -D tests=no \ -D modem_manager=false \ -D crypto=null && ninja ninja install && mv -v /usr/share/doc/NetworkManager{,-1.48.8} for file in $(echo ../man/*.[1578]); do section=${file##*.} && install -vdm 755 /usr/share/man/man$section install -vm 644 $file /usr/share/man/man$section/ done cp -Rv ../docs/{api,libnm} /usr/share/doc/NetworkManager-1.48.8 cat >> /etc/NetworkManager/NetworkManager.conf << "EOF" [main] plugins=keyfile EOF cat > /etc/NetworkManager/conf.d/polkit.conf << "EOF" [main] auth-polkit=true EOF cat > /etc/NetworkManager/conf.d/no-dns-update.conf << "EOF" [main] dns=none EOF groupadd -fg 86 netdev && /usr/sbin/usermod -a -G netdev root cat > /usr/share/polkit-1/rules.d/org.freedesktop.NetworkManager.rules << "EOF" polkit.addRule(function(action, subject) { if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("netdev")) { return polkit.Result.YES; } }); EOF systemctl enable NetworkManager systemctl disable NetworkManager-wait-online popd popd } function eic.rpm.install() { # Enter /sources/ directory pushd /sources/ # Extract needed packages for compiling RPM bunzip2 -v -v rpm-4.18.0.tar.bz2 tar -xvf rpm-4.18.0*.tar mv rpm-4.18.0 rpm tar -xvf debugedit*.tar.xz mv debugedit-0.3 debugedit tar -xvf lua*.gz mv lua-5.4.7 lua tar -xvf popt-*.tar.gz mv popt-1.19 popt tar -xvf curl-*.tar.xz mv curl-8.9.1 curl tar -xvf libarchive-3.7.4.tar.xz mv libarchive-3.7.4 libarchive tar -xvf nghttp2-*.xz mv nghttp2-1.64.0 nghttp2 tar -xvf libuv-*.gz mv libuv-v1.50.0 libuv tar -xvf sqlite-autoconf-3480000.tar.gz tar -xvf libgcrypt-1.11.0.tar.bz2 tar -xvf libgpg-error-1.50.tar.bz2 mv libgcrypt-1.11.0 libgcrypt mv libgpg-error-1.50 libgpg-error pushd libgpg-error/ ./configure --prefix=/usr && make make install install -v -m644 -D README /usr/share/doc/libgpg-error-1.50/README popd pushd libgcrypt/ ./configure --prefix=/usr && make && make -C doc html && makeinfo --html --no-split -o doc/gcrypt_nochunks.html doc/gcrypt.texi && makeinfo --plaintext -o doc/gcrypt.txt doc/gcrypt.texi make install && install -v -dm755 /usr/share/doc/libgcrypt-1.11.0 && install -v -m644 README doc/{README.apichanges,fips*,libgcrypt*} \ /usr/share/doc/libgcrypt-1.11.0 && install -v -dm755 /usr/share/doc/libgcrypt-1.11.0/html && install -v -m644 doc/gcrypt.html/* \ /usr/share/doc/libgcrypt-1.11.0/html && install -v -m644 doc/gcrypt_nochunks.html \ /usr/share/doc/libgcrypt-1.11.0 && install -v -m644 doc/gcrypt.{txt,texi} \ /usr/share/doc/libgcrypt-1.11.0 popd pushd libarchive/ ./configure --prefix=/usr --disable-static && make make install popd pushd nghttp2/ ./configure --prefix=/usr \ --disable-static \ --enable-lib-only \ --docdir=/usr/share/doc/nghttp2-1.64.0 && make make install popd pushd libuv/ sh autogen.sh && ./configure --prefix=/usr --disable-static && make make install popd pushd debugedit/ ./configure --prefix=/usr make make install popd pushd lua/ cat > lua.pc << "EOF" V=5.4 R=5.4.7 prefix=/usr INSTALL_BIN=${prefix}/bin INSTALL_INC=${prefix}/include INSTALL_LIB=${prefix}/lib INSTALL_MAN=${prefix}/share/man/man1 INSTALL_LMOD=${prefix}/share/lua/${V} INSTALL_CMOD=${prefix}/lib/lua/${V} exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Lua Description: An Extensible Extension Language Version: ${R} Requires: Libs: -L${libdir} -llua -lm -ldl Cflags: -I${includedir} EOF patch -Np1 -i ../lua-5.4.7-shared_library-1.patch make linux make all install make INSTALL_TOP=/usr \ INSTALL_DATA="cp -d" \ INSTALL_MAN=/usr/share/man/man1 \ TO_LIB="liblua.so liblua.so.5.4 liblua.so.5.4.7" \ install && mkdir -pv /usr/share/doc/lua-5.4.7 && cp -v doc/*.{html,css,gif,png} /usr/share/doc/lua-5.4.7 && install -v -m644 -D lua.pc /usr/lib/pkgconfig/lua.pc popd pushd popt/ ./configure --prefix=/usr --disable-static make make install popd pushd /sources/elfutils/ make -C libdw install install -vm644 config/libdw.pc /usr/lib/pkgconfig rm /usr/lib/libdw.a popd pushd sqlite-autoconf-3480000/ ./configure --prefix=/usr \ --disable-static \ --enable-fts{4,5} \ CPPFLAGS="-D SQLITE_ENABLE_COLUMN_METADATA=1 \ -D SQLITE_ENABLE_UNLOCK_NOTIFY=1 \ -D SQLITE_ENABLE_DBSTAT_VTAB=1 \ -D SQLITE_SECURE_DELETE=1" && make make install popd pushd /sources/rpm ./autogen.sh --noconfigure ./configure --prefix=/usr --enable-python --enable-plugins --enable-shared --enable-static make make install popd install -d /var/lock/rpm rpm --initdb --root=/ pip3 install rpm mkdir /etc/yum.repos.d mkdir /sources-rpm/ pushd /sources-rpm/ wget https://repo.rootsource.cc/pub/TylkoLinux/25.2/os/pkgs/t/tylux-release-25.2-25.2.noarch.rpm rpm -vv -i ./tylux-release-25.2-25.2.noarch.rpm popd cat > /etc/yum.repos.d/tylux25d2.repo << 'EOF' [rscc] name=TylkoLinux 25.2 updates baseurl=https://repo.rootsource.cc/pub/TylkoLinux/25.2/os/pkgs/ enabled=1 EOF popd } # I truly hate Zypper. Don't use. I install a dep. It wants another. I install another, BUT IT ALWAYS FUCKING WANTS MORE DEPENDENCIES!!! function eic.zypper.install.DONOTUSE() { pushd /sources/ tar -xvf boost-1.86.0-b2-nodocs.tar.xz mv boost-1.86.0 boost pushd boost/ patch -Np1 -i ../boost-1.86.0-upstream_fixes-1.patch case $(uname -m) in i?86) sed -e "s/defined(__MINGW32__)/& || defined(__i386__)/" \ -i ./libs/stacktrace/src/exception_headers.h ;; esac ./bootstrap.sh --prefix=/usr --with-python=python3 && ./b2 stage $MAKEFLAGS threading=multi link=shared rm -rf /usr/lib/cmake/[Bb]oost* ./b2 install threading=multi link=shared popd mv 1.14.81.tar.gz zypper-1.14.81.tar.gz tar -xvf zypper-1.14.81.tar.gz mv zypper-1.14.81 zypper git clone https://github.com/jbeder/yaml-cpp.git pushd yaml-cpp/ mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr make -j$(nproc) make install popd git clone https://github.com/openSUSE/libsolv.git pushd libsolv/ mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make make install popd git clone https://github.com/openSUSE/libzypp pushd libzypp/ git checkout tags/17.35.19 mkdir build cd build cmake .. -D CMAKE_INSTALL_PREFIX:PATH=/usr -D ENABLE_BUILD_DOCS:BOOL=OFF -DCMAKE_MODULE_PATH="/usr/share/cmake/Modules/" # not done popd mkdir build cd build popd } function eic.dnf5.install.DONOTUSE() { pushd /sources/ echo "Hi" tar -xvf boost-1.86.0-b2-nodocs.tar.xz mv boost-1.86.0 boost pushd boost/ patch -Np1 -i ../boost-1.86.0-upstream_fixes-1.patch case $(uname -m) in i?86) sed -e "s/defined(__MINGW32__)/& || defined(__i386__)/" \ -i ./libs/stacktrace/src/exception_headers.h ;; esac ./bootstrap.sh --prefix=/usr --with-python=python3 && ./b2 stage $MAKEFLAGS threading=multi link=shared rm -rf /usr/lib/cmake/[Bb]oost* ./b2 install threading=multi link=shared popd mv 1.14.81.tar.gz zypper-1.14.81.tar.gz tar -xvf zypper-1.14.81.tar.gz mv zypper-1.14.81 zypper git clone https://github.com/jbeder/yaml-cpp.git pushd yaml-cpp/ mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr make -j$(nproc) make install popd git clone https://github.com/openSUSE/libsolv.git pushd libsolv/ mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make make install popd git clone https://github.com/rpm-software-management/dnf5 git clone https://github.com/ToruNiina/toml11 git clone https://github.com/fmtlib/fmt git clone https://github.com/json-c/json-c git clonr https://pagure.io/koji pushd toml11/ git submodule update --init --recursive cmake -B ./build/ cmake --build ./build/ cmake --install ./build/ --prefix /usr/ popd pushd fmt/ cmake .. -DFMT_TEST=OFF make cmake --install . --prefix /usr/ popd pushd json-c/ mkdir json-c-build cd json-c-build cmake .. -DCMAKE_INSTALL_PREFIX=/usr make make install popd pushd koji/ pip3 install -r requirements.txt popd pushd dnf/ mkdir build cd build cmake .. -DWITH_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/usr popd popd } function eic.dnf4.install.DONOTUSE() { pushd /sources/ tar -xvf boost-1.86.0-b2-nodocs.tar.xz mv boost-1.86.0 boost pushd boost/ patch -Np1 -i ../boost-1.86.0-upstream_fixes-1.patch case $(uname -m) in i?86) sed -e "s/defined(__MINGW32__)/& || defined(__i386__)/" \ -i ./libs/stacktrace/src/exception_headers.h ;; esac ./bootstrap.sh --prefix=/usr --with-python=python3 && ./b2 stage $MAKEFLAGS threading=multi link=shared rm -rf /usr/lib/cmake/[Bb]oost* ./b2 install threading=multi link=shared popd mv 1.14.81.tar.gz zypper-1.14.81.tar.gz tar -xvf zypper-1.14.81.tar.gz mv zypper-1.14.81 zypper git clone https://github.com/jbeder/yaml-cpp.git pushd yaml-cpp/ mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr make -j$(nproc) make install popd git clone https://github.com/openSUSE/libsolv.git pushd libsolv/ mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make make install popd cp -v /usr/share/cmake/Modules/FindLibSolv.cmake /usr/share/cmake-3.31/Modules/FindLibSolv.cmake git clone https://github.com/rpm-software-management/librepo git clone https://github.com/rpm-software-management/libdnf git clone https://github.com/rpm-software-management/dnf git clone https://github.com/rpm-software-management/modulemd-tools pip3 install tito pushd librepo/ mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_SELINUX=OFF -DUSE_GPGME=OFF -DWITH_ZCHUNK=OFF -DENABLE_DOCS=OFF -DENABLE_TESTS=OFF make make install popd pushd modulemd-tools/ git checkout tags/modulemd-tools-0.16-1 pip3 install argparse-manpage createrepo_c dnf koji pytest pyyaml setuptools wheel # Do not approve yet tito build --rpm --install pip3 install rpm-py-installer popd pushd libdnf/ mkdir build pushd build/ cmake .. -DPYTHON_DESIRED="3" -DCMAKE_INSTALL_PREFIX:PATH=/usr/ -DWITH_GTKDOC=OFF -DWITH_HTML=OFF -DCMAKE_MODULE_PATH="/usr/share/cmake-3.31/Modules/" -DENABLE_RHSM_SUPPORT=OFF -DWITH_ZCHUNK=OFF popd popd pushd dnf/ mkdir build pushd build/ cmake .. -DPYTHON_DESIRED="3" -DCMAKE_INSTALL_PREFIX:PATH=/usr/ -DWITH_MAN=0 make make install popd popd popd } function eic.tdnf.install() { pushd /sources/ echo "[?] Is RPM installed? Because if not, the packages will NOT install!" read -p "[Y]es, it is. [N]o, it isn't. :" opt case "$opt" in Y|y|Yes|yes|YES) echo "[i] Checking...." rpm --version || eic.error RPM_NOT_INSTALLED ;; *) echo "[i] Install RPM first, by running eic.rpm.install. The script will kick you out now. Rerun me!" exit 1 ;; esac git clone https://github.com/openSUSE/libsolv.git pushd libsolv/ git checkout tags/0.7.31 mkdir build cd build cmake .. -DDISABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_RPMDB=ON -DENABLE_RPMMD=ON -DENABLE_RPMPKG=ON -DENABLE_APPDATA=ON && make && make install popd git clone https://github.com/kevadesu/tdnf pushd tdnf/ git checkout stable-3.5 && mkdir build cd build CFLAGS="-I/usr/include/rpm -I/usr/include/solv" LDFLAGS="-L/usr/lib -lsolv -lsolvext -lrpm" cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DRPM_INCLUDE_DIR=/usr/include/rpm -DRPM_LIBRARY=/usr/lib/librpm.so -DLIBSOLV_LIBRARY=/usr/lib/libsolv.so -DLIBSOLVEXT_LIBRARY=/usr/lib/libsolvext.so -DLIBSOLV_INCLUDE_DIR=/usr/include/solv -DDISABLE_SHARED=ON -DENABLE_STATIC=ON && make && make install && cat > /etc/tdnf/tdnf.conf << EOF [main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=0 repodir=/etc/yum.repos.d cachedir=/var/cache/tdnf distroverpkg=tylux-release EOF popd popd } function eic.bugfix.RrX() { pushd /sources/ echo "[i] Applying bugfix RrX..." echo "[i] Removing the following directories: /sources/: gettext/ grep/ bash/ diffutils/ findutils/ patch/" rm -rv gettext grep bash diffutils findutils patch echo "[i] Extracting and renaming..." tar -xvf bash*z tar -xvf grep*z tar -xvf gettext*z tar -xvf diffutils*z tar -xvf findutils*z tar -xvf patch*z mv -v bash-5.2.32 bash mv -v grep-3.11 grep mv -v gettext-0.22.5 gettext mv -v diffutils-3.10 diffutils mv -v findutils-4.10.0 findutils mv -v patch-2.7.6 patch popd } function eic.signoff() { echo 12.2-systemd-tylux > /etc/lfs-release cat > /etc/lsb-release << "EOF" DISTRIB_ID="TylkoLinux" DISTRIB_RELEASE="25.02" DISTRIB_CODENAME="delirium" DISTRIB_DESCRIPTION="TylkoLinux Delirium" EOF cat > /etc/os-release << "EOF" NAME="TylkoLinux" VERSION="25.02 (Delirium)" VERSION_ID="25.02" ID=tylux PRETTY_NAME="TylkoLinux 25.02 Delirium (LFS 12.2-systemd)" ANSI_COLOR="0;35" VERSION_CODENAME="delirium" HOME_URL="https://distrolabs.github.io/" EOF } function eic.error() { echo "[i] The installer has encountered a critical error and needs to quit." case "$@" in D404_SRC) echo "[!] Directory /sources/ does NOT exist!" ;; RPM_NOT_INSTALLED) echo "[!] RPM...is not installed. You liar." exit 1 ;; *) echo "[!] We were unable to determine the error." ;; esac } # Those are functions taken from the compatibility checker script created in LFS 12.2-systemd. Shoutout to them! ver_check() { if ! type -p $2 &>/dev/null then echo -e "${BRed}ERROR ${Color_Off}| Cannot find $2 ($1)"; return 1; fi v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1) if printf '%s\n' "$3" "$v" | sort --version-sort --check &>/dev/null then printf "${BGreen}OK ${Color_Off}| %-9s %-6s >= $3\n" "$1" "$v"; return 0; else printf "${BRed}ERROR ${Color_Off}| %-9s is TOO OLD ($3 or later required)\n" "$1"; return 1; fi } bail() { echo -e "${BRed}FATAL ${Color_Off}| $1"; exit 1; } main