Skip to content
  • Masahiro Yamada's avatar
    kconfig: make unmet dependency warnings readable · f8f69dc0
    Masahiro Yamada authored
    
    
    Currently, the unmet dependency warnings end up with endlessly long
    expressions, most of which are false positives.
    
    Here is test code to demonstrate how it currently works.
    
    [Test Case]
    
      config DEP1
              def_bool y
    
      config DEP2
              bool "DEP2"
    
      config A
              bool "A"
              select E
    
      config B
              bool "B"
              depends on DEP2
              select E
    
      config C
              bool "C"
              depends on DEP1 && DEP2
              select E
    
      config D
              def_bool n
              select E
    
      config E
              bool
              depends on DEP1 && DEP2
    
    [Result]
    
      $ make config
      scripts/kconfig/conf  --oldaskconfig Kconfig
      *
      * Linux Kernel Configuration
      *
      DEP2 (DEP2) [N/y/?] (NEW) n
      A (A) [N/y/?] (NEW) y
      warning: (A && B && D) selects E which has unmet direct
      dependencies (DEP1 && DEP2)
    
    Here, I see some points to be improved.
    
    First, '(A || B || D)' would make more sense than '(A && B && D)'.
    I am not sure if this is intentional, but expr_simplify_unmet_dep()
    turns OR expressions into AND, like follows:
    
            case E_OR:
                    return expr_alloc_and(
    
    Second, we see false positives.  'A' is a real unmet dependency.
    'B' is false positive because 'DEP1' is fixed to 'y', and 'B' depends
    on 'DEP2'.  'C' was correctly dropped by expr_simplify_unmet_dep().
    'D' is also false positive because it has no chance to be enabled.
    Current expr_simplify_unmet_dep() cannot avoid those false positives.
    
    After all, I decided to use the same helpers as used for printing
    reverse dependencies in the help.
    
    With this commit, unreadable warnings (most of the reported symbols are
    false positives) in the real world:
    
    $ make ARCH=score allyesconfig
    scripts/kconfig/conf  --allyesconfig Kconfig
    warning: (HWSPINLOCK_QCOM && AHCI_MTK && STMMAC_PLATFORM &&
     DWMAC_IPQ806X && DWMAC_LPC18XX && DWMAC_OXNAS && DWMAC_ROCKCHIP &&
     DWMAC_SOCFPGA && DWMAC_STI && TI_CPSW && PINCTRL_GEMINI &&
     PINCTRL_OXNAS && PINCTRL_ROCKCHIP && PINCTRL_DOVE &&
     PINCTRL_ARMADA_37XX && PINCTRL_STM32 && S3C2410_WATCHDOG &&
     VIDEO_OMAP3 && VIDEO_S5P_FIMC && USB_XHCI_MTK && RTC_DRV_AT91SAM9 &&
     LPC18XX_DMAMUX && VIDEO_OMAP4 && COMMON_CLK_GEMINI &&
     COMMON_CLK_ASPEED && COMMON_CLK_NXP && COMMON_CLK_OXNAS &&
     COMMON_CLK_BOSTON && QCOM_ADSP_PIL && QCOM_Q6V5_PIL && QCOM_GSBI &&
     ATMEL_EBI && ST_IRQCHIP && RESET_IMX7 && PHY_HI6220_USB &&
     PHY_RALINK_USB && PHY_ROCKCHIP_PCIE && PHY_DA8XX_USB) selects
     MFD_SYSCON which has unmet direct dependencies (HAS_IOMEM)
    warning: (PINCTRL_AT91 && PINCTRL_AT91PIO4 && PINCTRL_OXNAS &&
     PINCTRL_PISTACHIO && PINCTRL_PIC32 && PINCTRL_MESON &&
     PINCTRL_NOMADIK && PINCTRL_MTK && PINCTRL_MT7622 && GPIO_TB10X)
     selects OF_GPIO which has unmet direct dependencies (GPIOLIB && OF &&
     HAS_IOMEM)
    warning: (FAULT_INJECTION_STACKTRACE_FILTER && LATENCYTOP && LOCKDEP)
     selects FRAME_POINTER which has unmet direct dependencies
     (DEBUG_KERNEL && (CRIS || M68K || FRV || UML || SUPERH || BLACKFIN ||
     MN10300 || METAG) || ARCH_WANT_FRAME_POINTERS)
    
    will be turned into:
    
    $ make ARCH=score allyesconfig
    scripts/kconfig/conf  --allyesconfig Kconfig
    
    WARNING: unmet direct dependencies detected for MFD_SYSCON
      Depends on [n]: HAS_IOMEM [=n]
      Selected by [y]:
      - PINCTRL_STM32 [=y] && PINCTRL [=y] && (ARCH_STM32 ||
     COMPILE_TEST [=y]) && OF [=y]
      - RTC_DRV_AT91SAM9 [=y] && RTC_CLASS [=y] && (ARCH_AT91 ||
     COMPILE_TEST [=y])
      - RESET_IMX7 [=y] && RESET_CONTROLLER [=y]
      - PHY_HI6220_USB [=y] && (ARCH_HISI && ARM64 ||
     COMPILE_TEST [=y])
      - PHY_RALINK_USB [=y] && (RALINK || COMPILE_TEST [=y])
      - PHY_ROCKCHIP_PCIE [=y] && (ARCH_ROCKCHIP && OF [=y] ||
     COMPILE_TEST [=y])
    
    WARNING: unmet direct dependencies detected for OF_GPIO
      Depends on [n]: GPIOLIB [=y] && OF [=y] && HAS_IOMEM [=n]
      Selected by [y]:
      - PINCTRL_MTK [=y] && PINCTRL [=y] && (ARCH_MEDIATEK ||
     COMPILE_TEST [=y]) && OF [=y]
      - PINCTRL_MT7622 [=y] && PINCTRL [=y] && (ARCH_MEDIATEK ||
     COMPILE_TEST [=y]) && OF [=y] && (ARM64 || COMPILE_TEST [=y])
    
    WARNING: unmet direct dependencies detected for FRAME_POINTER
      Depends on [n]: DEBUG_KERNEL [=y] && (CRIS || M68K || FRV || UML ||
     SUPERH || BLACKFIN || MN10300 || METAG) || ARCH_WANT_FRAME_POINTERS [=n]
      Selected by [y]:
      - LATENCYTOP [=y] && DEBUG_KERNEL [=y] && STACKTRACE_SUPPORT [=y] &&
     PROC_FS [=y] && !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM_UNWIND &&
     !ARC && !X86
    
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Reviewed-by: default avatarPetr Vorel <petr.vorel@gmail.com>
    f8f69dc0