Centraal in het systeem bevindt zich de wanna-build databank, dewelke informatie over pakketversies en -states bijhoudt. quinn-diff vergelijkt elke dag de pakketlijsten voor de doelarchitectuur tegen de lijst van bronpakketten, en stuurt een lijst van pakketten die gehercompileerd moeten worden in de database, waar ze de status needs-build krijgen.
Alle build daemons (er kunnen er meerdere zijn) bevragen regelmatig de databank voor pakketten in deze status en kiezen een aantal van hen zodat ze de naar de status building overgaan. Uiteraard kunnen ook mensen een pakket kiezen, bijvoorbeeld in speciale gevallen waar automatische compilatie niet mogelijk is. Hier zien we ook het tweede doel van wanna-build: het verzekert dat de zelfde versie van een pakket geen twee keer gecompileerd wordt.
Als alles goed gaat, dan kan een afgewerkt pakket later geuploaded worden, wat overeenkomt met een andere status, uploaded. Daarna zal het uiteindelijk geïnstalleerd worden in het Debian-archief zodat het tevoorschijn komt in de aangepaste pakketlijst voor de doelarchitectuur. Deze lijst wordt dan samengevoegd met de databank, en het pakket zal de status installed verkrijgen, waar het blijft tot de volgende versie van het bronpakket verschijnt.
Er zijn verschillende andere statussen; hieronder zijn: failed, wat gebruikt wordt voor pakketten die niet gecompileerd konden worden door fouten in de broncode, en waarbij verwacht wordt dat de problemen opgelost zullen worden in een volgende versie (nadat fouten gemeld werden, uiteraard). Zulk een nieuwe versie zal meteen needs-build binnengaan, maar met een waarschuwing dat iets mis was met de vorige versie. Samen met deze status wordt een foutbeschrijving opgeslagen. De status dep-wait wordt gebruikt wanneer een pakket een ander pakket nodig heeft, maar waarbij deze nog niet beschikbaar zijn en eerst opnieuw gecompileerd moeten worden. Deze status slaat de lijst van benodigde pakketten mee op, inclusief eventuele versies, en wanneer ze allemaal beschikbaar zijn, wordt de status terug naar needs-build gezet.
Zoals we al gezien hebben neemt de build daemon pakketten uit de databank om ze te compileren. Laat ons een beetje dichterbij kijken: als er een aantal pakketten beschikbaar zijn, dan gebruikt het sbuild voor het daadwerkelijke compilatieproces, en wordt voor elke compilatie een log naar de beheerder van de daemon gestuurd. Hij controleert de log en beslist wat ermee gedaan moet worden: het uploaden, het pakket op failed of dep-wait zetten, een aantal zaken aan de lijst met afhankelijkheden toevoegen en opnieuw proberen, enz... Als een positief antwoord ontvangen wordt, dan verplaatst de daemon het pakket naar een upload directory, vanwaar alle pakketten door een cronjob geuploaded worden.
Kijken naar de logbestanden is de enige menselijke interventie in het hele proces als er zich geen fouten voordoen. Er zijn twee goede redenen om het proces niet verder te automatiseren: Ten eerste is het zo dat compilaties soms met een 'OK' resultaat beëindigd worden, maar dat de compilatie toch mislukte om redenen die voor de machine niet zichtbaar zijn. Ten tweede is het zo dat het ogenblikkelijk uploaden van pakketten alleen mogelijk zou zijn via het automatisch PGP-ondertekenen van de resulterende bestanden met een sleutel zonder wachtwoord op de compilatiemachine. Ik vond dit een onaanvaardbaar beveiligingsrisico.
Het compilatiescript sbuild doet niet veel meer dan het aanroepen van een aantal standaard Debian-tools om de broncode te compileren. Het helpt ook bij een aantal standaard taken en wat boekhouding, maar het echt speciale ding aan sbuild zijn de broncode-afhankelijkheden. Dikwijls hebben pakketten andere pakketten nodig om gecompileerd te kunnen worden, bijvoorbeeld compilers en bibliotheekbestanden. Het is niet praktisch om al die pakketten ten allen tijde geïnstalleerd te hebben staan, en het is dikwijls zelfs niet mogelijk omwille van conflicten. De broncode-afhankelijkheden vertellen sbuild nu gewoon voor elk pakket welke andere pakketten benodigd zijn. Het kan ze dan automatisch installeren voor de compilatie uitgevoerd wordt, en ze nadien ook weer verwijderen.
De lijst van broncode-afhankelijkheden kan ten dele ook automatisch gegenereerd worden, door naar de lijst van afhankelijkheden van de binaire pakketten te kijken die door de broncode gegenereerd worden. Dit is de taak van andrea, die de afhankelijkheden in de i386-pakketlijst analyseert en bibliotheek-pakketten aan namen van ontwikkelingspakketten koppelt. Het voegt het resultaat ook samen met handmatige toevoegingen voor zaken die niet automatisch gegenereerd kunnen worden, zoals compilers of speciale tools.
Inhoud geschreven door Roman Hodek voor het 6e internationale Linux-Kongress 1999