Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր

TL. DRՆորեկն առաջին անգամ տեսավ Հայկուն՝ փորձելով որոշ ծրագրեր տեղափոխել Linux աշխարհից:

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր
Իմ առաջին Haiku տեղափոխված ծրագիրը՝ փաթեթավորված իր hpkg ձևաչափով

Վերջերս Ես հայտնաբերեցի Haiku-ն՝ զարմանալիորեն լավ օպերացիոն համակարգ համակարգիչների համար:
Այսօր ես կսովորեմ, թե ինչպես տեղափոխել նոր ծրագրեր այս օպերացիոն համակարգում: Հիմնական ուշադրությունը Linux ծրագրավորողի տեսանկյունից Haiku-ին անցնելու առաջին փորձի նկարագրությունն է: Ես ներողություն եմ խնդրում ճանապարհին թույլ տված բոլոր հիմար սխալների համար, քանի որ նույնիսկ մեկ շաբաթ չի անցել այն պահից, երբ ես առաջին անգամ ներբեռնեցի Հայկուն:

Ես ուզում եմ հասնել երեք նպատակի.

  • Տեղադրեք պարզ CLI հավելված
  • Տեղադրեք հավելվածը GUI-ից Qt
  • Ապա փաթեթավորեք դրանք hpkg ձևաչափով (քանի որ ես դեռ մտածում եմ AppDir-ը և AppImage-ը Haiku-ի համար հարմարեցնելու մասին...)

Եկեք սկսենք. Բաժիններով փաստաթղթերը и զարգացումինչպես նաեւ Վիքիփեդիա, ազատ հանրագիտարան HaikuPorts-ից ես գտա ճիշտ ուղղությունը: Կա նույնիսկ առցանց PDF գիրք BeOS. Unix հավելվածի տեղափոխում.
467 էջ, և սա 1997թ. Ներս նայելը սարսափելի է, բայց ես լավագույնի հույս ունեմ: Մշակողի խոսքերը հուսադրող են. «երկար ժամանակ պահանջվեց, քանի որ BeOS-ը չէր համապատասխանում POSIX-ին», բայց Haiku-ն «մեծ մասով» արդեն այդպիսին է։

Պարզ CLI հավելվածի տեղափոխում

Առաջին միտքը հավելվածը տեղափոխելն էր օր, բայց, ինչպես պարզվեց, սա արդեն արել են երկար ժամանակ առաջ.

Առաջին փորձեք. դիտելու ոչինչ չկա

Այն, ինչ ես չեմ կարող հասկանալ, դա արդեն Հավելվածները տեղափոխվել են Հայկու ավելի քան 10 տարի - չնայած այն հանգամանքին, որ ՕՀ-ն ինքնին դեռևս 1.0 տարբերակ չէ:

Երկրորդ փորձ. անհրաժեշտ է վերաշարադրել

Այսպիսով, ես կօգտագործեմ պտուչ-770, CLI՝ Brother P-Touch 770 տպիչը կառավարելու համար, որը ես օգտագործում եմ պիտակներ տպելու համար:
Ես դրա վրա տպում եմ տարբեր պիտակներ, և գուցե դուք արդեն տեսել եք այն նախորդ հոդվածում: Մի փոքր ավելի վաղ ես Python-ում գրեցի GUI-ի փաթաթման փոքր ծրագիր (քանի որ այն գտնվում է Gtk+-ում, այն պետք է վերաշարադրվի, և սա լավ պատճառ է սովորելու համար):

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր
Եղբայր P-Touch 770 պիտակի տպիչ: Այն կաշխատի Հայկուի հետ:

Haiku փաթեթի կառավարիչը գիտի գրադարանների և հրամանների մասին, այնպես որ, եթե ես աշխատում եմ «չի կարող գտնել libintl» հաղորդագրությունը: configure - Ես նոր եմ մեկնարկում pkgman install devel:libintl և կգտնվի անհրաժեշտ փաթեթը։ Նմանապես pkgman install cmd:rsync. Դե և այլն:

Բացառությամբ այն դեպքերի, երբ սա չի աշխատում.

/Haiku/home> git clone https://github.com/probonopd/ptouch-770
Cloning into 'ptouch-770'...
remote: Enumerating objects: 134, done.
remote: Total 134 (delta 0), reused 0 (delta 0), pack-reused 134
Receiving objects: 100% (134/134), 98.91 KiB | 637.00 KiB/s, done.
Resolving deltas: 100% (71/71), done./Haiku/home> cd ptouch-770//Haiku/home/ptouch-770> make
gcc -Wall -O2 -c -o ptouch-770-write.o ptouch-770-write.c
ptouch-770-write.c:28:10: fatal error: libudev.h: No such file or directory
 #include <libudev.h>
          ^~~~~~~~~~~
compilation terminated.
Makefile:16: recipe for target 'ptouch-770-write.o' failed
make: *** [ptouch-770-write.o] Error 1/Haiku/home/ptouch-770> pkgman install devel:libudev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:libudev": Name not found/Haiku/home/ptouch-770> pkgman install devel:udev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:udev": Name not found

Թերևս udev-ը չափազանց հիմնված է Linux-ի վրա և, հետևաբար, գոյություն չունի Հայկուի համար: Սա նշանակում է, որ ես պետք է խմբագրեմ սկզբնական կոդը, որը փորձում եմ կազմել:
Էհ, դուք չեք կարող ցատկել ձեր գլխից, և ես նույնիսկ չգիտեմ, թե որտեղից սկսել:

Երրորդ փորձ

