2005-09-13 13:56:32

by Joern Engel

[permalink] [raw]
Subject: Missing #include <config.h>

After spending some hours last night and this morning hunting a bug,
I've found that a different include order made a difference. Some
files don't work correctly, unless config.h is included before.

Here is a very stupid bug checker for the problem class:
$ rgrep CONFIG include/ | cut -d: -f1 | sort -u > g1
$ rgrep CONFIG include/ | cut -d: -f1 | sort -u | xargs grep "config.h" | cut -d: -f1 | sort -u > g2
$ diff -u g1 g2 | grep ^- > g3

Result is quite a long list for 2.6.13. include/config/* are false
positives, ok. But what should we do about the rest?

-include/acpi/acpi_bus.h
-include/acpi/acpi_drivers.h
-include/acpi/actypes.h
-include/acpi/amlcode.h
-include/asm-alpha/bug.h
-include/asm-alpha/core_polaris.h
-include/asm-alpha/ioctls.h
-include/asm-alpha/pci.h
-include/asm-alpha/processor.h
-include/asm-alpha/rwsem.h
-include/asm-alpha/semaphore.h
-include/asm-alpha/topology.h
-include/asm-arm/arch-clps711x/debug-macro.S
-include/asm-arm/arch-clps711x/time.h
-include/asm-arm/arch-ebsa285/debug-macro.S
-include/asm-arm/arch-epxa10db/excalibur.h
-include/asm-arm/arch-epxa10db/hardware.h
-include/asm-arm/arch-epxa10db/pld_conf00.h
-include/asm-arm/arch-h720x/boards.h
-include/asm-arm/arch-h720x/dma.h
-include/asm-arm/arch-h720x/entry-macro.S
-include/asm-arm/arch-h720x/hardware.h
-include/asm-arm/arch-h720x/irqs.h
-include/asm-arm/arch-imx/hardware.h
-include/asm-arm/arch-integrator/hardware.h
-include/asm-arm/arch-integrator/platform.h
-include/asm-arm/arch-iop3xx/debug-macro.S
-include/asm-arm/arch-iop3xx/entry-macro.S
-include/asm-arm/arch-iop3xx/iop321.h
-include/asm-arm/arch-iop3xx/iop331-irqs.h
-include/asm-arm/arch-iop3xx/iop331.h
-include/asm-arm/arch-iop3xx/irqs.h
-include/asm-arm/arch-iop3xx/system.h
-include/asm-arm/arch-ixp2000/io.h
-include/asm-arm/arch-ixp2000/platform.h
-include/asm-arm/arch-ixp4xx/entry-macro.S
-include/asm-arm/arch-ixp4xx/hardware.h
-include/asm-arm/arch-ixp4xx/io.h
-include/asm-arm/arch-ixp4xx/irqs.h
-include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
-include/asm-arm/arch-l7200/time.h
-include/asm-arm/arch-lh7a40x/entry-macro.S
-include/asm-arm/arch-lh7a40x/memory.h
-include/asm-arm/arch-omap/board-innovator.h
-include/asm-arm/arch-omap/cpu.h
-include/asm-arm/arch-omap/debug-macro.S
-include/asm-arm/arch-omap/fpga.h
-include/asm-arm/arch-omap/memory.h
-include/asm-arm/arch-omap/mux.h
-include/asm-arm/arch-omap/omap16xx.h
-include/asm-arm/arch-omap/omap730.h
-include/asm-arm/arch-omap/param.h
-include/asm-arm/arch-omap/pm.h
-include/asm-arm/arch-omap/tc.h
-include/asm-arm/arch-omap/tps65010.h
-include/asm-arm/arch-pxa/dma.h
-include/asm-arm/arch-pxa/entry-macro.S
-include/asm-arm/arch-pxa/memory.h
-include/asm-arm/arch-s3c2410/debug-macro.S
-include/asm-arm/arch-s3c2410/hardware.h
-include/asm-arm/arch-s3c2410/memory.h
-include/asm-arm/arch-s3c2410/regs-clock.h
-include/asm-arm/arch-s3c2410/regs-dsc.h
-include/asm-arm/arch-versatile/platform.h
-include/asm-arm/arch-versatile/system.h
-include/asm-arm/bitops.h
-include/asm-arm/hardware/pci_v3.h
-include/asm-arm/ide.h
-include/asm-arm/ioctls.h
-include/asm-arm/mach/irq.h
-include/asm-arm/mach/time.h
-include/asm-arm/numnodes.h
-include/asm-arm/setup.h
-include/asm-arm/spinlock.h
-include/asm-arm26/ioctls.h
-include/asm-cris/arch-v10/pgtable.h
-include/asm-cris/arch-v10/processor.h
-include/asm-cris/arch-v10/sv_addr.agh
-include/asm-cris/arch-v10/sv_addr_ag.h
-include/asm-cris/arch-v32/atomic.h
-include/asm-cris/arch-v32/hwregs/asm/intr_vect.h
-include/asm-cris/arch-v32/hwregs/intr_vect.h
-include/asm-cris/arch-v32/juliette.h
-include/asm-cris/arch-v32/spinlock.h
-include/asm-cris/dma-mapping.h
-include/asm-cris/dma.h
-include/asm-cris/io.h
-include/asm-cris/ioctls.h
-include/asm-cris/system.h
-include/asm-frv/cacheflush.h
-include/asm-frv/cpu-irqs.h
-include/asm-frv/ioctls.h
-include/asm-frv/mb-regs.h
-include/asm-frv/mb86943a.h
-include/asm-frv/mem-layout.h
-include/asm-frv/mmu.h
-include/asm-frv/setup.h
-include/asm-frv/thread_info.h
-include/asm-frv/topology.h
-include/asm-frv/uaccess.h
-include/asm-generic/percpu.h
-include/asm-generic/rtc.h
-include/asm-h8300/ioctls.h
-include/asm-h8300/irq.h
-include/asm-h8300/ptrace.h
-include/asm-h8300/timex.h
-include/asm-i386/acpi.h
-include/asm-i386/cacheflush.h
-include/asm-i386/cpu.h
-include/asm-i386/ioctls.h
-include/asm-i386/kprobes.h
-include/asm-i386/linkage.h
-include/asm-i386/mach-default/do_timer.h
-include/asm-i386/mach-default/entry_arch.h
-include/asm-i386/mach-default/irq_vectors_limits.h
-include/asm-i386/mach-default/mach_apic.h
-include/asm-i386/mach-default/pci-functions.h
-include/asm-i386/mach-es7000/mach_apic.h
-include/asm-i386/mach-es7000/mach_wakecpu.h
-include/asm-i386/mach-summit/mach_mpparse.h
-include/asm-i386/mach-visws/cobalt.h
-include/asm-i386/mach-visws/do_timer.h
-include/asm-i386/mach-visws/entry_arch.h
-include/asm-i386/mach-visws/mach_apic.h
-include/asm-i386/mach-voyager/do_timer.h
-include/asm-i386/mach-voyager/setup_arch_post.h
-include/asm-i386/mmzone.h
-include/asm-i386/module.h
-include/asm-i386/mpspec.h
-include/asm-i386/msi.h
-include/asm-i386/numaq.h
-include/asm-i386/ptrace.h
-include/asm-i386/sparsemem.h
-include/asm-i386/srat.h
-include/asm-i386/suspend.h
-include/asm-i386/timer.h
-include/asm-i386/topology.h
-include/asm-i386/voyager.h
-include/asm-ia64/acpi.h
-include/asm-ia64/bug.h
-include/asm-ia64/cpu.h
-include/asm-ia64/cyclone.h
-include/asm-ia64/hw_irq.h
-include/asm-ia64/ioctls.h
-include/asm-ia64/iosapic.h
-include/asm-ia64/irq.h
-include/asm-ia64/kprobes.h
-include/asm-ia64/mmu_context.h
-include/asm-ia64/mmzone.h
-include/asm-ia64/numnodes.h
-include/asm-ia64/pci.h
-include/asm-ia64/sal.h
-include/asm-ia64/sn/shub_mmr.h
-include/asm-ia64/sn/sn2/sn_hwperf.h
-include/asm-ia64/sn/tioca.h
-include/asm-ia64/spinlock.h
-include/asm-ia64/topology.h
-include/asm-m32r/ioctls.h
-include/asm-m32r/m32102.h
-include/asm-m32r/mmzone.h
-include/asm-m32r/s1d13806.h
-include/asm-m32r/thread_info.h
-include/asm-m68k/amigayle.h
-include/asm-m68k/amipcmcia.h
-include/asm-m68k/bvme6000hw.h
-include/asm-m68k/ioctls.h
-include/asm-m68k/mvme16xhw.h
-include/asm-m68knommu/anchor.h
-include/asm-m68knommu/atomic.h
-include/asm-m68knommu/cacheflush.h
-include/asm-m68knommu/checksum.h
-include/asm-m68knommu/dbg.h
-include/asm-m68knommu/delay.h
-include/asm-m68knommu/m5249sim.h
-include/asm-m68knommu/m5307sim.h
-include/asm-m68knommu/pci.h
-include/asm-m68knommu/ptrace.h
-include/asm-m68knommu/string.h
-include/asm-m68knommu/thread_info.h
-include/asm-m68knommu/ucontext.h
-include/asm-mips/arc/hinv.h
-include/asm-mips/bug.h
-include/asm-mips/ddb5xxx/ddb5074.h
-include/asm-mips/ddb5xxx/ddb5476.h
-include/asm-mips/galileo-boards/gt96100.h
-include/asm-mips/gt64120.h
-include/asm-mips/gt64240.h
-include/asm-mips/ioctls.h
-include/asm-mips/ip32/mace.h
-include/asm-mips/jazz.h
-include/asm-mips/lasat/lasat.h
-include/asm-mips/mach-au1x00/au1000_usbdev.h
-include/asm-mips/mach-au1x00/au1100_mmc.h
-include/asm-mips/mach-au1x00/au1xxx_psc.h
-include/asm-mips/mach-pb1x00/pb1000.h
-include/asm-mips/mips-boards/bonito64.h
-include/asm-mips/mips-boards/malta.h
-include/asm-mips/mmzone.h
-include/asm-mips/pci/bridge.h
-include/asm-mips/sgi/mc.h
-include/asm-mips/sibyte/sb1250_dma.h
-include/asm-mips/sibyte/sb1250_mc.h
-include/asm-mips/sibyte/sb1250_regs.h
-include/asm-mips/sibyte/sb1250_scd.h
-include/asm-mips/sni.h
-include/asm-mips/titan_dep.h
-include/asm-mips/tx4927/smsc_fdc37m81x.h
-include/asm-mips/tx4927/tx4927.h
-include/asm-parisc/assembly.h
-include/asm-parisc/bug.h
-include/asm-parisc/ioctls.h
-include/asm-parisc/led.h
-include/asm-parisc/mmzone.h
-include/asm-parisc/pdcpat.h
-include/asm-parisc/rt_sigframe.h
-include/asm-parisc/spinlock.h
-include/asm-parisc/superio.h
-include/asm-ppc/atomic.h
-include/asm-ppc/bug.h
-include/asm-ppc/cpm2.h
-include/asm-ppc/gg2.h
-include/asm-ppc/gt64260_defs.h
-include/asm-ppc/hawk_defs.h
-include/asm-ppc/highmem.h
-include/asm-ppc/ibm_ocp.h
-include/asm-ppc/ioctls.h
-include/asm-ppc/kexec.h
-include/asm-ppc/macio.h
-include/asm-ppc/mpc52xx.h
-include/asm-ppc/mpc8260_pci9.h
-include/asm-ppc/mv64x60_defs.h
-include/asm-ppc/pci.h
-include/asm-ppc/perfmon.h
-include/asm-ppc/pnp.h
-include/asm-ppc/ppc_sys.h
-include/asm-ppc/ppcboot.h
-include/asm-ppc/ptrace.h
-include/asm-ppc/reg.h
-include/asm-ppc/reg_booke.h
-include/asm-ppc/residual.h
-include/asm-ppc/spinlock.h
-include/asm-ppc/termios.h
-include/asm-ppc/uninorth.h
-include/asm-ppc64/bug.h
-include/asm-ppc64/iSeries/HvLpConfig.h
-include/asm-ppc64/ioctls.h
-include/asm-ppc64/iommu.h
-include/asm-ppc64/kprobes.h
-include/asm-ppc64/pSeries_reconfig.h
-include/asm-ppc64/pci.h
-include/asm-ppc64/ptrace.h
-include/asm-ppc64/rtas.h
-include/asm-ppc64/sparsemem.h
-include/asm-ppc64/termios.h
-include/asm-s390/bug.h
-include/asm-s390/ioctls.h
-include/asm-s390/pci.h
-include/asm-s390/percpu.h
-include/asm-s390/spinlock.h
-include/asm-sh/cpu-sh3/cache.h
-include/asm-sh/cpu-sh3/cacheflush.h
-include/asm-sh/cpu-sh3/freq.h
-include/asm-sh/cpu-sh3/timer.h
-include/asm-sh/cpu-sh4/cacheflush.h
-include/asm-sh/cpu-sh4/freq.h
-include/asm-sh/cpu-sh4/timer.h
-include/asm-sh/dreamcast/pci.h
-include/asm-sh/harp/harp.h
-include/asm-sh/ioctls.h
-include/asm-sh/kgdb.h
-include/asm-sh/mc146818rtc.h
-include/asm-sh/microdev/io.h
-include/asm-sh/mmu.h
-include/asm-sh/mmu_context.h
-include/asm-sh/module.h
-include/asm-sh/mpc1211/m1543c.h
-include/asm-sh/overdrive/gt64111.h
-include/asm-sh/param.h
-include/asm-sh/pci.h
-include/asm-sh/pgalloc.h
-include/asm-sh/processor.h
-include/asm-sh/rts7751r2d/rts7751r2d.h
-include/asm-sh/se/se.h
-include/asm-sh/se/smc37c93x.h
-include/asm-sh/sigcontext.h
-include/asm-sh/snapgear/io.h
-include/asm-sh/spinlock.h
-include/asm-sh/timex.h
-include/asm-sh/uaccess.h
-include/asm-sh/ubc.h
-include/asm-sh64/dma.h
-include/asm-sh64/io.h
-include/asm-sh64/ioctls.h
-include/asm-sh64/keyboard.h
-include/asm-sh64/pci.h
-include/asm-sh64/pgalloc.h
-include/asm-sh64/processor.h
-include/asm-sh64/registers.h
-include/asm-sh64/types.h
-include/asm-sparc/bug.h
-include/asm-sparc/highmem.h
-include/asm-sparc/ioctls.h
-include/asm-sparc/pci.h
-include/asm-sparc/pcic.h
-include/asm-sparc/spinlock.h
-include/asm-sparc64/asi.h
-include/asm-sparc64/bug.h
-include/asm-sparc64/ioctls.h
-include/asm-sparc64/pci.h
-include/asm-sparc64/percpu.h
-include/asm-sparc64/ptrace.h
-include/asm-sparc64/thread_info.h
-include/asm-sparc64/upa.h
-include/asm-um/pgtable-3level.h
-include/asm-um/pgtable.h
-include/asm-um/processor-ppc.h
-include/asm-v850/anna.h
-include/asm-v850/as85ep1.h
-include/asm-v850/bug.h
-include/asm-v850/cacheflush.h
-include/asm-v850/dma.h
-include/asm-v850/entry.h
-include/asm-v850/ioctls.h
-include/asm-v850/ma.h
-include/asm-v850/me2.h
-include/asm-v850/pci.h
-include/asm-v850/rte_cb.h
-include/asm-v850/rte_ma1_cb.h
-include/asm-v850/rte_me2_cb.h
-include/asm-v850/rte_nb85e_cb.h
-include/asm-v850/teg.h
-include/asm-v850/v850e2_cache.h
-include/asm-v850/v850e_uarta.h
-include/asm-v850/v850e_uartb.h
-include/asm-x86_64/acpi.h
-include/asm-x86_64/bug.h
-include/asm-x86_64/hpet.h
-include/asm-x86_64/ioctls.h
-include/asm-x86_64/irq.h
-include/asm-x86_64/mce.h
-include/asm-x86_64/mpspec.h
-include/asm-x86_64/nmi.h
-include/asm-x86_64/percpu.h
-include/asm-x86_64/proto.h
-include/asm-x86_64/sparsemem.h
-include/asm-x86_64/suspend.h
-include/asm-xtensa/bitops.h
-include/asm-xtensa/bug.h
-include/asm-xtensa/fixmap.h
-include/asm-xtensa/ioctls.h
-include/asm-xtensa/pgtable.h
-include/asm-xtensa/ptrace.h
-include/asm-xtensa/timex.h
-include/asm-xtensa/xtensa/config-linux_be/core.h
-include/asm-xtensa/xtensa/config-linux_be/system.h
-include/asm-xtensa/xtensa/config-linux_be/tie.h
-include/asm-xtensa/xtensa/hal.h
-include/linux/ac97_codec.h
-include/linux/amifdreg.h
-include/linux/arcdevice.h
-include/linux/atalk.h
-include/linux/audit.h
-include/linux/b1lli.h
-include/linux/bio.h
-include/linux/bootmem.h
-include/linux/capability.h
-include/linux/cciss_ioctl.h
-include/linux/cdrom.h
-include/linux/com20020.h
-include/linux/compat_ioctl.h
-include/linux/config.h
-include/linux/cpu.h
-include/linux/cpumask.h
-include/linux/cpuset.h
-include/linux/crash_dump.h
-include/linux/cycx_x25.h
-include/linux/debugfs.h
-include/linux/devpts_fs.h
-include/linux/dio.h
-include/linux/divert.h
-include/linux/dm-ioctl.h
-include/linux/dmi.h
-include/linux/efi.h
-include/linux/eisa.h
-include/linux/elf-fdpic.h
-include/linux/eventpoll.h
-include/linux/ext3_fs.h
-include/linux/ext3_fs_i.h
-include/linux/ext3_fs_sb.h
-include/linux/ext3_jbd.h
-include/linux/fb.h
-include/linux/fdreg.h
-include/linux/flat.h
-include/linux/fsnotify.h
-include/linux/gameport.h
-include/linux/harrier_defs.h
-include/linux/hdreg.h
-include/linux/hiddev.h
-include/linux/hugetlb.h
-include/linux/i2c.h
-include/linux/i2o-dev.h
-include/linux/i2o.h
-include/linux/if_wanpipe_common.h
-include/linux/input.h
-include/linux/ioctl32.h
-include/linux/ipmi.h
-include/linux/jbd.h
-include/linux/jffs2_fs_sb.h
-include/linux/kernel.h
-include/linux/kexec.h
-include/linux/key.h
-include/linux/kmalloc_sizes.h
-include/linux/kobject.h
-include/linux/kobject_uevent.h
-include/linux/libata.h
-include/linux/mca.h
-include/linux/mii.h
-include/linux/mtd/cfi_endian.h
-include/linux/mtio.h
-include/linux/mv643xx.h
-include/linux/netfilter_bridge/ebt_stp.h
-include/linux/netfilter_ipv4/ip_conntrack_protocol.h
-include/linux/netpoll.h
-include/linux/nfs_fs_sb.h
-include/linux/nfs_xdr.h
-include/linux/nfsd/const.h
-include/linux/nfsd_idmap.h
-include/linux/page-flags.h
-include/linux/pagemap.h
-include/linux/parport_pc.h
-include/linux/pci-acpi.h
-include/linux/percpu.h
-include/linux/pkt_cls.h
-include/linux/pktcdvd.h
-include/linux/pnp.h
-include/linux/pnpbios.h
-include/linux/ps2esdi.h
-include/linux/qic117.h
-include/linux/raw.h
-include/linux/reboot_fixups.h
-include/linux/reiserfs_acl.h
-include/linux/reiserfs_fs.h
-include/linux/reiserfs_fs_sb.h
-include/linux/rslib.h
-include/linux/sdla.h
-include/linux/sdla_asy.h
-include/linux/sdla_chdlc.h
-include/linux/sdla_fr.h
-include/linux/sdla_ppp.h
-include/linux/sdla_x25.h
-include/linux/sdlapci.h
-include/linux/security.h
-include/linux/sem.h
-include/linux/shm.h
-include/linux/sysctl.h
-include/linux/sysfs.h
-include/linux/topology.h
-include/linux/usb_ch9.h
-include/linux/usb_gadget.h
-include/linux/usb_gadgetfs.h
-include/linux/usbdevice_fs.h
-include/linux/vermagic.h
-include/linux/via.h
-include/linux/wanrouter.h
-include/linux/watchdog.h
-include/linux/zorro.h
-include/media/audiochip.h
-include/media/saa7146.h
-include/media/tuner.h
-include/net/act_api.h
-include/net/bluetooth/bluetooth.h
-include/net/bluetooth/hci_core.h
-include/net/dn_fib.h
-include/net/ieee80211.h
-include/net/if_inet6.h
-include/net/ipx.h
-include/net/irda/irlan_event.h
-include/net/llc.h
-include/net/ndisc.h
-include/net/neighbour.h
-include/net/pkt_cls.h
-include/net/pkt_sched.h
-include/net/sctp/constants.h
-include/net/sctp/structs.h
-include/net/tc_act/tc_gact.h
-include/net/xfrm.h
-include/pcmcia/cisreg.h
-include/pcmcia/cistpl.h
-include/pcmcia/cs.h
-include/pcmcia/ds.h
-include/rxrpc/rxrpc.h
-include/scsi/scsi_host.h
-include/sound/ac97_codec.h
-include/sound/ad1816a.h
-include/sound/control.h
-include/sound/core.h
-include/sound/cs4231.h
-include/sound/cs46xx.h
-include/sound/emux_synth.h
-include/sound/gus.h
-include/sound/hdsp.h
-include/sound/hdspm.h
-include/sound/hwdep.h
-include/sound/info.h
-include/sound/initval.h
-include/sound/minors.h
-include/sound/mixer_oss.h
-include/sound/opl3.h
-include/sound/pcm.h
-include/sound/rawmidi.h
-include/sound/sb.h
-include/sound/seq_kernel.h
-include/sound/snd_wavefront.h
-include/sound/uda1341.h
-include/sound/version.h
-include/sound/vx_core.h
-include/sound/ymfpci.h
-include/video/aty128.h
-include/video/cvisionppc.h
-include/video/epson1355.h
-include/video/kyro.h
-include/video/mach64.h
-include/video/neomagic.h
-include/video/newport.h
-include/video/permedia2.h
-include/video/radeon.h
-include/video/s1d13xxxfb.h
-include/video/sgivw.h
-include/video/tdfx.h

J?rn

--
The story so far:
In the beginning the Universe was created. This has made a lot
of people very angry and been widely regarded as a bad move.
-- Douglas Adams?


2005-09-13 14:08:32

by Russell King

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, Sep 13, 2005 at 02:56:23PM +0100, J?rn Engel wrote:
> After spending some hours last night and this morning hunting a bug,
> I've found that a different include order made a difference. Some
> files don't work correctly, unless config.h is included before.

I'm still of the opinion that we should add

-imacros include/linux/config.h

to the gcc command line and stop bothering with trying to get
linux/config.h included into the right files and not in others.
(which then means we can eliminate linux/config.h from all files.)

>From what you can see below, missing includes of it can remain
for months, and it can cause bugs which are rather non-obvious.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-13 14:12:54

by Christoph Hellwig

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, Sep 13, 2005 at 03:08:26PM +0100, Russell King wrote:
> On Tue, Sep 13, 2005 at 02:56:23PM +0100, J?rn Engel wrote:
> > After spending some hours last night and this morning hunting a bug,
> > I've found that a different include order made a difference. Some
> > files don't work correctly, unless config.h is included before.
>
> I'm still of the opinion that we should add
>
> -imacros include/linux/config.h
>
> to the gcc command line and stop bothering with trying to get
> linux/config.h included into the right files and not in others.
> (which then means we can eliminate linux/config.h from all files.)

Yes, absolutely. That would help fixing lots of mess.

2005-09-13 14:12:50

by Josh Boyer

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, 2005-09-13 at 14:56 +0100, Jörn Engel wrote:
> After spending some hours last night and this morning hunting a bug,
> I've found that a different include order made a difference. Some
> files don't work correctly, unless config.h is included before.
>
> Here is a very stupid bug checker for the problem class:
> $ rgrep CONFIG include/ | cut -d: -f1 | sort -u > g1
> $ rgrep CONFIG include/ | cut -d: -f1 | sort -u | xargs grep "config.h" | cut -d: -f1 | sort -u > g2
> $ diff -u g1 g2 | grep ^- > g3

Your checker doesn't quite test for nested includes. E.g. if foo.h
includes bar.h, and bar.h includes config.h, then foo.h doesn't need to
include config.h explicitly.

For a more concrete example, take include/asm-i386/kprobes.h from your
list. That includes linux/types.h, which includes linux/config.h.

Making a tool that takes that into account could be interesting.

josh

2005-09-13 14:28:42

by Russell King

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, Sep 13, 2005 at 09:12:33AM -0500, Josh Boyer wrote:
> On Tue, 2005-09-13 at 14:56 +0100, Jörn Engel wrote:
> > After spending some hours last night and this morning hunting a bug,
> > I've found that a different include order made a difference. Some
> > files don't work correctly, unless config.h is included before.
> >
> > Here is a very stupid bug checker for the problem class:
> > $ rgrep CONFIG include/ | cut -d: -f1 | sort -u > g1
> > $ rgrep CONFIG include/ | cut -d: -f1 | sort -u | xargs grep "config.h" | cut -d: -f1 | sort -u > g2
> > $ diff -u g1 g2 | grep ^- > g3
>
> Your checker doesn't quite test for nested includes. E.g. if foo.h
> includes bar.h, and bar.h includes config.h, then foo.h doesn't need to
> include config.h explicitly.

Unfortunately, we don't operate like that. If a file makes use of
CONFIG_xxx then it must include <linux/config.h>.

We have "make configcheck" to help us find <linux/config.h> screwups.
Unfortunately, it seems from the output that no one runs it anymore.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-13 14:40:22

by Josh Boyer

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, 2005-09-13 at 15:28 +0100, Russell King wrote:
> On Tue, Sep 13, 2005 at 09:12:33AM -0500, Josh Boyer wrote:
> > On Tue, 2005-09-13 at 14:56 +0100, Jörn Engel wrote:
> > > After spending some hours last night and this morning hunting a bug,
> > > I've found that a different include order made a difference. Some
> > > files don't work correctly, unless config.h is included before.
> > >
> > > Here is a very stupid bug checker for the problem class:
> > > $ rgrep CONFIG include/ | cut -d: -f1 | sort -u > g1
> > > $ rgrep CONFIG include/ | cut -d: -f1 | sort -u | xargs grep "config.h" | cut -d: -f1 | sort -u > g2
> > > $ diff -u g1 g2 | grep ^- > g3
> >
> > Your checker doesn't quite test for nested includes. E.g. if foo.h
> > includes bar.h, and bar.h includes config.h, then foo.h doesn't need to
> > include config.h explicitly.
>
> Unfortunately, we don't operate like that. If a file makes use of
> CONFIG_xxx then it must include <linux/config.h>.

Well, that rule makes things easier then, so Jörn's list would be pretty
complete.

Your proposal of using -imacros is even better though.

josh

2005-09-13 14:50:21

by Russell King

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Tue, Sep 13, 2005 at 03:08:26PM +0100, Russell King wrote:
> On Tue, Sep 13, 2005 at 02:56:23PM +0100, J?rn Engel wrote:
> > After spending some hours last night and this morning hunting a bug,
> > I've found that a different include order made a difference. Some
> > files don't work correctly, unless config.h is included before.
>
> I'm still of the opinion that we should add
>
> -imacros include/linux/config.h
>
> to the gcc command line and stop bothering with trying to get
> linux/config.h included into the right files and not in others.
> (which then means we can eliminate linux/config.h from all files.)
>
> From what you can see below, missing includes of it can remain
> for months, and it can cause bugs which are rather non-obvious.

Well, fixing all the ARM related config.h include mess, the patch
comes out at 53K with this diffstat summary:

150 files changed, 142 insertions(+), 91 deletions(-)

I really think we should stop being crazy and apply something like
the patch below instead. Afterwards, we may optionally want to re-
educate people to not include linux/config.h after all.

======
Subject: [KBUILD] Permanently fix kernel configuration include mess.

Include autoconf.h into every kernel compilation via the gcc
command line using -imacros. This ensures that we have the
kernel configuration included from the start, rather than
relying on each file having #include <linux/config.h> as
appropriate. History has shown that this is something which
is difficult to get right.

Since we now include the kernel configuration automatically,
make configcheck becomes meaningless, so remove it.

Signed-off-by: Russell King <[email protected]>

diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -346,7 +346,8 @@ AFLAGS_KERNEL =
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE := -Iinclude \
- $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
+ $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
+ -imacros include/linux/autoconf.h

CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)

@@ -1247,11 +1248,6 @@ tags: FORCE
# Scripts to check various things for consistency
# ---------------------------------------------------------------------------

-configcheck:
- find * $(RCS_FIND_IGNORE) \
- -name '*.[hcS]' -type f -print | sort \
- | xargs $(PERL) -w scripts/checkconfig.pl
-
includecheck:
find * $(RCS_FIND_IGNORE) \
-name '*.[hcS]' -type f -print | sort \

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-13 16:22:41

by Doug Maxey

[permalink] [raw]
Subject: Re: Missing #include <config.h>

#!/usr/local/bin/perl
# $Id: inctree,v 1.1.1.1 2001/11/16 17:16:36 dwm Exp $
# $Header: /cvs/local/share/inctree,v 1.1.1.1 2001/11/16 17:16:36 dwm Exp $
# $Log: inctree,v $
# Revision 1.1.1.1 2001/11/16 17:16:36 dwm
# after rome burned.
#
# Revision 1.1 2001/11/16 17:16:36 dwm
# .
#
# Revision 1.10 1998-06-11 09:35:42-05 dwm
# *** empty log message ***
#
# Revision 1.9 1998-06-11 09:32:20-05 dwm
# *** empty log message ***
#
# Revision 1.8 1996-06-20 11:09:00-05 dwm
# *** empty log message ***
#
# Revision 1.7 1996-06-20 11:06:47-05 dwm
# sucks on AIX build tree.
#
# Revision 1.6 1996-06-20 08:39:46-05 dwm
# *** empty log message ***
#
# Revision 1.5 1996-06-20 08:34:11-05 dwm
# fix for using other compiler.
#
# Revision 1.4 1995-06-07 20:15:35-0500 dwm
# now we exclude the -c, -f*, and -M* compiler flags.
#
# Revision 1.3 1994-06-08 22:46:37-0500 dwm
# added support for C++
#
# Revision 1.2 1993/07/16 04:06:56 dwm
# Zthe -? neeeded a \.
#
# Revision 1.1 1993/07/16 03:51:35 dwm
# Initial revision
#

require 5.004;

# 'inctree' created 93/07/09 11:40 to validate/print the #includes
# for files.
# from the camel book, p274
#################################
############ GLOBALS ############
#################################
( $prog = $0 ) =~ s#.*/##o ; $0 = join(' ', $prog, @ARGV) ;
$CPP = $ENV{'CPP'} || 'gcc -E' ;
$shiftwidth = 4 ;

