From patchwork Sun Sep 26 20:24:08 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Lacombe X-Patchwork-Id: 210322 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8QKQWBE017290 for ; Sun, 26 Sep 2010 20:26:32 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757501Ab0IZU0c (ORCPT ); Sun, 26 Sep 2010 16:26:32 -0400 Received: from mail-iw0-f174.google.com ([209.85.214.174]:56173 "EHLO mail-iw0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753593Ab0IZU0c (ORCPT ); Sun, 26 Sep 2010 16:26:32 -0400 Received: by iwn5 with SMTP id 5so4131295iwn.19 for ; Sun, 26 Sep 2010 13:26:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=lPONLsdFAvsQWuC+ZVt/Bb9DN8Z9Sj3q15VbBmEpMQY=; b=an+9wa6kkLs2cWAIZWxpPZEMYOyMYnsyn+j9wLPW4ddy9MWDNSJPLzyyk3B6hAEesr HQFdwoUDIZuN7yvo9BMddhM+cxKL14C/FI184C5CekxvVV6sJ7SiEscT1fU1N6RA3SB/ vcNsvsZCO7EpNO4cp5BSqA59W2D8D1DF1Ebcs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=SgJ4ksXrwRhnycIHPF9GmS1cJVZsueNeJ+UQaFrNfd679bnusTrFjy/bQkdP3MQtc4 864Xz3ckz7s/qscgfANK4IjiDd0VI/6bw1AI5g09FNBBbC3djJxA2po719dzsKTgLtf8 RMmSihm/SFg7IfQ7zIgUSkRbCKN1RFljpuL4k= Received: by 10.231.147.202 with SMTP id m10mr8048401ibv.2.1285532791135; Sun, 26 Sep 2010 13:26:31 -0700 (PDT) Received: from localhost.localdomain (69-165-136-93.dsl.teksavvy.com [69.165.136.93]) by mx.google.com with ESMTPS id i6sm5276067iba.8.2010.09.26.13.26.29 (version=SSLv3 cipher=RC4-MD5); Sun, 26 Sep 2010 13:26:30 -0700 (PDT) From: Arnaud Lacombe To: Michal Marek Cc: linux-kbuild , Arnaud Lacombe , Catalin Marinas Subject: [RFC] kconfig: simplify select-with-unmet-direct-dependency warning Date: Sun, 26 Sep 2010 16:24:08 -0400 Message-Id: <1285532648-28943-1-git-send-email-lacombar@gmail.com> X-Mailer: git-send-email 1.7.2.30.gc37d7.dirty Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Sun, 26 Sep 2010 20:26:33 +0000 (UTC) diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 27e795c..49753cb 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -1017,6 +1017,48 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2) #endif } +static inline struct expr * +expr_get_leftmost_symbol(const struct expr *e) +{ + + if (e == NULL) + return NULL; + + while (e->type != E_SYMBOL) + e = e->left.expr; + + return expr_copy(e); +} + +/* + * Given expression `e1' and `e2', returns the leaf of the longest + * sub-expression of `e1' not containing 'e2. + */ +struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2) +{ + struct expr *ret; + + switch (e1->type) { + case E_OR: + return expr_alloc_and( + expr_simplify_unmet_dep(e1->left.expr, e2), + expr_simplify_unmet_dep(e1->right.expr, e2)); + case E_AND: { + struct expr *e; + e = expr_alloc_and(expr_copy(e1), expr_copy(e2)); + e = expr_eliminate_dups(e); + ret = (!expr_eq(e, e1)) ? e1 : NULL; + expr_free(e); + break; + } + default: + ret = e1; + break; + } + + return expr_get_leftmost_symbol(ret); +} + void expr_print(const struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) { if (!e) { diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index cd258da..ee16790 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -385,12 +385,16 @@ void sym_calc_value(struct symbol *sym) } calc_newval: if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) { + struct expr *e; + e = expr_simplify_unmet_dep(sym->rev_dep.expr, + sym->dir_dep.expr); fprintf(stderr, "warning: ("); - expr_fprint(sym->rev_dep.expr, stderr); + expr_fprint(e, stderr); fprintf(stderr, ") selects %s which has unmet direct dependencies (", sym->name); expr_fprint(sym->dir_dep.expr, stderr); fprintf(stderr, ")\n"); + expr_free(e); } newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); }