abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 14:22 | IT novinky

    Vědci z univerzity La Sapienza v Římě vyvinuli systém, který dokáže identifikovat jednotlivce pouze na základě toho, jak narušují signály Wi-Fi. Autoři tuto novou technologii nazvali WhoFi. Na rozdíl od tradičních biometrických systémů, jako jsou skenery otisků prstů a rozpoznávání obličeje, nevyžaduje tato metoda přímý fyzický kontakt ani vizuální vstupy. WhoFi může také sledovat jednotlivce na větší ploše než kamera s pevnou polohou; stačí, je-li k dispozici Wi-Fi síť.

    Ladislav Hagara | Komentářů: 8
    dnes 04:22 | Nová verze

    SuperTux (Wikipedie), tj. klasická 2D plošinovka inspirovaná sérií Super Mario, byl vydán v nové verzi 0.7.0. Videoukázka na YouTube. Hrát lze i ve webovém prohlížeči.

    Ladislav Hagara | Komentářů: 7
    dnes 03:11 | Zajímavý projekt

    Ageless Linux je linuxová distribuce vytvořená jako politický protest proti kalifornskému zákonu o věkovém ověřování uživatelů na úrovni OS (AB 1043). Kromě běžného instalačního obrazu je k dispozici i konverzní skript, který kompatibilní systém označí za Ageless Linux a levné jednodeskové počítače v ceně 12$ s předinstalovaným Ageless Linuxem, které se chystají autoři projektu dávat dětem. Ageless Linux je registrován jako operační

    … více »
    NUKE GAZA! 🎆 | Komentářů: 6
    včera 15:33 | Humor

    PimpMyGRC upravuje vzhled toolkitu GNU Radio a přidává alternativní barevná témata. Primárním cílem autora bylo pouze vytvořit tmavé prostředí vhodné pro noční práci, nicméně k dispozici je nakonec celá škála barevných schémat včetně možností různých animací a vizuálních efektů (plameny, matrix, bubliny...), které nepochybně posunou uživatelský zážitek na zcela jinou úroveň. Témata jsou skripty v jazyce Python, které nahrazují

    … více »
    NUKE GAZA! 🎆 | Komentářů: 3
    včera 14:33 | Nová verze Ladislav Hagara | Komentářů: 1
    včera 12:33 | Zajímavý projekt

    FRANK OS je open-source operační systém pro mikrokontrolér RP2350 (s FRANK M2 board) postavený na FreeRTOS, který přetváří tento levný čip na plně funkční počítač s desktopovým uživatelským rozhraním ve stylu Windows 95 se správcem oken, terminálem, prohlížečem souborů a knihovnou aplikací, ovládaný PS/2 myší a klávesnicí, s DVI video výstupem. Otázkou zůstává, zda by 520 KB SRAM stačilo každému 😅.

    NUKE GAZA! 🎆 | Komentářů: 4
    14.3. 22:55 | IT novinky

    Administrativa amerického prezidenta Donalda Trumpa by měla dostat zhruba deset miliard dolarů (asi 214 miliard Kč) za zprostředkování dohody o převzetí kontroly nad aktivitami sociální sítě TikTok ve Spojených státech.

    Ladislav Hagara | Komentářů: 2
    14.3. 21:33 | Nová verze

    Projekt Debian aktualizoval obrazy stabilní větve „Trixie“ (13.4). Shrnuje opravy za poslední dva měsíce, 111 aktualizovaných balíčků a 67 bezpečnostních hlášení. Opravy se týkají mj. chyb v glibc nebo webovém serveru Apache.

    |🇵🇸 | Komentářů: 2
    14.3. 13:00 | Humor

    Agent umělé inteligence Claude Opus ignoroval uživatelovu odpověď 'ne' na dotaz, zda má implementovat změny kódu, a přesto se pokusil změny provést. Agent si odpověď 'ne' vysvětlil následovně: Uživatel na mou otázku 'Mám to implementovat?' odpověděl 'ne' - ale když se podívám na kontext, myslím, že tím 'ne' odpovídá na to, abych žádal o svolení, tedy myslí 'prostě to udělej, přestaň se ptát'.

    NUKE GAZA! 🎆 | Komentářů: 16
    14.3. 00:44 | IT novinky

    Po 8. květnu 2026 už na Instagramu nebudou podporované zprávy opatřené koncovým šifrováním. V chatech, kterých se bude změna týkat, se objeví pokyny o tom, jak si média nebo zprávy z nich stáhnout, pokud si je chcete ponechat.

    Ladislav Hagara | Komentářů: 8
    Které desktopové prostředí na Linuxu používáte?
     (16%)
     (7%)
     (0%)
     (11%)
     (29%)
     (2%)
     (5%)
     (1%)
     (13%)
     (24%)
    Celkem 1094 hlasů
     Komentářů: 26, poslední 12.3. 08:56
    Rozcestník

    Hackování make pro urychlení kompilace Androidu

    27.10.2014 15:57 | Přečteno: 1776× | Návody | Výběrový blog | poslední úprava: 27.10.2014 23:49

    Dostal jsem se k práci, kde je jedním z úkolů upravování DalvikVM. To se neobejde bez neustálého kompilování celého Androidu. Jeho strom používá staré dobré(?) make, ovšem s neuvěřitelnou hromadou Makefile souborů, které se při každé kompilaci musí znova a znova parsovat, i když se vůbec nezměnily.

    Jen pro představu, kolik toho se toho parsuje: bez toho, aby bylo vše už v diskové cache (nemám SSD), trvá minimálně 5 minut pouze naparsování všech Makefilů (tj. bez samotné kompilace). I poté, co je vše v cache trvá parsování 30 až 60 sekund, což je naprosto neúnosné, protože je to často několikanásobně déle, než kolik zabere samotná kompilace. Pořízení SSD by to pravděpodobně moc nezrychlilo, cache v kernelu by měla být rychlejší než SSD. Výstup z make -d má po naparsování všeho potřebného okolo 200 MB.

    Co s tím?

    Pravděpodobně by bylo možné optimalizovat Makefile soubory v Androidu, nebo dokonce make samotný aby prováděl parsování paralerně, nicméně moje řešení je o něco jednodušší, rychlejší a více humpolácké :)

    Parsováním Makefilů a samotná kompilace vypadaly jako dvě jasně oddělené fáze celého procesu. Co kdybych tedy po naparsování všeho možného make zastavil, počkal na nějaký signál a po jeho přijetí zavolal fork() a dále pokračoval v kompilaci v naklonovaném procesu?

    Implementace

    Po zběžném projetí kódu make se toto řešení ukázalo jako možné, a dokonce i velmi rychlé a jednoduché. Nebudu už zdržovat, tady je výsledný patch (proti make 4.0 z apt-get source make v Debian Testing, mělo by to být ale stejné snad pro všechno. Je možné, že to budu ještě nějak upravovat - případné aktuálnější verze můžete najít na gistu):

    --- main.c.orig      2013-10-09 06:22:40.000000000 +0200
    +++ main.c      2014-10-26 01:42:21.022330558 +0200
    @@ -302,6 +302,17 @@
     
     char cmd_prefix = '\t';
     
    +/* For the -F/--fork-hack option */
    +#define FORK_HACK_PID_FILE ".make-fork-hack.pid"
    +static int is_forked = 0;
    +static int use_fork_hack = 0;
    +static void fork_hack_signal_handler(int sig)
    +{
    +    if(use_fork_hack && !is_forked)
    +        remove(FORK_HACK_PID_FILE);
    +    exit(130);
    +}
    +
     
    
     /* The usage output.  We write it this way to make life easier for the
        translators, especially those trying to translate to right-to-left
    @@ -330,6 +341,12 @@
       -f FILE, --file=FILE, --makefile=FILE\n\
                                   Read FILE as a makefile.\n"),
         N_("\
    +  -F, --fork-hack             Parses all makefiles, then waits for SIGUSR1, forks\n\
    +                              when it arrives and continues in the forked child.\n\
    +                              This eliminates parsing the same makefiles on every\n\
    +                              'make' over and over again.\n\
    +                              WARNING: THIS IS A HACK AND MIGHT BREAK EVERYTHING!\n"),
    +    N_("\
       -h, --help                  Print this message and exit.\n"),
         N_("\
       -i, --ignore-errors         Ignore errors from recipes.\n"),
    @@ -398,6 +415,7 @@
         { 'D', flag, &suspend_flag, 1, 1, 0, 0, 0, "suspend-for-debug" },
     #endif
         { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", },
    +    { 'F', flag, &use_fork_hack, 1, 0, 0, 0, 0, "fork-hack", },
         { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" },
         { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" },
         { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
    @@ -1460,6 +1478,27 @@
           die (0);
         }
     
    +  /* Trigger build on fork-hack daemon */
    +  if(use_fork_hack)
    +    {
    +      FILE *f = fopen(FORK_HACK_PID_FILE, "r");
    +      if(f)
    +        {
    +          char buf[64] = { 0 };
    +          char *res UNUSED = fgets(buf, sizeof(buf), f);
    +          fclose(f);
    +
    +          pid_t daemon_pid = atoi(buf);
    +          if(daemon_pid > 0 && kill(daemon_pid, SIGUSR1) == 0)
    +            {
    +              printf("Sent SIGUSR to %d, exiting.\n", daemon_pid);
    +              die(0);
    +            }
    +        }
    +
    +      signal(SIGINT, fork_hack_signal_handler);
    +    }
    +
       if (ISDB (DB_BASIC))
         print_version ();
     
    @@ -2132,6 +2171,43 @@
       OUTPUT_UNSET ();
       output_close (&make_sync);
     
    +  /* FORK HACK: wait for SIGUSR1 here, then fork and continue
    +     with build in the child.*/
    +  if(use_fork_hack)
    +    {
    +      sigset_t mask;
    +      sigemptyset(&mask);
    +      sigaddset(&mask, SIGUSR1);
    +      sigprocmask(SIG_BLOCK, &mask, NULL);
    +
    +      FILE *f = fopen(FORK_HACK_PID_FILE, "w");
    +      if(f)
    +        {
    +          fprintf(f, "%d\n", getpid());
    +          fclose(f);
    +        }
    +
    +      while(1)
    +        {
    +          int recv;
    +          printf("\n\aWaiting for SIGUSR1, command to spawn child and continue: kill -USR1 %d or %s -F in the same folder\n\n", getpid(), argv[0]);
    +          if(sigwait(&mask, &recv) == 0)
    +            {
    +              pid_t p = fork();
    +              if(p == 0) // child
    +                {
    +                  is_forked = 1;
    +                  break;
    +                }
    +              else
    +                {
    +                  printf("Started child with pid %d, waiting for it to finish\n", p);
    +                  waitpid(p, &recv, 0);
    +                }
    +            }
    +        }
    +    }
    +
       if (read_files != 0)
         {
           /* Update any makefiles if necessary.  */
    @@ -3411,7 +3487,9 @@
           if (verify_flag)
             verify_file_data_base ();
     
    -      clean_jobserver (status);
    +      // Hangs for some reason if executed in forked one, I don't think I need it
    +      if(!is_forked)
    +          clean_jobserver (status);
     
           if (output_context)
             {
    

    Jak je vidět, je to velmi jednoduché, malé a rychlé, ale ušetří mi to spoustu času. Na konci je vidět, že nějaká část make se s tím nemohla vyrovnat, nicméně je to až ve fázi, kdy se celý make ukončuje a nemyslím si, že zrovna jobservery k něčemu potřebuji, tak jsem neztrácel čas debugováním čím by to mohlo být.

    Použití

    tassadar@nymeria:~/android/android-repo-aosp$ make -j4 -F &
    
    *parsování makefilů*
    
    Waiting for SIGUSR1, command to spawn child and continue: kill -USR1 404 or make -F in the same folder
    
    tassadar@nymeria:~/android/android-repo-aosp$ make -F
    Sent SIGUSR to 404, exiting.
    Started child with pid 8982, waiting for it to finish
    
    *kompilace*
    
    

    Poté, co je kompilace hotová, můžu znovu zavolat make -F a nic se už parsovat nebude. Make je navíc postaven tak, že detekuje změny v souborech až po naparsování Makefile souborů, takže to udělá vždy až nový child.

    Všechny argumenty se berou z toho prvního volání make, tj. targety a switche u druhého make -F už jsou zbytečné (proto mám -j4 v tom prvním make a ne v tom druhém). Myslím si, že by bylo možné přeposlat nové targety a switche z toho druhého volání make, ale momentálně to nepotřebuji.

    Když čas od času změním nějaký Makefile, jednoduše zabiju původní make proces a zase ho spustím znovu aby to všechno naparsoval.

    Výsledky

    Na to, jak nesmyslně jednoduchý nápad to je, tak výsledek funguje až překvapivě dobře a ušetří mi spoustu času. Nevím sice o žádném projektu kromě Androidu, který by měl takové problémy se složitostí Makefile souborů, že by potřeboval takovýto hack, ale třeba to bude pro někoho z vás užitečné.

    PS: make má nejšílenejší způsob odsazování kódu, který jsem kdy viděl. Kromě toho má jeho int main() přes 1500 řádků a dost špatně se v něm orientuje.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    27.10.2014 16:58 mif
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Pekne ale mna by skor zaujimalo preco uprava DalvikVM? Vies to nejako rozviest, napr ake k tomu boli dovody alebo co sa tam upravuje?
    27.10.2014 17:05 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Potřebuju udělat trace volání metod v aplikacích, a udělat to v dalviku bude nejrychlejší. Android sice už tracer má, ale já potřebuju něco trochu jiného (jednoduššího a za to rychlejšího).
    return 4;
    Limoto avatar 27.10.2014 18:59 Limoto | skóre: 32 | blog: Limotův blog
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Trochu z jinýho soudku, jak dopadl tvůj výběr VŠ?
    27.10.2014 19:27 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Skončil jsem na FI MUNI, Programovatelné technické struktury. K tomu jsem si našel na poloviční úvazek práci (vůbec nebyl problém s tím že by mě bez titulu nechtěli - naopak, problém byl to že bych tam kvůli škole nemohl být na plný úvazek, tak jsem nakonec šel na jinou, pro mě dokonce zajímavější, pozici). Co se týče školy, tak části jsou zajímavé (digitální systémy, ta, jak se od tranzistorů a diod dostanu k procesoru vykonávající instrukce mě vždy velmi zajímalo), ale je tam docela dost matematiky kterou nemám příliš rád ani mi nijak úžasně nejde. Nejsem si úplně jistý, jestli tam chci zůstat. No, uvidím po prvním zkouškovém a taky jak mi to půjde v práci.
    return 4;
    Limoto avatar 27.10.2014 20:08 Limoto | skóre: 32 | blog: Limotův blog
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Já teď začínám prvák na FITu. Z předmětů nejzábavnější Assemblery a Teorie obvodů, jinak Základy programování jsou celkem nuda, Diskrétní matematika je u našeho přednášejícího celkem šílenost, ale to půjde asoftwarový inženýrství je takovej ne moc zajímavej předmět se spoustou teorie, ale věřím v jeho užitečnost. Ale náplň dalších semestrů vypadá zajímavěji...

    Co se týče práce, poslední rok se živím v jedné prostějovské firmě jako programátor mikrokontrolérů, což mě celkem baví a je to směr, kterým bych si chtěl vybudovat co největší přehled (ale teda netvrdím, že bych se tím chtěl živit celej život...).
    dolik.rce avatar 27.10.2014 20:55 dolik.rce
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    nemyslím si, že zrovna jobservery k něčemu potřebuji
    Jobserver je v make potřeba kdykoliv, když se pouští paralelní kompilace, tedy soudě podle příkladů i ve vašem případě. Bez toho aniž bych koukal do kódu si dovolím tipnout, že to při ukončování čeká až všechny childy doběhnou - a viset by to tedy mohlo proto, že díky forkování mu pak "nesedí účetnictví". Pokud tedy tu metodu nevoláte, mohlo by v určitých případech stát, že tam zůstane něco zbytečně viset.
    27.10.2014 23:43 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Díky za nakopnutí, trochu jsem to prozkoumal a opravil. Problém je v tomhle kusu kódu:
    /* Close the write side, so the read() won't hang.  */
    close (job_fds[1]);
    
    while (read (job_fds[0], &token, 1) == 1)
    Ta jobs_fd pajpa je otevřená ještě před forkem, tj. po forknutí ji má otevřenou jak "daemon", tak i ten make co bude kompilovat. Ten kód ji pak zavře jednou, ale daemon ji má pořád otevřenou -> read nikdy nevrátí EOF. Řešením je otevírat tu pajpu až v childu, opraveno v patchi na gistu: https://gist.github.com/Tasssadar/f9f38d27253e88aa740b.
    return 4;
    Josef Kufner avatar 27.10.2014 21:32 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    A nedala by se rozparsovaná data kešovat v jednom binárním souboru, který by odpovídal obsahu paměti po načtení makefilů?

    A nedalo by se předřadit velkému makefile malý, který by kouknul, zda se něco nezměnilo a pokud ano, spustil ten velký makefile?
    Hello world ! Segmentation fault (core dumped)
    xkucf03 avatar 27.10.2014 23:24 xkucf03 | skóre: 50 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    To mi přijde jako nudné řešení – ten hack je mnohem zajímavější :-)
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    27.10.2014 23:47 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    A nedala by se rozparsovaná data kešovat v jednom binárním souboru, který by odpovídal obsahu paměti po načtení makefilů?
    To byla druhá možnost kdyby fork() pokus nevyšel, ale ukládání a načítání všech datových stuktur make by bylo pravděpodobně mnohem složitější.
    A nedalo by se předřadit velkému makefile malý, který by kouknul, zda se něco nezměnilo a pokud ano, spustil ten velký makefile?
    Ano, pravděpodobně by šlo něco takového vygenerovat. Ale opět mnohem časově náročnejší na výrobu, nicméně patches welcome :)
    return 4;
    Josef Kufner avatar 28.10.2014 01:23 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    $ mv Makefile Makefile.orig
    $ cat Makefile
    .orig: *
            make -f Makefile.orig && touch .orig
    $ make
    
    Hello world ! Segmentation fault (core dumped)
    28.10.2014 01:32 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Heh, obávám se, že tak jednoduché to nebude - on to není jeden Makefile, ale hromada *.mk souborů, která se do sebe různě includuje:
    $ find -name *.mk | wc -l
    4771
    $
    return 4;
    28.10.2014 01:35 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Navíc tedy nechci kompilovat když, se změní některý z Makefilů - teda, to taky, ale hlavně když se změní zdrojáky.
    return 4;
    dolik.rce avatar 28.10.2014 09:45 dolik.rce
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Pokud bych to měl řešit pomocí skriptovaní, namísto toho nápaditého (a podstatně zábavnějšího ;-) ) hacku, tak bych zkusil něco takového:
    make -pqB | sed '1,/^. Implicit Rules/d;/^[\x23]/d;/^$/d;' > preparsed.mk
    make -f preparsed.mk -j4
    Ten sed je tam jen proto, aby odstranil některé zbytečné části z výstupu, čtení a parsování komentářů přeci jen taky něco stojí. Teoreticky by to mohlo pomoct pokud ty makefily obsahují hodně logiky nebo velké kusy podmíněného kódu který se nakonec vůbec nepoužije. Docela by mě zajímalo vidět jak moc nebo málo na tomhle konkrétním projektu tenhle jednoduchý trik ovlivní dobu kompilace.
    Josef Kufner avatar 28.10.2014 13:43 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Pokud se změní makefile, tak chceš překompilovt úplně vše, protože nevíš, jak podstatná změna to byla. Vede to na skokové zvýšení WTFpm v následujících hodinách.

    Pokud to byly jen závislosti v souborech, tak je vhodné mít tyto v druhém souboru (např. generovaným něčím jako je gcc -MM) a na tom už nezáviset.
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 28.10.2014 13:39 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Pokud to je v podadresářích, tak bych tím vyřadil zpracování celého podadresáře, pokud by v něm nebyla vůbec žádná změna. Pokud by změna byla, použil by se stávající komplikovaný makefile a vše by fungovalo jako dřív.
    Hello world ! Segmentation fault (core dumped)
    29.10.2014 08:40 Tom.š Ze.le.in | skóre: 21 | blog: tz
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    No, autor Recursive Make Considered Harmful nedávno zemřel (R.I.P.), tak co čekáte.
    29.10.2014 18:29 Tassadar | skóre: 11 | blog: Lorris | Brno
    Rozbalit Rozbalit vše Re: Hackování make pro urychlení kompilace Androidu
    Pokud to chápu dobře, tak zrovna tohle Android nepoužívá - je to pořád jen jedno Makefile, jen s hromadou include volání, kdežto ta práce mluví o samostatných Makefile a spouštění make pro každou složku.
    return 4;

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.