Լավ կլիներ ունենալ tmate Haiku-ի համար, ապա ես թույլ կտայի Haiku-ի մշակողներին միանալ իմ տերմինալի նիստին, եթե ինչ-որ բան սխալ լինի: Հրահանգները բավականին պարզ են.

./autogen.sh
./configure
make
make install

Լավ տեսք ունի, ուստի ինչու չփորձել այն Հայկուի վրա:

/Haiku/home> git clone https://github.com/tmate-io/tmate/Haiku/home> cd tmate//Haiku/home/tmate> ./autogen.sh
(...)/Haiku/home/tmate> ./configure
(...)
checking for libevent... no
checking for library containing event_init... no
configure: error: "libevent not found"/Haiku/home/tmate> pkgman install devel:libevent
(...)
The following changes will be made:
  in system:
    install package libevent21-2.1.8-2 from repository HaikuPorts
    install package libevent21_devel-2.1.8-2 from repository HaikuPorts
Continue? [yes/no] (yes) :
100% libevent21-2.1.8-2-x86_64.hpkg [965.22 KiB]
(...)
[system] Done.checking for ncurses... no
checking for library containing setupterm... no
configure: error: "curses not found"/Haiku/home/tmate> pkgman install devel:libcurses
(...)
*** Failed to find a match for "devel:libcurses": Name not found/Haiku/home/tmate> pkgman install devel:curses
(...)
*** Failed to find a match for "devel:curses": Name not found

Այս քայլում ես բացում եմ HaikuDepot-ը և փնտրում curses.
Գտնվել է ինչ-որ բան, որն ինձ հուշում է ավելի գրագետ հարցման համար.

/Haiku/home/tmate> pkgman install devel:libncurses
(...)
100% ncurses6_devel-6.1-1-x86_64.hpkg [835.62 KiB]
(...)./configure
(...)
checking for msgpack >= 1.1.0... no
configure: error: "msgpack >= 1.1.0 not found"/Haiku/home/tmate> pkgman install devel:msgpack
(...)
*** Failed to find a match for "devel:msgpack": Name not found/Haiku/home/tmate> pkgman install devel:libmsgpack
(...)
*** Failed to find a match for "devel:libmsgpack": Name not found

Կրկին գնացի HaikuDepot և, իհարկե, գտա devel:msgpack_c_cpp_devel. Որո՞նք են այս տարօրինակ անունները:

/Haiku/home/tmate> pkgman install devel:msgpack_c_cpp_devel
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:msgpack_c_cpp_devel": Name not found# Why is it not finding it? To hell with the "devel:".../Haiku/home/tmate> pkgman install msgpack_c_cpp_devel
(...)
The following changes will be made:
  in system:
    install package msgpack_c_cpp-3.1.1-1 from repository HaikuPorts
    install package msgpack_c_cpp_devel-3.1.1-1 from repository HaikuPorts
Continue? [yes/no] (yes) :
(...)/Haiku/home/tmate> ./configure
(...)
checking for libssh >= 0.8.4... no
configure: error: "libssh >= 0.8.4 not found"/Haiku/home/tmate> pkgman install devel:libssh/Haiku/home/tmate> make
(...)
In file included from /boot/system/develop/headers/msgpack.h:22,
                 from tmate.h:5,
                 from cfg.c:29:
/boot/system/develop/headers/msgpack/vrefbuffer.h:19:8: error: redefinition of struct iovec'
 struct iovec {
        ^~~~~
In file included from tmux.h:27,
                 from cfg.c:28:
/boot/system/develop/headers/posix/sys/uio.h:12:16: note: originally defined here
 typedef struct iovec {
                ^~~~~
Makefile:969: recipe for target 'cfg.o' failed
make: *** [cfg.o] Error 1

Այս քայլին ես հասկացա, որ ծրագիրը Հայկու տեղափոխելը շատ ավելի մեծ գիտելիքներ է պահանջում, քան անհրաժեշտ է պարզ վերակառուցման համար:
Ես խոսեցի Haiku-ի բարեհամբույր ծրագրավորողների հետ, պարզվում է, որ msgpack-ում սխալ կա, և մի քանի րոպե անց HaikuPorts-ում տեսնում եմ կարկատ: Ես իմ աչքերով տեսնում եմ, թե ինչպես է շտկված փաթեթը գնալով այստեղ (buildslave - վիրտուալ մեքենաներ):

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր
Ուղղված հաղորդագրությունների փաթեթի կառուցում buildmaster-ում

Ժամանակների միջև ընկած ժամանակահատվածում ես կարկատել եմ հոսանքին հակառակ msgpack-ին Haiku-ի աջակցություն ավելացնելու համար.

Հինգ րոպե անց թարմացված հաղորդագրությունների փաթեթն արդեն հասանելի է Հայկուում.

/Haiku/home/tmate> pkgman update
(...)
The following changes will be made:
  in system:
    upgrade package msgpack_c_cpp-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
    upgrade package msgpack_c_cpp_devel-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
Continue? [yes/no] (yes) : y
100% msgpack_c_cpp-3.2.0-2-x86_64.hpkg [13.43 KiB]
(...)
[system] Done.

Անսպասելիորեն լավ: Ես դա ասացի?!

Ես վերադառնում եմ բուն խնդրին.

/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from tty.c:32:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from tty.c:25:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

tty.c: In function 'tty_init_termios':
tty.c:278:48: error: 'IMAXBEL' undeclared (first use in this function); did you mean 'MAXLABEL'?
  tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|IMAXBEL|ISTRIP);
                                                ^~~~~~~
                                                MAXLABEL
tty.c:278:48: note: each undeclared identifier is reported only once for each function it appears in
Makefile:969: recipe for target 'tty.o' failed
make: *** [tty.o] Error 1

Այժմ թվում է, թե msgpack-ը մեղավոր չէ: Ես մեկնաբանում եմ IMAXLABEL в tty.c այնպես որ,

tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|/*IMAXBEL|*/ISTRIP);