#################################
########## SUBROUTINES ##########
#################################
sub usage
{
print STDERR @_ if @_ ;
print STDERR <<"EOU" ;
usage: $prog [-d] [-D...] [-I...] [-l] [-m/pattern/] file...

$prog runs the C preprocessor (default $CPP) on the specified files,
passing along any -D or -I switches, then processes the output of
cpp into a tree of who included what. Files included more than
once are marked DUPLICATE.

flags:
-C... preprocessor definition (default $CPP_name).
-D... defines for the preprocessor.
-I... dirs to search for the #include files.
-d prints debugging info.
-h|-? print this message.
-l prints the line numbers of the include statements.
-m/../ outputs any lines including the pattern specified.
-s\d sets shiftwidth (default $shiftwidth).
EOU
exit 1 ;
}

#################################
############ MAIN ############
#################################
# require 'getopts.pl' ;
# &Getopts('dD:I:lm:') || &usage ;
while ( $ARGV[0] =~ /^-/ )
{
$_ = shift ;
if (/^-C(.*)/)
{
$opt_cpp = ( $1 ? $1 : shift ) ;
}
elsif (/^-([DU])(.*)/)
{
$defines .= " -$1" . ($2 ? $2 : shift );
}
elsif (/^-I(.*)/)
{
$includes .= " -I" . ($1 ? $1 : shift );
}
elsif (/^-m(.*)/)
{
push(@pats, $1 ? $1 : shift );
}
elsif ( /^-d/ )
{
$debug++ ;
}
elsif ( /^-l/ )
{
$lines++ ;
}
elsif (/^-s(.*)/)
{
$shiftwidth = ( $1 ? $1 : shift ) ;
}
elsif (/^-h|^-\?/)
{
&usage ;
}
# other compiler flags
elsif (/^-g(.*)|^-O(.*)|^-traditional|^-c|^-f(.*)|^-M(.*)/)
{
next ;
}
elsif (/^-v$/ )
{
$verbose = $_ ;
}
else
{
push (@ccopts, $_);
#&usage("Unrecognized switch $_\n") ;
}

}

