From patchwork Wed Dec 4 20:33:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53665 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F7F6E77172 for ; Wed, 4 Dec 2024 20:33:56 +0000 (UTC) Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by mx.groups.io with SMTP id smtpd.web10.25352.1733344429323093475 for ; Wed, 04 Dec 2024 12:33:49 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=r2MQd4A7; spf=softfail (domain: sakoman.com, ip: 209.85.215.180, mailfrom: steve@sakoman.com) Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-7fc93152edcso221265a12.0 for ; Wed, 04 Dec 2024 12:33:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344428; x=1733949228; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=vKvxFq/N9OJ/SZuT8jOJKH8KhtMqzB1+XF8+xConujw=; b=r2MQd4A7J5M7EfWSqxCsRi+/axUhQ2XDkNgnDO56U7uEiilMnCGGv/Im6AYS63ZN0L zdEG58QaWJKPMqe8/C4BGx0GajouheX1xYOJqHs3YjCyBOo4+8mAN379a95LeJcli9e0 Z6SLdl5b5on++grwOD4IrP78ecNd7uP+4vwfPnhOGQFgDESP2LL55dHnXy4rnrY8BBCO TQaTQoeLVeFrAqFwOkFtLy7CyzTSWYx1C+RmVHD/ZKGpoZ9XQ6+HZgP6gW+ivsia2EBk COSzycZiz4aqXnwQNFCipRzJRk4K8nd1eIo4IsANbsaU3bVXznlqdJeluMUDPHBX+K55 HoIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344428; x=1733949228; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vKvxFq/N9OJ/SZuT8jOJKH8KhtMqzB1+XF8+xConujw=; b=oWKUsjM5cOEmBnYByiLUBo03gLX/bwV0P/CPikGDslSFIxU12jjWt2Qb5fpHwC8l7H d6EdxLCA1XlwfL+UR3UHQnVVeEidNcJ4GC37gtXHDOi6Eo919DD6z/rsNhfzdfTfg+ZK M1mfcw3dWwa7XqqHX7BPdvq6w4NXVxyP1RwkE32nlZ9mlSjY6EsTdaTc9XU0ANaA1n2b sAnVNz3nxbBKohuCY3DSvGMUzYfqpUlDJ4k6iw/m3jkFgl5TizYC8LohG+UjJgeZZ/aP P07FUv8AznCZn7BbMIxb5VO2uxBgfhB0TZUnHUPVcniVoKfTwIhBul0X7+ya4b+pvaV6 M2jQ== X-Gm-Message-State: AOJu0YzzDZQnK5CArjC+SSlucRgSBuHqbwuiqg+lEwlvkkpyuqLRjnfU IY5Tl3QJc3kt9sq5wvN8SfRODa49FdPFRcC9IXnK98nOhP1pABW7Nsz4qITpvMqegy3pQ0o6ucT t X-Gm-Gg: ASbGncvvMBBLtPKeqFq4RLyQGuenoto/vvk5PxQVaDX8BibPPMTqSsfktuWV1eUS6wd +lxet/a7Auj5irt4nS3kIYg7CzrM8Amzf7Xakp1YYL8OhAcNqUHUTg2pnxUlPoi9Kr4h07AVFj1 jVaAUpsTS1X9RnsWtO+L1XihPbpvVnHfK0Wb3DFIt/S4gvd4hpOPOA4gGajJgK2jlTbpPjVRKVt /HK1nbHjUpgHANe4u8uv3XLGmf7HKYJWWklejU= X-Google-Smtp-Source: AGHT+IGg/6ss+68tbTq7MuUO9qAzSxlmugOSZ3tJ5SOdxKuF3Wq89h2rth+vdKlF9eilft20Qi19ng== X-Received: by 2002:a17:90b:17d2:b0:2ee:7504:bb3d with SMTP id 98e67ed59e1d1-2ef41923751mr1235680a91.0.1733344428565; Wed, 04 Dec 2024 12:33:48 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ef27062fa1sm1873984a91.45.2024.12.04.12.33.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:33:48 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][scarthgap][2.8][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Date: Wed, 4 Dec 2024 12:33:38 -0800 Message-Id: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:33:56 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16870 From: Richard Purdie There have been complaints about the performance of large multiconfig builds for a while. The key missing data point was that the builds needed to have large overlaps in sstate objects. This can be simulated by building the same things with just different TMPDIRs. In runqueue/bitbake terms this equates to large numbers of deferred tasks. The issue is that the expensive checks in the setscene loop were hit every time through runqueue's execute function before the check on deferred tasks. This leads to task execution starvation as that only happens once per iteration. Move the skip check earlier in the function which speeds things up enormously and should improve performance of such builds for users. Signed-off-by: Richard Purdie (cherry picked from commit 9c6c506757f2b3e28c8b20513b45da6b4659c95f) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 93079a977..744542b08 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -2195,6 +2195,9 @@ class RunQueueExecute: # Find the next setscene to run for nexttask in self.sorted_setscene_tids: if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred: + if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete: + # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds + continue if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \ nexttask not in self.sq_needed_harddeps and \ self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \ @@ -2224,8 +2227,7 @@ class RunQueueExecute: if t in self.runq_running and t not in self.runq_complete: continue if nexttask in self.sq_deferred: - if self.sq_deferred[nexttask] not in self.runq_complete: - continue + # Deferred tasks that were still deferred were skipped above so we now need to process logger.debug("Task %s no longer deferred" % nexttask) del self.sq_deferred[nexttask] valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False) From patchwork Wed Dec 4 20:33:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53664 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7EA0CE77171 for ; Wed, 4 Dec 2024 20:33:56 +0000 (UTC) Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by mx.groups.io with SMTP id smtpd.web11.25073.1733344430756045248 for ; Wed, 04 Dec 2024 12:33:50 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=Aft4UIqU; spf=softfail (domain: sakoman.com, ip: 209.85.216.41, mailfrom: steve@sakoman.com) Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-2ee6c2d6db0so209801a91.1 for ; Wed, 04 Dec 2024 12:33:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344430; x=1733949230; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=vTKNo+CtlIIy1v/tAWisJ5For3J41Zwo2KlWYv8iMgQ=; b=Aft4UIqUNnFyYFqKETvQTHt9tGnoaytKujVTO7rKmzNsazyEXAjDIruhRn4SBTAyFR rDjQIHc5uKeDu/rePJawYJ2WK9uVh1O8qPlcjuJwwLK8MyYkjgExdNrZTL7rrhkzqITv piH7t5BJdJBZSVMfSzRMdaoH6dRmQ2Uk1m/Bgon/Fz3JxBQnoY5PO4UPW5uxoEm71jkd AzBdMrdSay4lazNuMUUYq/iRlRX1pl2x8btmp0HWiTcj5e/NOrdOcr1qMXWr5ajmDjWb t2G5VnhkSXDe1VR4gqDG2nZ2U0Y2N5z26mELPqMAeS7KPMgyrF1U9tYsOu76igt3vINt 62fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344430; x=1733949230; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vTKNo+CtlIIy1v/tAWisJ5For3J41Zwo2KlWYv8iMgQ=; b=oz1jMrnHnlwRetr0ACrwyTta43iSqXN7RWdGSU1Hm60ZiEf1rdxW6Je8XQWhtESpLm 2CCFzgrw16KE3fc2npMTnJhIfhru3pkJ5fN0ynWChhoXnbcTLRDCUVqklviSNuqJQZd4 6+YeaIxMvQEUDSLO5C+IWE54vh6pr765DHgQqOjAo/yafoRlbny2QW+xSygDkKI/fPjh P3wItUVzsuSp5EDvhRCRuJAR+6ClJUsaKBO4KpJy5Q1SLPxw7pYAzcOqyfuJfCQe8GVF 5Q4xC9noKsnbNcGiLiZC0TLKaxMw2yguCcKsHJ0AJ6oToUul5FgGtjPvEdwHUcQUyhnt GvQQ== X-Gm-Message-State: AOJu0YzXP2zGoERaAocq7uxXlZiBOpcpBgajTK9GJdTomUPTlgLF0Caa UXe37VgDREPlUjNekTTXRvJnlw9r8RWyLLfZlfFCI1k8NIOQxosDszuKy6486ZkWpd6ZhtH9ZN1 h X-Gm-Gg: ASbGnctXP29ItpWHjwmvs/NH63OLjaQTAVysIZBWm+OdflsH+rAumtO1MEDIwZzUcHH P5zHTCvC5kwROZyt6AxPXSqZAFhzhx8FcSDlN3IqU7pg/0PRGTP1Yj24vyRD6dEVPRqzDQQZfbq ydMfu8OeHkz9lDBJ2pYKcc5BkA9TyqTZBpyAn8ZTrorxQRExw3KQEg5WsWsmoiiRAdWvi6f7krh rhwA3sdp4DkRLS4OqoN2Vx6AGIXvI+sLqFmzV0= X-Google-Smtp-Source: AGHT+IGfdkvUHNemsmEY6ua+qRUe8N3WX6Bcl8FMHpPeIXDwrFjCRtzPSiM+4vNJBLN5HEj2QGPcDQ== X-Received: by 2002:a17:90b:4a0a:b0:2ea:b564:4b31 with SMTP id 98e67ed59e1d1-2ef0121020cmr10190437a91.19.1733344430093; Wed, 04 Dec 2024 12:33:50 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ef27062fa1sm1873984a91.45.2024.12.04.12.33.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:33:49 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][scarthgap][2.8][PATCH 2/3] runqueue: Optimise setscene loop processing Date: Wed, 4 Dec 2024 12:33:39 -0800 Message-Id: <28569e9796d4b34d7b77b4f79074ab7854850386.1733344286.git.steve@sakoman.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:33:56 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16871 From: Richard Purdie Rather than looping through things we looped through on the previous execution, start looping where we left off for setscene processing. This gives speed improvements depending on the kind of build being executed. Signed-off-by: Richard Purdie (cherry picked from commit 00f4d932e3af0eeb333339cbe942010fc76dee0f) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 744542b08..75aef96a0 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -14,6 +14,7 @@ import os import sys import stat import errno +import itertools import logging import re import bb @@ -2189,11 +2190,16 @@ class RunQueueExecute: if not hasattr(self, "sorted_setscene_tids"): # Don't want to sort this set every execution self.sorted_setscene_tids = sorted(self.rqdata.runq_setscene_tids) + # Resume looping where we left off when we returned to feed the mainloop + self.setscene_tids_generator = itertools.cycle(self.rqdata.runq_setscene_tids) task = None if not self.sqdone and self.can_start_task(): - # Find the next setscene to run - for nexttask in self.sorted_setscene_tids: + loopcount = 0 + # Find the next setscene to run, exit the loop when we've processed all tids or found something to execute + while loopcount < len(self.rqdata.runq_setscene_tids): + loopcount += 1 + nexttask = next(self.setscene_tids_generator) if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred: if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete: # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds From patchwork Wed Dec 4 20:33:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53666 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E746E77170 for ; Wed, 4 Dec 2024 20:33:56 +0000 (UTC) Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) by mx.groups.io with SMTP id smtpd.web10.25354.1733344432238301197 for ; Wed, 04 Dec 2024 12:33:52 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=pFvUxXYF; spf=softfail (domain: sakoman.com, ip: 209.85.215.179, mailfrom: steve@sakoman.com) Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-7f43259d220so136617a12.3 for ; Wed, 04 Dec 2024 12:33:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344431; x=1733949231; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=FjL+ncbBx2u9ZdZksX+ANMOeqVtYoEy5f8mOcfdXBfI=; b=pFvUxXYFLAEq/wbQLrwDw8bAFSVw9ODR1quuddnm6L+iSSUNFuvVAXcKL0vc/kYzIL TBaB5F0fS/t2x7RYBApsbkIC36T6KM5g1udlrB8ZV6Zedu6ceGmNdwo4d4YIVepuKui2 FrY8t8FfqxpEFVN4jFLTPdaR9BVDnxpAgxMbaK0fTvry9Nrcn7yOmyrTFd3JamIg+VY2 5//aa7ZSxBb50i6QGJn9nVG0DCUCT0oqQj8/NI+VKRslu2oMOrdFigioQzd6VV5/rLyd zUrfEQoMAbJSQQA4upL0tgvy3hj313zOLITjPyYAm3mUO1vCfEvoJPWa1BQK8cD38axX 6OGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344431; x=1733949231; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FjL+ncbBx2u9ZdZksX+ANMOeqVtYoEy5f8mOcfdXBfI=; b=dw/QgHpwI0taqa4RN9QVpfkQS4BCoTWoFDPj1xmNwZNZNTtxBlv98LYJw+zdRCYAhb V9lTO1jtBYEFJIcqT7Rz6x3+U68D8LYWLbDGLkX7OIpeF1J46FlVuT8XMEBhx0Yfs2LW 4IXZtFb7g1CdFQToDWzFmdR12r7KN9vP5ZQ7xqBSMCnf8BT6CepgN6oSjVDZCAkMgMlD APLRzr49xMHu/jEgHmaCwno6AOWnq5/IucPZl9E0VcrH0LP+fv/yqk+0J1ufHKXdr/2H FuWWZTOd6gNfJmIIj6JTneq+8TTeIKdQU1QE6z4Nd6JzHlbybAflon+yU2ymLNVw76ZK mxoQ== X-Gm-Message-State: AOJu0YxydD9OrabdC91rFGJDyyoBte43Y8nSZQM9l/GJ4RD1MvselEQ2 VKH4NGoT03elvfiZWQmEK+TbqPRBCUd/V/5U/UOHQMQNODe4+wk4JzOkvbqD2Hubsd8+5SAiSPp 2 X-Gm-Gg: ASbGnctvLQ9aSOXTlEwjMPfnSUJAc0qSAp4RlBQgyY/M8KXZBCKjQj/WPO0SsawMTSU wgV4K17NImlGJeLnqCCQq7bjLcpL/N8xOlsaBCs1Vf5bqnBZf8xrRx1EpJti3Nql7UmMVNUPMP/ mH77UNtO+B41vCT0M87m0y1J/HF9VwI69gyTiNNxF7MsY4kxF9RpxIscgtceFDWZqaEA+2oqUXJ 5nTNqtNZd+a/Waei9v3vZy/lR7C/hpwxfC+hcs= X-Google-Smtp-Source: AGHT+IELdOKYixTMwUktyUc6sF4D7FYf/dwlOlfrjMWDIMlVDnJ1kQhK+SiPeP4wtsDZ0HZP94h/uw== X-Received: by 2002:a17:90b:4c4d:b0:2ee:b666:d14a with SMTP id 98e67ed59e1d1-2ef0120f386mr11730645a91.17.1733344431583; Wed, 04 Dec 2024 12:33:51 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ef27062fa1sm1873984a91.45.2024.12.04.12.33.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:33:51 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][scarthgap][2.8][PATCH 3/3] runqueue: Fix scenetask processing performance issue Date: Wed, 4 Dec 2024 12:33:40 -0800 Message-Id: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:33:56 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16872 From: Richard Purdie Analysis shows that "bitbake core-image-ptest-all" spends a lot of time in scenequeue_updatecounters and much of it is rebuilding a set which doens't change. Reorder the code to avoid that performance glitch. Signed-off-by: Richard Purdie (cherry picked from commit 923c19b9713e398d8e66e6d4422dfd4c18a03486) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 75aef96a0..439da2bb4 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -2759,8 +2759,12 @@ class RunQueueExecute: logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) self.sq_task_failoutright(dep) continue + + # For performance, only compute allcovered once if needed + if self.sqdata.sq_deps[task]: + allcovered = self.scenequeue_covered | self.scenequeue_notcovered for dep in sorted(self.sqdata.sq_deps[task]): - if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered): + if self.sqdata.sq_revdeps[dep].issubset(allcovered): if dep not in self.sq_buildable: self.sq_buildable.add(dep)