Արդյունքը:

osdep-unknown.c: In function 'osdep_get_cwd':
osdep-unknown.c:32:19: warning: unused parameter 'fd' [-Wunused-parameter]
 osdep_get_cwd(int fd)
               ~~~~^~
make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Դե, ահա մենք նորից գնում ենք... Ի դեպ.

/Haiku/home/tmate> ./configure | grep -i OPENAT
checking for openat... no

պրն. թափթփել ասում է ձեզ, թե որտեղ պետք է փորել.

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from window.c:31:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from window.c:22:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Այստեղ ես տեղադրել եմ config.log.

Նրանք ինձ բացատրեցին, որ բացի libresolv-ից Haiku-ում libnetwork-ում կա ևս մի բան։ Ըստ երևույթին, կոդը հետագա խմբագրման կարիք ունի: Պետք է մտածել…

find . -type f -exec sed -i -e 's|lresolv|lnetwork|g'  {} ;

Հավերժական հարցը՝ ի՞նչ է կատարվում։

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
# Success!# Let's run it:/Haiku/home/tmate> ./tmate
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Could not resolve symbol '__stack_chk_guard'
resolve symbol "__stack_chk_guard" returned: -2147478780
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Troubles relocating: Symbol not found

Նույնը՝ միայն պրոֆիլում։ Googled եւ գտավ սա. Եթե ​​ավելացնեք -lssp «Երբեմն» օգնում է, ես փորձում եմ.

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd -lssp"
(...)/Haiku/home/tmate> make
(...)/Haiku/home/tmate> ./tmate

Վա՜յ։ Սկսվում է։ Բայց…

[tmate] ssh.tmate.io lookup failure. Retrying in 2 seconds (non-recoverable failure in name resolution)

Ես կփորձեմ վրիպազերծել ֆայլ այստեղ:

/Haiku/home/tmate> strace -f ./tmate >log 2>&1

«Bad port ID»-ն արդեն նման է այցեքարտի հայկու. Միգուցե ինչ-որ մեկը պատկերացում ունի, թե ինչն է սխալ և ինչպես ուղղել այն: Եթե ​​այո, ես կթարմացնեմ հոդվածը: Հղում դեպի GitHub.

GUI հավելվածի տեղափոխում Qt.

Ես ընտրում եմ պարզ QML հավելված:

/> cd /Haiku/home//Haiku/home> git clone https://github.com/probonopd/QtQuickApp
/Haiku/home/QtQuickApp> qmake .
/Haiku/home/QtQuickApp> make
/Haiku/home/QtQuickApp> ./QtQuickApp # Works!

Իսկապես պարզ: Մեկ րոպեից էլ քիչ:

Փաթեթավորման հավելվածներ hpkg-ում՝ օգտագործելով haikuporter և haikuports:

Ինչի՞ց պետք է սկսել: Չկա պարզ փաստաթուղթ, ես գնում եմ #haiku ալիք irc.freenode.net-ով և լսում.

  • Թիմ package - փաթեթներ ստեղծելու ցածր մակարդակի միջոց: Մեծ մասամբ PackageInfo-ն բավական է նրան, ինչպես նկարագրված է «Դարձնել այն պատշաճ .hpkg փաթեթ» բաժնում:
  • Ես պետք է ինչ-որ բան անեմ է
  • Կարող եք օգտագործել hpkg-ստեղծող (այն խափանում է ինձ համար, սխալի մասին հաղորդում)

Պարզ չէ, թե ինչ անել: Կարծում եմ, ինձ անհրաժեշտ է Hello World ոճի ուղեցույց, իդեալական տարբերակ՝ տեսանյութ: Հաճելի կլինի նաև հարմար ներածություն ունենալ HaikuPorter-ի հետ, ինչպես դա արվում է GNU hello-ում:

Ես կարդում եմ հետևյալը.

haikuporter Haiku-ի համար ընդհանուր փաթեթային նախագծեր ստեղծելու գործիք է: Այն օգտագործում է HaikuPorts պահոցը որպես հիմք բոլոր փաթեթների համար: Haikuporter բաղադրատոմսերը օգտագործվում են փաթեթներ ստեղծելու համար:

Բացի այդ, ես պարզում եմ, որ.

HaikuPorts պահեստում բաղադրատոմսերը պահելու կարիք չկա: Դուք կարող եք մեկ այլ շտեմարան պատրաստել, դրա մեջ դնել բաղադրատոմսերը և այնուհետև մատնացույց անել haikuporter-ին:

Պարզապես այն, ինչ ինձ պետք է, եթե չփնտրեմ փաթեթը հրապարակայնորեն թողարկելու միջոց: Բայց սա մեկ այլ գրառման թեմա է։

Haikuporter-ի և haikuports-ի տեղադրում

cd /boot/home/
git clone https://github.com/haikuports/haikuporter --depth=50
git clone https://github.com/haikuports/haikuports --depth=50
ln -s /boot/home/haikuporter/haikuporter /boot/home/config/non-packaged/bin/ # make it runnable from anywhere
cd haikuporter
cp haikuports-sample.conf /boot/home/config/settings/haikuports.conf
sed -i -e 's|/mydisk/haikuports|/boot/home/haikuports|g' /boot/home/config/settings/haikuports.conf