print STDERR "$defines\n" if $debug ;
print STDERR "$includes\n" if $debug ;

# build a subroutine to scan for patterns
if ( @pats )
{
$sub = "sub pats ()\n{\n" ;
foreach $pat ( @pats )
{
$sub .= " print '>>>>>>> ',\$_ if m$pat;\n" ;
}
$sub .= "}\n" ;
print STDERR $sub if $debug ;
eval $sub ;
die $@ if $@ ;
++$pats ;
}

# process each file.
foreach $file (@ARGV)
{
if (length $opt_cpp)
{
$CPP_name = $opt_cpp;
}
elsif ($file =~ /.C$|.cc$/) {
$CPP_name = "g++ -E" ;
}
else {
$CPP_name = $CPP ;
}

$ccopts = join (" ", @ccopts);
$pipecmd = "$CPP_name $verbose $ccopts $defines $includes $file|" ;
open(CPP,$pipecmd)
|| die "Can't run $pipecmd: $!\n" ;
$line = 2 ;

while (<CPP>)
{
++$line ;
pats () if $pats ; # avoid expensive call if we can.
next unless /^#/ ;
next unless /^# \d/ ;
(undef, $newline, $filename) = split ;
$filename =~ s/\"//g ;

# now figure out if it's push, pop, or neither.
if ($stack[$#stack] eq $filename)
{
$line = $newline - 1 ;
next ;
}

if ($stack[$#stack - 1] eq $filename) # Leaving file.
{
$indent -= $shiftwidth ;
$line = pop(@lines) - 1 ;
pop(@stack) ;
}
else # New file.
{
printf "%6d ", $line -2 if $lines ;
push(@lines, $line) ;
$line = $newline ;
print "\t" x ($indent / 8), ' ' x ($indent % 8),
$filename ;
print " DUPLICATE" if $seen{$filename}++ ;
print "\n" ;
$indent += $shiftwidth ;
push(@stack, $filename) ;
}
}
close CPP ;
$indent = 0 ;
%seen = () ;
print "\n\n" ;
$line = 0 ;
}
exit 0

2005-09-13 17:00:07

by Joern Engel

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Tue, 13 September 2005 15:50:12 +0100, Russell King wrote:
>
> Subject: [KBUILD] Permanently fix kernel configuration include mess.
>
> Include autoconf.h into every kernel compilation via the gcc
> command line using -imacros. This ensures that we have the
> kernel configuration included from the start, rather than
> relying on each file having #include <linux/config.h> as
> appropriate. History has shown that this is something which
> is difficult to get right.
>
> Since we now include the kernel configuration automatically,
> make configcheck becomes meaningless, so remove it.
>
> Signed-off-by: Russell King <[email protected]>

If it helps:
Signed-off-by: Joern Engel <[email protected]>

> diff --git a/Makefile b/Makefile
> --- a/Makefile
> +++ b/Makefile
> @@ -346,7 +346,8 @@ AFLAGS_KERNEL =
> # Use LINUXINCLUDE when you must reference the include/ directory.
> # Needed to be compatible with the O= option
> LINUXINCLUDE := -Iinclude \
> - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> + -imacros include/linux/autoconf.h
>
> CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
>
> @@ -1247,11 +1248,6 @@ tags: FORCE
> # Scripts to check various things for consistency
> # ---------------------------------------------------------------------------
>
> -configcheck:
> - find * $(RCS_FIND_IGNORE) \
> - -name '*.[hcS]' -type f -print | sort \
> - | xargs $(PERL) -w scripts/checkconfig.pl
> -
> includecheck:
> find * $(RCS_FIND_IGNORE) \
> -name '*.[hcS]' -type f -print | sort \

J?rn

--
Schr?dinger's cat is <BLINK>not</BLINK> dead.
-- Illiad

2005-09-13 17:56:13

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, 13 Sep 2005, [iso-8859-1] J?rn Engel wrote:
> After spending some hours last night and this morning hunting a bug,
> I've found that a different include order made a difference. Some
> files don't work correctly, unless config.h is included before.
>
> Here is a very stupid bug checker for the problem class:
> $ rgrep CONFIG include/ | cut -d: -f1 | sort -u > g1
> $ rgrep CONFIG include/ | cut -d: -f1 | sort -u | xargs grep "config.h" | cut -d: -f1 | sort -u > g2
> $ diff -u g1 g2 | grep ^- > g3
>
> Result is quite a long list for 2.6.13. include/config/* are false
> positives, ok. But what should we do about the rest?

> -include/asm-m68k/amigayle.h
> -include/asm-m68k/amipcmcia.h
> -include/asm-m68k/bvme6000hw.h
> -include/asm-m68k/ioctls.h
> -include/asm-m68k/mvme16xhw.h

These are false positives as well.

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2005-09-13 17:57:44

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, 13 Sep 2005, Christoph Hellwig wrote:
> On Tue, Sep 13, 2005 at 03:08:26PM +0100, Russell King wrote:
> > On Tue, Sep 13, 2005 at 02:56:23PM +0100, J?rn Engel wrote:
> > > After spending some hours last night and this morning hunting a bug,
> > > I've found that a different include order made a difference. Some
> > > files don't work correctly, unless config.h is included before.
> >
> > I'm still of the opinion that we should add
> >
> > -imacros include/linux/config.h
> >
> > to the gcc command line and stop bothering with trying to get
> > linux/config.h included into the right files and not in others.
> > (which then means we can eliminate linux/config.h from all files.)
>
> Yes, absolutely. That would help fixing lots of mess.

What about dependencies? Would it cause a recompile of everything if config.h
is changed?

[...]

Ah, I guess not, since config.h is filtered out of the deps anyway and replaced
by a smarter dependency on the correct CONFIG_*, right?

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2005-09-13 18:02:52

by Russell King

[permalink] [raw]
Subject: Re: Missing #include <config.h>

On Tue, Sep 13, 2005 at 07:57:30PM +0200, Geert Uytterhoeven wrote:
> On Tue, 13 Sep 2005, Christoph Hellwig wrote:
> > On Tue, Sep 13, 2005 at 03:08:26PM +0100, Russell King wrote:
> > > On Tue, Sep 13, 2005 at 02:56:23PM +0100, J?rn Engel wrote:
> > > > After spending some hours last night and this morning hunting a bug,
> > > > I've found that a different include order made a difference. Some
> > > > files don't work correctly, unless config.h is included before.
> > >
> > > I'm still of the opinion that we should add
> > >
> > > -imacros include/linux/config.h
> > >
> > > to the gcc command line and stop bothering with trying to get
> > > linux/config.h included into the right files and not in others.
> > > (which then means we can eliminate linux/config.h from all files.)
> >
> > Yes, absolutely. That would help fixing lots of mess.
>
> What about dependencies? Would it cause a recompile of everything if config.h
> is changed?

-imacros include/linux/autoconf.h doesn't leak into the dependencies so
it's fine.

> Ah, I guess not, since config.h is filtered out of the deps anyway and
> replaced by a smarter dependency on the correct CONFIG_*, right?

According to my .*.cmd files, apparantly so.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-13 18:04:16

by Russell King

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Tue, Sep 13, 2005 at 05:59:54PM +0100, Joern Engel wrote:
> On Tue, 13 September 2005 15:50:12 +0100, Russell King wrote:
> >
> > Subject: [KBUILD] Permanently fix kernel configuration include mess.
> >
> > Include autoconf.h into every kernel compilation via the gcc
> > command line using -imacros. This ensures that we have the
> > kernel configuration included from the start, rather than
> > relying on each file having #include <linux/config.h> as
> > appropriate. History has shown that this is something which
> > is difficult to get right.
> >
> > Since we now include the kernel configuration automatically,
> > make configcheck becomes meaningless, so remove it.
> >
> > Signed-off-by: Russell King <[email protected]>
>
> If it helps:
> Signed-off-by: Joern Engel <[email protected]>

Might help more if I copied (or sent this to) akpm. 8)

diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -346,7 +346,8 @@ AFLAGS_KERNEL =
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE := -Iinclude \
- $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
+ $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
+ -imacros include/linux/autoconf.h

CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)

@@ -1247,11 +1248,6 @@ tags: FORCE
# Scripts to check various things for consistency
# ---------------------------------------------------------------------------

-configcheck:
- find * $(RCS_FIND_IGNORE) \
- -name '*.[hcS]' -type f -print | sort \
- | xargs $(PERL) -w scripts/checkconfig.pl
-
includecheck:
find * $(RCS_FIND_IGNORE) \
-name '*.[hcS]' -type f -print | sort \


--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-13 19:09:31

by Brian Gerst

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess

Russell King wrote:
> On Tue, Sep 13, 2005 at 05:59:54PM +0100, Joern Engel wrote:
>
>>On Tue, 13 September 2005 15:50:12 +0100, Russell King wrote:
>>
>>>Subject: [KBUILD] Permanently fix kernel configuration include mess.
>>>
>>>Include autoconf.h into every kernel compilation via the gcc
>>>command line using -imacros. This ensures that we have the
>>>kernel configuration included from the start, rather than
>>>relying on each file having #include <linux/config.h> as
>>>appropriate. History has shown that this is something which
>>>is difficult to get right.
>>>
>>>Since we now include the kernel configuration automatically,
>>>make configcheck becomes meaningless, so remove it.
>>>
>>>Signed-off-by: Russell King <[email protected]>
>>
>>If it helps:
>>Signed-off-by: Joern Engel <[email protected]>
>
>
> Might help more if I copied (or sent this to) akpm. 8)
>
> diff --git a/Makefile b/Makefile
> --- a/Makefile
> +++ b/Makefile
> @@ -346,7 +346,8 @@ AFLAGS_KERNEL =
> # Use LINUXINCLUDE when you must reference the include/ directory.
> # Needed to be compatible with the O= option
> LINUXINCLUDE := -Iinclude \
> - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> + -imacros include/linux/autoconf.h
>
> CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
>
> @@ -1247,11 +1248,6 @@ tags: FORCE
> # Scripts to check various things for consistency
> # ---------------------------------------------------------------------------
>
> -configcheck:
> - find * $(RCS_FIND_IGNORE) \
> - -name '*.[hcS]' -type f -print | sort \
> - | xargs $(PERL) -w scripts/checkconfig.pl
> -
> includecheck:
> find * $(RCS_FIND_IGNORE) \
> -name '*.[hcS]' -type f -print | sort \
>
>

The patch should also remove the checkconfig.pl script.

2005-09-13 19:33:14

by Josh Boyer

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess

On Tue, 2005-09-13 at 15:10 -0400, Brian Gerst wrote:
> Russell King wrote:
> > On Tue, Sep 13, 2005 at 05:59:54PM +0100, Joern Engel wrote:
> >
> >>On Tue, 13 September 2005 15:50:12 +0100, Russell King wrote:
> >>
> >>>Subject: [KBUILD] Permanently fix kernel configuration include mess.
> >>>
> >>>Include autoconf.h into every kernel compilation via the gcc
> >>>command line using -imacros. This ensures that we have the
> >>>kernel configuration included from the start, rather than
> >>>relying on each file having #include <linux/config.h> as
> >>>appropriate. History has shown that this is something which
> >>>is difficult to get right.
> >>>
> >>>Since we now include the kernel configuration automatically,
> >>>make configcheck becomes meaningless, so remove it.
> >>>
> >>>Signed-off-by: Russell King <[email protected]>
> >>
> >>If it helps:
> >>Signed-off-by: Joern Engel <[email protected]>
> >
> >
> > Might help more if I copied (or sent this to) akpm. 8)
> >
> > diff --git a/Makefile b/Makefile
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -346,7 +346,8 @@ AFLAGS_KERNEL =
> > # Use LINUXINCLUDE when you must reference the include/ directory.
> > # Needed to be compatible with the O= option
> > LINUXINCLUDE := -Iinclude \
> > - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> > + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> > + -imacros include/linux/autoconf.h
> >
> > CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
> >
> > @@ -1247,11 +1248,6 @@ tags: FORCE
> > # Scripts to check various things for consistency
> > # ---------------------------------------------------------------------------
> >
> > -configcheck:
> > - find * $(RCS_FIND_IGNORE) \
> > - -name '*.[hcS]' -type f -print | sort \
> > - | xargs $(PERL) -w scripts/checkconfig.pl
> > -
> > includecheck:
> > find * $(RCS_FIND_IGNORE) \
> > -name '*.[hcS]' -type f -print | sort \
> >
> >
>
> The patch should also remove the checkconfig.pl script.

That could probably be done in a later cleanup patch that removes all
"#include <linux/config.h>" statements as well. Sounds like a job for
the kernel janitors project.

josh

2005-09-13 20:00:17

by Alexey Dobriyan

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess

On Tue, Sep 13, 2005 at 02:33:04PM -0500, Josh Boyer wrote:
> That could probably be done in a later cleanup patch that removes all
> "#include <linux/config.h>" statements as well. Sounds like a job for
> the kernel janitors project.

Only after -imacros will hit mainline. For now, it's a "cleanup "make
checkconfig" output".

BTW, somebody who'll send a final patch, please, ensure that "make C=1"
doesn't blow up. Grepping for "macros" on sparse codebase show nothing.

2005-09-14 08:40:28

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

Russell King <[email protected]> wrote:
>
> LINUXINCLUDE := -Iinclude \
> - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> + -imacros include/linux/autoconf.h

This means that over time the kernel will fail to compile correctly without
`-imacros include/linux/autoconf.h'.

That's OK for the kernel, but not for out-of-tree stuff. Those drivers
will need to add the new gcc commandline option too.

Not that I'm saying it's a terrible thing. It's just a thing.

2005-09-14 08:48:42

by Russell King

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Wed, Sep 14, 2005 at 01:39:44AM -0700, Andrew Morton wrote:
> Russell King <[email protected]> wrote:
> >
> > LINUXINCLUDE := -Iinclude \
> > - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> > + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> > + -imacros include/linux/autoconf.h
>
> This means that over time the kernel will fail to compile correctly without
> `-imacros include/linux/autoconf.h'.
>
> That's OK for the kernel, but not for out-of-tree stuff. Those drivers
> will need to add the new gcc commandline option too.
>
> Not that I'm saying it's a terrible thing. It's just a thing.

Well I don't really understand all the kbuild complexities, so I just
did a "what works for me in the setups I have" patch. Maybe someone
who properly understands the kbuild complexity should have a look.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core

2005-09-14 13:48:38

by Sergey Vlasov

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Wed, 14 Sep 2005 01:39:44 -0700 Andrew Morton wrote:

> Russell King <[email protected]> wrote:
> >
> > LINUXINCLUDE := -Iinclude \
> > - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> > + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> > + -imacros include/linux/autoconf.h
>
> This means that over time the kernel will fail to compile correctly without
> `-imacros include/linux/autoconf.h'.
>
> That's OK for the kernel, but not for out-of-tree stuff. Those drivers
> will need to add the new gcc commandline option too.

You mean out-of-tree drivers which don't use the kernel makefiles when
compiling for 2.6? Are there such beasts, and do we care about them?

(For 2.4 such crap was almost everywhere; for 2.6 the situation seems
to be better.)


Attachments:
(No filename) (828.00 B)
(No filename) (189.00 B)
Download all attachments

2005-09-14 14:02:51

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Wed, Sep 14, 2005 at 01:39:44AM -0700, Andrew Morton wrote:
> Russell King <[email protected]> wrote:
> >
> > LINUXINCLUDE := -Iinclude \
> > - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> > + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> > + -imacros include/linux/autoconf.h
>
> This means that over time the kernel will fail to compile correctly without
> `-imacros include/linux/autoconf.h'.
>
> That's OK for the kernel, but not for out-of-tree stuff. Those drivers
> will need to add the new gcc commandline option too.

The only supported way to compile out of tree drivers for 2.6.x is
to use the kbuild framework, which will automatically add it.

2005-09-14 17:02:11

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [PATCH] Permanently fix kernel configuration include mess (was: Missing #include <config.h>)

On Wed, Sep 14, 2005 at 01:39:44AM -0700, Andrew Morton wrote:
> Russell King <[email protected]> wrote:
> >
> > LINUXINCLUDE := -Iinclude \
> > - $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
> > + $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
> > + -imacros include/linux/autoconf.h
>
> This means that over time the kernel will fail to compile correctly without
> `-imacros include/linux/autoconf.h'.
>
> That's OK for the kernel, but not for out-of-tree stuff. Those drivers
> will need to add the new gcc commandline option too.
Out-of-tree stuff are broken if they do not use kbuild.
And for 2.6 many out-of-tree modules has started doing this - especially
when they realised how easy it was (modulos backward compatibility
stuff).

Sam