Բաղադրատոմս գրելը

SUMMARY="Demo QtQuick application"
DESCRIPTION="QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="None"
LICENSE="MIT"
REVISION="1"
SOURCE_URI="https://github.com/probonopd/QtQuickApp.git"
#PATCHES=""
ARCHITECTURES="x86_64"
PROVIDES="
    QtQuickApp = $portVersion
"
REQUIRES="
    haiku
"
BUILD_REQUIRES="
    haiku_devel
    cmd:qmake
"BUILD()
{
    qmake .
    make $jobArgs
}INSTALL()
{
    make install
}

Բաղադրատոմսի հավաքում

Ես պահում եմ ֆայլը անվան տակ QtQuickApp-1.0.recipe, որից հետո գործարկում եմ aikuporter -S ./QuickApp-1.0.recipe. Կախվածությունները ստուգվում են պահեստի բոլոր փաթեթների համար haikuports, որը որոշակի ժամանակ է պահանջում։ Գնամ սուրճ խմեմ:

Ինչու՞ այս ստուգումը պետք է կատարվի իմ տեղական մեքենայի վրա, և ոչ թե կենտրոնացված սերվերի վրա բոլորի համար մեկ անգամ:

Ըստ պրն. waddlesplash:

Այնպիսի եղանակով, որ դուք կարող եք վերագրել ցանկացած ֆայլ շտեմարանում 😉 Դուք կարող եք սա մի փոքր օպտիմալացնել՝ անհրաժեշտության դեպքում հաշվելով անհրաժեշտ տեղեկատվությունը, քանի որ կատարված վերջին փոփոխությունները բավականին հազվադեպ են։

~/QtQuickApp> haikuporter  QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
Error: QtQuickApp not found in repository

Պարզվում է, որ սովորական բաղադրատոմսի ֆայլ չկա, որը պարունակում է ձեր հավելվածի սկզբնական կոդը: Դուք պետք է պահեք այն HaikuPorts ձևաչափով պահոցում:

~/QtQuickApp> mv QtQuickApp-1.0.recipe ../haikuports/app-misc/QtQuickApp/
~/QtQuickApp> ../haikuport
~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe

Այս փաստը ժողովը դարձնում է ավելի ծանր: Ինձ դա առանձնապես դուր չի գալիս, բայց կարծում եմ, որ դա անհրաժեշտ է, որպեսզի ի վերջո բաց կոդով բոլոր ծրագրերը հայտնվեն HaikuPorts-ում:

Ես ստանում եմ հետևյալը.

~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
Error: QtQuickApp-1.0.recipe not found in tree.

Ինչ է պատահել? irc-ը կարդալուց հետո ես անում եմ.

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: https://github.com/probonopd/QtQuickApp.git ...
--2019-07-14 16:12:44--  https://github.com/probonopd/QtQuickApp.git
Resolving github.com... 140.82.118.3
Connecting to github.com|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://github.com/probonopd/QtQuickApp [following]
--2019-07-14 16:12:45--  https://github.com/probonopd/QtQuickApp
Reusing existing connection to github.com:443.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’
     0K .                                                     1.34M=0.06s
2019-07-14 16:12:45 (1.34 MB/s) - ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’ saved [90094]
Validating checksum of QtQuickApp.git
Warning: ----- CHECKSUM TEMPLATE -----
Warning: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Warning: -----------------------------
Error: No checksum found in recipe!

Հետաքրքիր հարց է ծագել. Եթե ​​ես բաղադրատոմսին ստուգիչ գումար ավելացնեմ, արդյոք այն կհամապատասխանի վերջին git commit-ին շարունակական ինտեգրման համար: (Կառուցապատողը հաստատում է. «Դա չի աշխատի: Բաղադրատոմսերը նախագծված են համեմատաբար կայուն լինելու համար»:)

Զվարճանալու համար բաղադրատոմսին ավելացրեք.

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Դեռևս բավարարված չէ.

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Skipping download of source for QtQuickApp.git
Validating checksum of QtQuickApp.git
Unpacking source of QtQuickApp.git
Error: Unrecognized archive type in file /boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git

Ինչ է նա անում? Ի վերջո, սա git պահոց է, կոդը արդեն ուղղակիորեն այնտեղ է, բացելու բան չկա: Իմ տեսանկյունից, գործիքը պետք է բավականաչափ խելացի լինի, որպեսզի չփնտրի ապափաթեթավորող, եթե այն գտնվում է GitHub url-ի վերևում:

Միգուցե uri git://-ը կաշխատի

SOURCE_URI="git://github.com/probonopd/QtQuickApp.git"

Հիմա բողոքում է այսպես.

Downloading: git://github.com/probonopd/QtQuickApp.git ...
Error: Downloading from unsafe sources is disabled in haikuports.conf!

Հմմ, ինչո՞ւ է ամեն ինչ այդքան բարդ, ինչո՞ւ չես կարող «ուղղակի աշխատել»: Ի վերջո, այնքան էլ հազվադեպ չէ GitHub-ից ինչ-որ բան կառուցելը: Անկախ նրանից, թե դա գործիքներ են, որոնք աշխատում են անմիջապես, առանց տեղադրման անհրաժեշտության, թե ինչպես ես դա անվանում եմ «խառնաշփոթ»:

Միգուցե այն կաշխատի այսպես.

SOURCE_URI="git+https://github.com/probonopd/QtQuickApp.git"

Ոչ. Ես դեռ ստանում եմ այս տարօրինակ սխալը և անում եմ, ինչպես նկարագրված է այստեղ

sed -i -e 's|#ALLOW_UNSAFE_SOURCES|ALLOW_UNSAFE_SOURCES|g' /boot/home/config/settings/haikuports.conf

Ես մի փոքր առաջ եմ շարժվում, բայց ինչու է այն գոռում ինձ վրա (GitHub-ը ապահով չէ!) և դեռ փորձում է ինչ-որ բան բացել:

Ըստ պրն. թափթփել:

Դե, այո, պատճառը հավաքման համար ստացված տվյալների ամբողջականությունը ստուգելու ցանկությունն էր։ Տարբերակներից մեկը արխիվի ստուգման գումարի ստուգումն է, բայց դուք, իհարկե, կարող եք հաշել առանձին ֆայլեր, որոնք չեն իրականացվի, քանի որ դա շատ ավելի երկար է տևում: Սրա հետևանքն է git-ի և այլ VCS-ի «անապահովությունը»: Ամենայն հավանականությամբ, դա միշտ այդպես կլինի, քանի որ GitHub-ում արխիվ ստեղծելը բավականին հեշտ է և հաճախ ավելի արագ: Դե, ապագայում, թերևս, սխալի մասին հաղորդագրությունն այնքան էլ ցայտուն չի լինի... (այսպիսի բաղադրատոմսերը մենք այլևս չենք միացնում HaikuPorts-ում):

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: git+https://github.com/probonopd/QtQuickApp.git ...
Warning: UNSAFE SOURCES ARE BAD AND SHOULD NOT BE USED IN PRODUCTION
Warning: PLEASE MOVE TO A STATIC ARCHIVE DOWNLOAD WITH CHECKSUM ASAP!
Cloning into bare repository '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Unpacking source of QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
Command 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' returned non-zero exit status 2

Հին սովորությունից ելնելով, գնում եմ լավ մարդկանց հարցնում irc.freenode.net ցանցի #haiku ալիքով։ Եվ որտեղ կլինեի ես առանց նրանց: Ակնարկից հետո ես հասկացա, որ պետք է օգտագործեմ.

srcGitRev="d0769f53639eaffdcd070bddfb7113c04f2a0de8"
SOURCE_URI="https://github.com/probonopd/QtQuickApp/archive/$srcGitRev.tar.gz"
SOURCE_DIR="QtQuickApp-$srcGitRev"
CHECKSUM_SHA256="db8ab861cfec0ca201e9c7b6c0c9e5e828cb4e9e69d98e3714ce0369ba9d9522"

Լավ, պարզ դարձավ, թե ինչ է դա անում. այն ներբեռնում է արխիվ որոշակի վերանայման սկզբնական կոդով: Դա հիմարություն է, իմ տեսանկյունից, և ոչ թե հենց այն, ինչ ես ուզում էի, այն է՝ ներբեռնել վերջին տարբերակը գլխավոր մասնաճյուղից:

Մշակողներից մեկը դա բացատրեց այսպես.

Մենք ունենք մեր սեփական CI, այնպես որ այն ամենը, ինչ տեղադրված է haikuports պահոցում, փաթեթավորված կլինի բոլոր օգտատերերի համար, և մենք չենք ցանկանում ռիսկի ենթարկել հավաքել և առաքել «ամեն ինչ վերջին տարբերակում վերևում»:

Հասկացա՜ Ամեն դեպքում, տեղի ունեցավ հետևյալը.

waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
(...)

Այն կրկնում է այս անվերջ: Ըստ երևույթին, սա սխալ է (հավելված կա՞: Ես չկարողացա գտնել այն):

С haikuporter և շտեմարան haikuports Այն չունի «պարզապես աշխատում» զգացողություն, բայց որպես մշակող, կան որոշ բաներ, որոնք ինձ դուր են գալիս Haiku-ի հետ աշխատելիս: Մեծ մասամբ այն նման է Open Build Service-ին, որը մի շարք գործիքներ է Linux build-ներ կառուցելու համար. չափազանց հզոր, համակարգված մոտեցմամբ, բայց չափից ավելի իմ փոքրիկ «բարև աշխարհ» հավելվածի համար:

Կրկին, ըստ պրն. waddlesplash:

Իրոք, HaikuPorter-ը լռելյայն բավականին խիստ է (գումարած կա lint ռեժիմ, ինչպես նաև խիստ ռեժիմ՝ այն էլ ավելի խիստ դարձնելու համար), բայց միայն այն պատճառով, որ այն ստեղծում է փաթեթներ, որոնք կաշխատեն, այլ ոչ թե պարզապես փաթեթներ ստեղծում: Դրա համար էլ նա բողոքում է չհայտարարված կախվածություններից, գրադարանների ոչ պատշաճ ներմուծումից, սխալ տարբերակներից և այլն։ Նպատակն է բռնել ցանկացած և բոլոր խնդիրները, ներառյալ ապագա խնդիրները, նախքան օգտագործողի մասին իմանալը (այդ պատճառով հնարավոր չեղավ տեղադրել avrdude-ն, քանի որ կախվածությունն իրականում նշված էր բաղադրատոմսում): Գրադարանները միայն անհատական ​​փաթեթներ կամ նույնիսկ հատուկ SO տարբերակներ չեն: HaikuPorter-ն ապահովում է, որ այս ամենը պահպանվի հենց բաղադրատոմսերում՝ կատարման ընթացքում սխալներից խուսափելու համար:

Սկզբունքորեն, խստության այս մակարդակն արդարացված է օպերացիոն համակարգ ստեղծելիս, բայց ինձ թվում է ավելորդ «բարև աշխարհ» հավելվածի համար: Որոշեցի ուրիշ բան փորձել։

Կառուցեք հավելվածներ hpkg ձևաչափով՝ օգտագործելով «փաթեթի ստեղծում» հրամանը

Միգուցե, սա է Պարզ հրահանգներն ավելի լավ կաշխատե՞ն ինձ համար:

mkdir -p apps/
cp QtQuickApp apps/cat >  .PackageInfo <<EOF
name QtQuickApp
version 1.0-1
architecture x86_64

summary "Demo QtQuick application"
description "QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"

packager "probono"
vendor "probono"

copyrights "probono"
licenses "MIT"

provides {
  QtQuickApp = 1.0-1
}requires {
  qt5
}
EOFpackage create -b QtQuickApp.hpkg
package add QtQuickApp.hpkg apps# See below if you also want the application
# to appear in the menu

Անսպասելիորեն արագ, անսպասելիորեն պարզ, անսպասելիորեն արդյունավետ: Ճիշտ այնպես, ինչպես ինձ դուր է գալիս, զարմանալի:

Տեղադրում - ինչ և որտեղ:

QtQuickApp.hpkg ֆայլը տեղափոխվեց ~/config/packagesօգտագործելով ֆայլերի կառավարիչ, որից հետո QtQuickApp-ը կախարդական կերպով հայտնվեց ~/config/apps.
Կրկին, անսպասելիորեն արագ, պարզ և արդյունավետ: Զարմանալի, անհավատալի!

Բայց... (ուր կլինեինք մենք առանց նրանց):

Հավելվածը դեռ բացակայում է հավելվածների ցանկից և QuickLaunch-ից: Կարծում եմ, ես արդեն գիտեմ, թե ինչպես դա շտկել: Ֆայլերի կառավարիչում ես QtQuickApp.hpkg-ը ~/config/packages-ից տեղափոխում եմ /system/packages:

Ոչ, դեռ անհայտ կորած: Ըստ երևույթին, ես (լավ, և հրահանգները) ինչ-որ բան բաց թողեցի:

Նայելով HaikuDepot-ի «Բովանդակություն» ներդիրին մի քանի այլ հավելվածների համար, ես տեսա, որ կան այնպիսի ֆայլեր, ինչպիսիք են. /data/mimedb/application/x-vnd... առավել ուշագրավն այն է /data/deskbar/menu/Applications/….

Դե, ինչ պետք է դնեմ այնտեղ: Արի...

mkdir -p data/deskbar/menu/Applications/
( cd data/deskbar/menu/Applications ; ln -s ../../../../apps/QtQuickApp . )
package add QtQuickApp.hpkg apps data

Ես միանգամայն վստահ եմ, որ այս հնարքը կաշխատի, բայց հարցերը մնում են՝ ինչո՞ւ է դա անհրաժեշտ, ինչի՞ համար է դա։ Կարծում եմ, սա փչացնում է ընդհանուր տպավորությունը, որ համակարգը այդքան բարդ է:

Ինչպես պարզաբանեց պրն. waddlesplash:

Երբեմն կան հավելվածներ, որոնք այլ հավելվածների կարիք ունեն, բայց ցանկում չկան: Օրինակ՝ ձեր սքրինշոթում LegacyPackageInstaller-ը, որը մշակում է .pkg արխիվները BeOS ձևաչափով: Ես կցանկանայի, որ օգտատերերը տեղադրեին դրանք, բայց նրանց ներկայությունը մենյուում շփոթության կհանգեցնի։

Չգիտես ինչու, ինձ թվում է, որ ավելի պարզ լուծում կա, օրինակ Hidden=true ֆայլերում .desktop Linux-ում։ Ինչու չդարձնել «թաքնված» տեղեկատվությունը ֆայլային համակարգի ռեսուրս և հատկանիշ:

Հատկապես աննկատելի է (որոշ) հավելվածի անվանումը, որը ցույց է տալիս մենյուն, deskbar, կոշտ կապած ճանապարհին։

պրն. Waddlesplash-ը բացատրում է սա.

«Deskbar»-ն այս դեպքում պետք է հասկանալ որպես մի տեսակ ընդհանուր տերմին (նույն կերպ, ինչ «taskbar», որը վերաբերում է ինչպես Windows հավելվածին, այնպես էլ ընդհանուր հայեցակարգին): Դե, քանի որ այս deskbar, ոչ թե «Deskbar», սա նույնպես կարելի է հասկանալ նման կերպ։

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր
2 «գրեթե նույնական» դիրեկտորիա, որոնցում կան հավելվածներ

Ինչու՞ կան հավելվածներով 2 գրացուցակ, և նաև ինչու է իմ QtQuickApplication-ը մեկում, իսկ մյուսում՝ ոչ: (Ի վերջո, սա ոչ թե մեկ համակարգային է, այլ երկրորդ օգտագործողի, որը հասկանալի կլիներ անձամբ ինձ համար):
Ես իսկապես շփոթված եմ և կարծում եմ, որ սա պետք է միասնական լինի:

մեկնաբանությունը պրն. թափթփել

Հավելվածների կատալոգը պարունակում է հավելվածներ, որոնք անհրաժեշտ չեն մենյուում: Բայց մենյուի հետ կապված իրավիճակը իսկապես բարելավման կարիք ունի, որպեսզի այն ավելի հարմարեցվի:

Դիմում, թե չէ դա տեղի չի ունենա 😉

Հետաքրքրվեցի, իսկապե՞ս անհրաժեշտ է հավելվածներ հյուրընկալել /system/apps, եթե օգտատերերը տեսնում են դրանք այնտեղ, դա անցանկալի է։ Միգուցե ավելի լավ կլիներ դրանք տեղադրել այլ վայրում, որտեղ օգտատերը չհանդիպի դրանց: Ճիշտ այնպես, ինչպես դա արվում է Mac OS X-ում, որտեղ փաթեթների բովանդակությունը .app, որը չպետք է տեսանելի լինի օգտատիրոջ համար /Applications, թաքնված /System/Library/…»՝ խորքերում:

Ինչ վերաբերում է կախվածությանը:

Կարծում եմ, արժե ինչ-որ կերպ ճշտել կախվածությունները, չէ՞: Կարո՞ղ է արդյոք Qt-ը լռելյայն համարվել Haiku-ի տեղադրման պարտադիր մաս: Ոչ! Qt-ը լռելյայն տեղադրված չէ: Կարո՞ղ է փաթեթի ստեղծողն ավտոմատ կերպով հայտնաբերել կախվածությունը՝ ստուգելով ELF ֆայլերը: Ինձ ասացին, որ HaikuPorter-ն իրականում դա անում է, բայց package Ոչ Դա պայմանավորված է նրանով, որ այն պարզապես «փաթեթ ստեղծող» է, որը պարզապես ինքնուրույն ստեղծում է ֆայլեր hpkg.

Արդյո՞ք Հայկուն պետք է ավելի բարդացնել՝ ավելացնելով քաղաքականություն, ըստ որի փաթեթը չպետք է կախվածություն ունենա Հայկուից դուրս փաթեթներից: haikuports? (Ես կցանկանայի, քանի որ նման քաղաքականությունը շատ կհեշտացնի ամեն ինչ. համակարգը կկարողանա ավտոմատ կերպով լուծել ցանկացած վայրից ներբեռնված յուրաքանչյուր փաթեթի կախվածությունը՝ առանց լրացուցիչ փաթեթի աղբյուրների հետ շփոթվելու:)

պրն. Waddlesplash-ը բացատրում է.

Մենք չէինք ցանկանա այդքան սահմանափակել ծրագրավորողների ազատությունը, քանի որ ակնհայտ է, որ եթե CompanyX-ը ցանկանում է աջակցել իր ծրագրային ապահովման փաթեթին կախվածություններով (և հետևաբար՝ պահեստով), ապա դա կանի լիովին ազատ:

Այդ դեպքում, գուցե արժե խորհուրդ տալ, որ երրորդ կողմի փաթեթները խուսափեն կախվածությունից որևէ բանից, որը ներառված չէ haikuports-ում՝ ամբողջությամբ փաթեթավորելով այն ամենը, ինչ անհրաժեշտ է հավելվածի հետ: Բայց ես կարծում եմ, որ սա այս շարքի հետագա հոդվածի թեմա է: [Հեղինակը գնում է դեպի AppImage? - մոտ. թարգմանիչ]

Հավելվածի պատկերակի ավելացում

Ի՞նչ անել, եթե ես ուզում եմ ավելացնել կոկիկ ներկառուցված պատկերակներից մեկը իմ նորաստեղծ հավելվածի ռեսուրսներին: Պարզվում է, որ սա զարմանալի թեմա է, ուստի այն հիմք կհանդիսանա հաջորդ հոդվածի համար։

Ինչպե՞ս կազմակերպել շարունակական հավելվածների պատրաստում:

Պատկերացրեք Inkscape-ի պես նախագիծ (այո, ես տեղյակ եմ, որ այն դեռ հասանելի չէ Հայկուում, բայց հարմար է ցուցադրել դրա վրա)։ Նրանք ունեն ելակետային կոդի պահեստ https://gitlab.com/inkscape/inkscape.
Ամեն անգամ, երբ ինչ-որ մեկը կատարում է իր փոփոխությունները պահեստում, գործարկվում են build խողովակաշարեր, որից հետո փոփոխությունները ավտոմատ կերպով փորձարկվում են, կառուցվում և հավելվածը փաթեթավորվում է տարբեր փաթեթներում, ներառյալ AppImage-ը Linux-ի համար (առանձին հավելված, որը կարող է ներբեռնվել տեղական փորձարկման համար՝ անկախ նրանից։ ինչ կարող է կամ չի կարող տեղադրվել համակարգում [Ես գիտեի դա! - մոտ. թարգմանիչ]) Նույնը տեղի է ունենում յուրաքանչյուր մասնաճյուղի միաձուլման հարցում, այնպես որ դուք կարող եք ներբեռնել հավելվածը, որը ստեղծվել է միաձուլման հարցումում առաջարկված կոդից մինչև միաձուլումը:

Իմ հինգերորդ օրը Հայկուի հետ. եկեք տեղափոխենք որոշ ծրագրեր
Միավորել հարցումները կառուցման կարգավիճակների հետ և կազմված երկուականները ներբեռնելու հնարավորությամբ, եթե կառուցումը հաջող է (նշված է կանաչով)

Կառուցումն աշխատում է Docker կոնտեյներներում: GitLab-ն առաջարկում է անվճար վազորդներ Linux-ում, և ես կարծում եմ, որ հնարավոր է ներառել ձեր սեփական վազորդները (ի դեպ, ես չեմ հասկանում, թե ինչպես դա կաշխատի Haiku-ի նման համակարգերի համար, որոնք գիտեմ, որ չունեն Docker կամ համարժեք, բայց նաև FreeBSD-ի համար չկա Docker, ուստի այս խնդիրը միայն Հայկուն չէ):

Իդեալում, Haiku հավելվածները կարող են կառուցվել Linux-ի համար նախատեսված Docker կոնտեյների ներսում: Այս իրավիճակում Հայկուի համար հավաքումը կարող է ներդրվել գոյություն ունեցող խողովակաշարերի մեջ: Կա՞ն խաչաձև կոմպիլյատորներ: Թե՞ պետք է ընդօրինակեմ ամբողջ Հայկուն Docker կոնտեյների ներսում՝ օգտագործելով QEMU/KVM-ի նման մի բան (ենթադրելով, որ դա այդպես կաշխատի Docker-ի ներսում): Ի դեպ, շատ նախագծերում կիրառվում են նմանատիպ սկզբունքներ։ Օրինակ, Scribus-ը դա անում է. այն արդեն հասանելի է Haiku-ի համար: Մի օր կգա այն օրը, երբ ես կարող եմ ուղարկել այդպիսին Հայտերը քաշեք այլ նախագծերին՝ Haiku-ի աջակցություն ավելացնելու համար:

Մշակողներից մեկը բացատրում է.

Այլ նախագծերի համար, ովքեր ցանկանում են ինքնուրույն ստեղծել փաթեթներ, աջակցվում է սովորական CMake/CPack մեթոդը: Կառուցման այլ համակարգերը կարող են աջակցել՝ ուղղակիորեն զանգահարելով փաթեթի կառուցման ծրագիրը, ինչը լավ է, եթե մարդիկ հետաքրքրված են դրանով: Փորձը ցույց է տալիս. մինչ այժմ մեծ հետաքրքրություն չի եղել, ուստի haikuporter-ը մեզ հարմար աշխատեց, բայց, ի վերջո, երկու մեթոդներն էլ պետք է միասին աշխատեն։ Մենք պետք է ներդնենք մի շարք գործիքներ Linux-ից կամ որևէ այլ սերվերային օպերացիոն համակարգից ծրագրակազմ ստեղծելու համար (Haiku-ն նախատեսված չէ սերվերների վրա աշխատելու համար):

Ես հոտնկայս ծափահարում եմ. Linux-ի կանոնավոր օգտագործողները կրում են այս ամբողջ լրացուցիչ բեռը և լրացուցիչ ուղեբեռը (անվտանգություն, խիստ հսկողություն և այլն), որոնք անհրաժեշտ են սերվերի օպերացիոն համակարգի համար, բայց ոչ անձնականի համար։ Այնպես որ, ես լիովին համաձայն եմ, որ Linux-ի վրա Haiku հավելվածներ ստեղծելը ճանապարհն է:

Ամփոփում

POSIX հավելվածները Հայկու տեղափոխելը հնարավոր է, բայց կարող է ավելի թանկ լինել, քան սովորական վերակառուցումը: Ես, անկասկած, երկար ժամանակ կկպչեի դրանով, եթե չլիներ irc.freenode.net ցանցի #haiku ալիքի մարդկանց օգնությունը: Բայց նույնիսկ նրանք միշտ չէ, որ անմիջապես տեսնում են սխալը։

Qt-ով գրված հավելվածները հեշտ բացառություն են: Ես հավաքեցի մի պարզ ցուցադրական ծրագիր՝ առանց որևէ խնդիրների:

Պարզ հավելվածների համար փաթեթ պատրաստելը նույնպես բավականին հեշտ է, բայց միայն «ավանդական թողարկվածների», այսինքն. ունենալով տարբերակված կոդերի արխիվներ, որոնք նախատեսված են haikuports-ում աջակցության համար: GitHub-ի հետ շարունակական կառուցման համար (կառուցեք յուրաքանչյուր փոփոխության համար) ամեն ինչ այնքան էլ պարզ չէ: Այստեղ Haiku-ն ավելի շատ նման է Linux բաշխման, քան Mac-ի արդյունքը, որտեղ XCode-ում «Build» կոճակը սեղմելիս ստանում եք փաթեթ: .app, պատրաստ է տեղադրվելու սկավառակի պատկերի մեջ .dmg, պատրաստվել է ներբեռնման իմ կայքում։
«Սերվերի» օպերացիոն համակարգի վրա հիմնված հավելվածների շարունակական կառուցումը, օրինակ՝ Linux-ը, ամենայն հավանականությամբ հնարավոր կդառնա, եթե լինի ծրագրավորողների պահանջարկը, բայց այս պահին Haiku նախագիծն այլ՝ ավելի հրատապ խնդիրներ ունի։

Փորձեք ինքներդ: Ի վերջո, Haiku նախագիծը տրամադրում է պատկերներ DVD-ից կամ USB-ից բեռնելու համար՝ ստեղծված օրական. Տեղադրելու համար պարզապես ներբեռնեք պատկերը և գրեք այն ֆլեշ կրիչում՝ օգտագործելով Etcher

Հարցեր ունե՞ք։ Հրավիրում ենք ռուսախոս հեռագրային ալիք.

Սխալի ակնարկ. Ինչպես կրակել ձեր ոտքին C և C++-ով. Haiku OS բաղադրատոմսերի հավաքածու

- Ից հեղինակ թարգմանություն. սա Հայկուի մասին մատենաշարի հինգերորդ հոդվածն է։

Հոդվածների ցանկ. Առաջին Երկրորդ Երրորդը Չորրորդ

Source: www.habr.com

Добавить комментарий