Back in 2016, we discussed rules for headers, and these were generally liked:
1. Have a carefully curated header that's included everywhere first. We got that already thanks to Peter: osdep.h. 2. Headers should normally include everything they need beyond osdep.h. If exceptions are needed for some reason, they must be documented in the header. If all that's needed from a header is typedefs, put those into qemu/typedefs.h instead of including the header. 3. Cyclic inclusion is forbidden. Message-ID: <87h9g8j57d....@blackfin.pond.sub.org> http://lists.nongnu.org/archive/html/qemu-devel/2016-03/msg03345.html Trouble is we're not exactly close to obeying 2. This series demonstrates a possible path towards obeying it: enforce it in "make check", except for known-bad headers. We can then whittle down known-bad headers step by step in future patches. PATCH 1 adds the tests, but only for include/. 764 headers, 179 known-bad. PATCH 2 cleans up include/ somewhat. The work remaining should be fairly obvious now. I plan to spin out my cleanups as a separate non-RFC patch submission. PATCH 3 makes the tests more thorough in a simple and stupid way. Massive overkill, painfully slow. I'm open for better ideas. Previous iterations had additional patches to test all headers, not just include/. I decided to focus in include/ and shelve them for now. Testing: I tested various configurations on an x86 host (everything enabled, everything disabled, KVM only (TCG disabled), user only, MinGW). I also tested lightly on ARM and PPC hosts. Exhaustive testing is not practical. I can't exclude the possibility that the new test fails in configurations I didn't test. Known issues: (1) Many headers are (meant to be) only included into certain contexts. In two places, the code makes its intent explicit: * include/exec/cpu-defs.h #errors out when included into target-independent code (#ifndef NEED_CPU_H) * include/hw/hw.h #errors out when included into user emulation code (#ifdef CONFIG_USER_ONLY) I manually marked headers including them, so that the test can treat them specially. Better ideas welcome. Such #erroring isn't done for other contexts (perhaps it should be). Inclusion into the wrong context fails in various ways instead. The resulting test failures are marked FIXME. The ones that fail by accident (if any) should be fixed. The ones that aren't meant to succeed need to be treated specially by the test. (2) A few headers are only included into code that's compiled with special CFLAGS. The test doesn't know, and the resulting test failures are marked FIXME. Known instances: include/ui/gtk.h and GTK_CFLAGS, include/ui/sdl2.h and SDL_CFLAGS. Please have a look and tell me what you think. v5: * Old PATCH 1-4: Merged in commit 234e256511e * Old PATCH 6-7: Shelved for now * PATCH 1: - Rebased (uff) - Suppress debug info to save disk space - Fix .SECONDARY for $(check-bad-target-header-tests) - Minor tweaks to make PATCH 3 simpler - Add include/hw/xen/interface/ to excluded-headers - Rewrite the Make code to find magic comments - Test with -Wunused-function to cope with static inline functions * PATCH 2-3: New v4: * PATCH 1-4: New. * PATCH 5: - Implement testing of target-dependent headers - Replace crude "expected to fail with WIN32" by a set of "expected to fail without FOO". * Old PATCH 3-5: Dropped. These were examples for whittling down known-bad headers. v3: * Old PATH 1 moved to another series * PATCH 1: - Skip the test unless $(SRC_PATH)/.git exists - Exclude third-party headers [Peter] - Exclude Coccinelle header - Fix egrep vs. fgrep typos - Mark and exclude headers that die due to poison.h, because testing them isn't implemented, yet - tests/header-test-template.c not omitted (d'oh) * PATCH 3: Replaced * PATCH 5: New v2: * PATCH 2: - Use fixed-format FIXME comments in headers instead of a blacklist in the makefile [Paolo] - Make target check-source [Peter] - Special-case CONFIG_WIN32 * PATCH 3: - replaced by an unrelated one that makes actual sense (I hope) Markus Armbruster (3): tests: New make target check-source include: Make headers more self-contained tests: Check target-independent headers for each target, too Makefile | 4 +- Makefile.target | 20 ++++ include/block/raw-aio.h | 2 + include/block/write-threshold.h | 2 + include/chardev/char-win.h | 3 + include/chardev/spice.h | 2 + include/disas/disas.h | 1 + include/exec/cpu-all.h | 4 + include/exec/cpu-defs.h | 3 + include/exec/cpu_ldst.h | 4 + include/exec/cpu_ldst_template.h | 3 + include/exec/cpu_ldst_useronly_template.h | 3 + include/exec/cputlb.h | 3 + include/exec/exec-all.h | 3 + include/exec/gen-icount.h | 2 + include/exec/helper-gen.h | 2 + include/exec/helper-proto.h | 2 + include/exec/helper-tcg.h | 2 + include/exec/ioport.h | 4 + include/exec/memory-internal.h | 4 + include/exec/memory_ldst.inc.h | 2 + include/exec/memory_ldst_cached.inc.h | 2 + include/exec/memory_ldst_phys.inc.h | 2 + include/exec/ram_addr.h | 3 + include/exec/softmmu-semi.h | 4 + include/exec/tb-hash.h | 4 + include/exec/tb-lookup.h | 3 + include/exec/translator.h | 2 + include/exec/user/abitypes.h | 2 + include/exec/user/thunk.h | 4 + include/fpu/softfloat-macros.h | 4 + include/fpu/softfloat.h | 2 + include/hw/acpi/acpi.h | 2 + include/hw/acpi/acpi_dev_interface.h | 2 + include/hw/acpi/cpu.h | 3 + include/hw/acpi/cpu_hotplug.h | 2 + include/hw/acpi/ich9.h | 2 + include/hw/acpi/memory_hotplug.h | 2 + include/hw/acpi/pci.h | 3 + include/hw/acpi/pcihp.h | 2 + include/hw/acpi/tco.h | 5 + include/hw/acpi/utils.h | 2 + include/hw/acpi/vmgenid.h | 2 + include/hw/adc/stm32f2xx_adc.h | 4 + include/hw/arm/allwinner-a10.h | 5 + include/hw/arm/armsse.h | 4 + include/hw/arm/armv7m.h | 4 + include/hw/arm/aspeed.h | 3 + include/hw/arm/aspeed_soc.h | 5 + include/hw/arm/bcm2835_peripherals.h | 2 + include/hw/arm/bcm2836.h | 5 + include/hw/arm/digic.h | 4 + include/hw/arm/exynos4210.h | 5 +- include/hw/arm/fsl-imx25.h | 5 + include/hw/arm/fsl-imx31.h | 5 + include/hw/arm/fsl-imx6.h | 4 + include/hw/arm/fsl-imx6ul.h | 4 + include/hw/arm/fsl-imx7.h | 4 + include/hw/arm/msf2-soc.h | 4 + include/hw/arm/nrf51_soc.h | 4 + include/hw/arm/omap.h | 2 + include/hw/arm/pxa.h | 2 + include/hw/arm/sharpsl.h | 3 + include/hw/arm/smmu-common.h | 3 +- include/hw/arm/smmuv3.h | 2 + include/hw/arm/soc_dma.h | 2 + include/hw/arm/stm32f205_soc.h | 4 + include/hw/arm/virt.h | 2 + include/hw/arm/xlnx-versal.h | 2 + include/hw/arm/xlnx-zynqmp.h | 5 + include/hw/audio/pcspk.h | 2 + include/hw/audio/wm8750.h | 3 + include/hw/block/fdc.h | 2 + include/hw/block/flash.h | 3 + include/hw/boards.h | 2 + include/hw/char/bcm2835_aux.h | 2 + include/hw/char/cadence_uart.h | 2 + include/hw/char/cmsdk-apb-uart.h | 2 + include/hw/char/digic-uart.h | 3 +- include/hw/char/escc.h | 3 + include/hw/char/imx_serial.h | 2 + include/hw/char/lm32_juart.h | 2 + include/hw/char/nrf51_uart.h | 2 + include/hw/char/parallel.h | 2 + include/hw/char/pl011.h | 2 + include/hw/char/serial.h | 2 + include/hw/char/stm32f2xx_usart.h | 2 + include/hw/char/xilinx_uartlite.h | 4 + include/hw/core/generic-loader.h | 1 + include/hw/core/split-irq.h | 3 + include/hw/cpu/a15mpcore.h | 3 + include/hw/cpu/a9mpcore.h | 3 + include/hw/cpu/arm11mpcore.h | 2 + include/hw/cpu/cluster.h | 3 + include/hw/cpu/core.h | 3 + include/hw/cris/etraxfs.h | 3 + include/hw/cris/etraxfs_dma.h | 3 + include/hw/display/bcm2835_fb.h | 2 + include/hw/display/edid.h | 2 + include/hw/display/i2c-ddc.h | 3 + include/hw/display/milkymist_tmu2.h | 3 +- include/hw/display/vga.h | 3 + include/hw/display/xlnx_dp.h | 2 + include/hw/dma/bcm2835_dma.h | 2 + include/hw/dma/i8257.h | 2 + include/hw/dma/pl080.h | 2 + include/hw/dma/xlnx-zdma.h | 2 + include/hw/dma/xlnx-zynq-devcfg.h | 2 + include/hw/dma/xlnx_dpdma.h | 2 + include/hw/elf_ops.h | 2 + include/hw/empty_slot.h | 2 + include/hw/gpio/bcm2835_gpio.h | 3 + include/hw/gpio/imx_gpio.h | 2 + include/hw/gpio/nrf51_gpio.h | 4 +- include/hw/hw.h | 2 + include/hw/hyperv/hyperv.h | 2 + include/hw/i2c/aspeed_i2c.h | 4 + include/hw/i2c/bitbang_i2c.h | 2 + include/hw/i2c/i2c.h | 2 + include/hw/i2c/imx_i2c.h | 3 +- include/hw/i2c/microbit_i2c.h | 2 + include/hw/i2c/pm_smbus.h | 2 + include/hw/i2c/ppc4xx_i2c.h | 2 + include/hw/i2c/smbus_eeprom.h | 2 + include/hw/i2c/smbus_master.h | 2 + include/hw/i2c/smbus_slave.h | 2 + include/hw/i386/apic_internal.h | 5 + include/hw/i386/ich9.h | 2 + include/hw/i386/intel_iommu.h | 2 + include/hw/i386/ioapic_internal.h | 3 + include/hw/i386/pc.h | 2 + include/hw/i386/x86-iommu.h | 2 + include/hw/ide.h | 2 + include/hw/ide/ahci.h | 3 +- include/hw/ide/internal.h | 2 + include/hw/ide/pci.h | 2 + include/hw/input/adb.h | 2 + include/hw/input/i8042.h | 3 + include/hw/input/tsc2xxx.h | 2 + include/hw/intc/allwinner-a10-pic.h | 4 + include/hw/intc/arm_gic.h | 2 + include/hw/intc/arm_gic_common.h | 2 + include/hw/intc/arm_gicv3.h | 2 + include/hw/intc/arm_gicv3_common.h | 2 + include/hw/intc/arm_gicv3_its_common.h | 2 + include/hw/intc/armv7m_nvic.h | 4 + include/hw/intc/aspeed_vic.h | 3 + include/hw/intc/bcm2835_ic.h | 2 + include/hw/intc/bcm2836_control.h | 2 + include/hw/intc/heathrow_pic.h | 4 + include/hw/intc/imx_avic.h | 3 + include/hw/intc/imx_gpcv2.h | 2 + include/hw/intc/mips_gic.h | 5 + include/hw/intc/realview_gic.h | 2 + include/hw/intc/xlnx-pmu-iomod-intc.h | 2 + include/hw/intc/xlnx-zynqmp-ipi.h | 2 + include/hw/ipack/ipack.h | 2 + include/hw/ipmi/ipmi.h | 2 + include/hw/isa/apm.h | 2 + include/hw/isa/i8259_internal.h | 2 + include/hw/isa/isa.h | 2 + include/hw/isa/pc87312.h | 3 + include/hw/isa/superio.h | 3 + include/hw/isa/vt82c686.h | 2 + include/hw/kvm/clock.h | 2 + include/hw/loader.h | 2 + include/hw/mem/memory-device.h | 2 + include/hw/mem/nvdimm.h | 2 + include/hw/mem/pc-dimm.h | 3 +- include/hw/mips/bios.h | 2 + include/hw/mips/cps.h | 5 + include/hw/mips/cpudevs.h | 2 + include/hw/misc/a9scu.h | 3 + include/hw/misc/arm11scu.h | 2 + include/hw/misc/armsse-cpuid.h | 2 + include/hw/misc/armsse-mhu.h | 2 + include/hw/misc/aspeed_scu.h | 3 + include/hw/misc/aspeed_sdmc.h | 3 + include/hw/misc/aspeed_xdma.h | 2 + include/hw/misc/auxbus.h | 3 +- include/hw/misc/bcm2835_mbox.h | 2 + include/hw/misc/bcm2835_property.h | 2 + include/hw/misc/bcm2835_rng.h | 2 + include/hw/misc/imx25_ccm.h | 2 + include/hw/misc/imx2_wdt.h | 2 + include/hw/misc/imx31_ccm.h | 2 + include/hw/misc/imx6_ccm.h | 2 + include/hw/misc/imx6_src.h | 2 + include/hw/misc/imx6ul_ccm.h | 2 + include/hw/misc/imx7_ccm.h | 2 + include/hw/misc/imx7_gpr.h | 2 + include/hw/misc/imx7_snvs.h | 2 + include/hw/misc/imx_ccm.h | 2 + include/hw/misc/iotkit-secctl.h | 2 + include/hw/misc/iotkit-sysctl.h | 2 + include/hw/misc/iotkit-sysinfo.h | 2 + include/hw/misc/macio/cuda.h | 4 + include/hw/misc/macio/gpio.h | 5 + include/hw/misc/macio/macio.h | 4 + include/hw/misc/macio/pmu.h | 5 + include/hw/misc/mips_cmgcr.h | 5 +- include/hw/misc/mips_cpc.h | 4 + include/hw/misc/mips_itu.h | 2 + include/hw/misc/mos6522.h | 2 + include/hw/misc/mps2-fpgaio.h | 2 + include/hw/misc/mps2-scc.h | 2 + include/hw/misc/msf2-sysreg.h | 2 + include/hw/misc/nrf51_rng.h | 3 +- include/hw/misc/pca9552.h | 3 + include/hw/misc/pvpanic.h | 3 + include/hw/misc/stm32f2xx_syscfg.h | 2 + include/hw/misc/tz-mpc.h | 2 + include/hw/misc/tz-msc.h | 2 + include/hw/misc/tz-ppc.h | 2 + include/hw/misc/unimp.h | 2 + include/hw/misc/vmcoreinfo.h | 4 +- include/hw/misc/zynq-xadc.h | 2 + include/hw/net/allwinner_emac.h | 4 +- include/hw/net/cadence_gem.h | 2 + include/hw/net/ftgmac100.h | 2 + include/hw/net/imx_fec.h | 2 + include/hw/net/lance.h | 3 + include/hw/net/ne2000-isa.h | 2 + include/hw/nvram/chrp_nvram.h | 2 + include/hw/nvram/fw_cfg.h | 2 + include/hw/nvram/nrf51_nvm.h | 4 +- include/hw/or-irq.h | 2 + include/hw/pci-bridge/simba.h | 2 + include/hw/pci-host/designware.h | 2 + include/hw/pci-host/gpex.h | 2 + include/hw/pci-host/pam.h | 2 + include/hw/pci-host/q35.h | 2 + include/hw/pci-host/sabre.h | 4 + include/hw/pci-host/spapr.h | 3 + include/hw/pci-host/uninorth.h | 4 +- include/hw/pci-host/xilinx-pcie.h | 2 + include/hw/pci/msi.h | 2 + include/hw/pci/msix.h | 2 + include/hw/pci/pci.h | 2 + include/hw/pci/pci_bridge.h | 3 +- include/hw/pci/pci_bus.h | 2 + include/hw/pci/pci_host.h | 2 + include/hw/pci/pcie.h | 2 + include/hw/pci/pcie_aer.h | 3 + include/hw/pci/pcie_host.h | 2 + include/hw/pci/pcie_port.h | 2 + include/hw/pci/shpc.h | 2 + include/hw/pcmcia.h | 2 + include/hw/platform-bus.h | 2 + include/hw/ppc/fdt.h | 2 + include/hw/ppc/mac_dbdma.h | 2 + include/hw/ppc/openpic.h | 2 + include/hw/ppc/pnv.h | 3 + include/hw/ppc/pnv_core.h | 4 + include/hw/ppc/pnv_lpc.h | 2 + include/hw/ppc/pnv_occ.h | 2 + include/hw/ppc/pnv_psi.h | 2 + include/hw/ppc/pnv_xive.h | 2 + include/hw/ppc/pnv_xscom.h | 2 + include/hw/ppc/ppc.h | 2 + include/hw/ppc/ppc4xx.h | 7 ++ include/hw/ppc/spapr.h | 3 + include/hw/ppc/spapr_cpu_core.h | 4 + include/hw/ppc/spapr_drc.h | 2 + include/hw/ppc/spapr_irq.h | 5 + include/hw/ppc/spapr_ovec.h | 2 + include/hw/ppc/spapr_vio.h | 11 +- include/hw/ppc/spapr_xive.h | 5 + include/hw/ppc/xics.h | 3 +- include/hw/ppc/xics_spapr.h | 3 + include/hw/ppc/xive.h | 3 +- include/hw/ppc/xive_regs.h | 3 + include/hw/qdev.h | 2 + include/hw/register.h | 2 + include/hw/riscv/boot.h | 4 + include/hw/riscv/riscv_hart.h | 6 ++ include/hw/riscv/riscv_htif.h | 3 + include/hw/riscv/sifive_clint.h | 4 + include/hw/riscv/sifive_e.h | 4 + include/hw/riscv/sifive_gpio.h | 3 + include/hw/riscv/sifive_plic.h | 4 +- include/hw/riscv/sifive_prci.h | 4 + include/hw/riscv/sifive_test.h | 4 + include/hw/riscv/sifive_u.h | 4 + include/hw/riscv/sifive_uart.h | 5 + include/hw/riscv/spike.h | 6 ++ include/hw/riscv/virt.h | 6 ++ include/hw/s390x/3270-ccw.h | 3 + include/hw/s390x/ap-device.h | 3 + include/hw/s390x/css-bridge.h | 5 +- include/hw/s390x/css.h | 4 + include/hw/s390x/event-facility.h | 3 +- include/hw/s390x/s390-ccw.h | 3 + include/hw/s390x/s390-virtio-ccw.h | 3 + include/hw/s390x/s390_flic.h | 2 + include/hw/s390x/sclp.h | 3 +- include/hw/s390x/storage-attributes.h | 3 + include/hw/s390x/storage-keys.h | 2 + include/hw/s390x/tod.h | 4 +- include/hw/s390x/vfio-ccw.h | 3 + include/hw/scsi/esp.h | 2 + include/hw/scsi/scsi.h | 2 + include/hw/sd/bcm2835_sdhost.h | 2 + include/hw/sd/sd.h | 2 + include/hw/sd/sdhci.h | 2 + include/hw/semihosting/console.h | 4 + include/hw/sh4/sh.h | 2 + include/hw/sh4/sh_intc.h | 3 + include/hw/sparc/grlib.h | 2 + include/hw/sparc/sparc32_dma.h | 2 + include/hw/sparc/sparc64.h | 4 + include/hw/sparc/sun4m_iommu.h | 2 + include/hw/sparc/sun4u_iommu.h | 2 + include/hw/ssi/aspeed_smc.h | 3 + include/hw/ssi/imx_spi.h | 2 + include/hw/ssi/mss-spi.h | 2 + include/hw/ssi/pl022.h | 2 + include/hw/ssi/ssi.h | 2 + include/hw/ssi/stm32f2xx_spi.h | 2 + include/hw/ssi/xilinx_spips.h | 3 + include/hw/sysbus.h | 2 + include/hw/timer/a9gtimer.h | 2 + include/hw/timer/allwinner-a10-pit.h | 3 + include/hw/timer/arm_mptimer.h | 3 + include/hw/timer/armv7m_systick.h | 2 + include/hw/timer/aspeed_rtc.h | 3 + include/hw/timer/aspeed_timer.h | 3 + include/hw/timer/cmsdk-apb-dualtimer.h | 2 + include/hw/timer/cmsdk-apb-timer.h | 2 + include/hw/timer/digic-timer.h | 3 +- include/hw/timer/i8254.h | 2 + include/hw/timer/i8254_internal.h | 3 + include/hw/timer/imx_epit.h | 2 + include/hw/timer/imx_gpt.h | 2 + include/hw/timer/m48t59.h | 2 + include/hw/timer/mc146818rtc.h | 2 + include/hw/timer/mc146818rtc_regs.h | 2 + include/hw/timer/mss-timer.h | 2 + include/hw/timer/nrf51_timer.h | 3 + include/hw/timer/pl031.h | 2 + include/hw/timer/stm32f2xx_timer.h | 2 + include/hw/timer/sun4v-rtc.h | 7 ++ include/hw/timer/xlnx-zynqmp-rtc.h | 3 + include/hw/usb.h | 2 + include/hw/usb/chipidea.h | 2 + include/hw/vfio/vfio-amd-xgbe.h | 2 + include/hw/vfio/vfio-calxeda-xgmac.h | 2 + include/hw/vfio/vfio-common.h | 2 + include/hw/vfio/vfio-platform.h | 2 + include/hw/virtio/vhost-backend.h | 3 +- include/hw/virtio/vhost-scsi-common.h | 3 +- include/hw/virtio/vhost-scsi.h | 3 +- include/hw/virtio/vhost-user-blk.h | 3 +- include/hw/virtio/vhost-user-scsi.h | 3 +- include/hw/virtio/vhost-user.h | 2 + include/hw/virtio/vhost-vsock.h | 2 + include/hw/virtio/vhost.h | 2 + include/hw/virtio/virtio-access.h | 4 + include/hw/virtio/virtio-balloon.h | 3 +- include/hw/virtio/virtio-blk.h | 3 +- include/hw/virtio/virtio-bus.h | 3 +- include/hw/virtio/virtio-crypto.h | 2 + include/hw/virtio/virtio-gpu-bswap.h | 1 + include/hw/virtio/virtio-gpu-pci.h | 2 + include/hw/virtio/virtio-gpu-pixman.h | 2 + include/hw/virtio/virtio-gpu.h | 2 + include/hw/virtio/virtio-input.h | 2 + include/hw/virtio/virtio-net.h | 3 +- include/hw/virtio/virtio-pmem.h | 2 + include/hw/virtio/virtio-rng.h | 3 + include/hw/virtio/virtio-scsi.h | 3 +- include/hw/virtio/virtio-serial.h | 3 +- include/hw/virtio/virtio.h | 3 +- include/hw/watchdog/cmsdk-apb-watchdog.h | 2 + include/hw/watchdog/wdt_aspeed.h | 3 + include/hw/watchdog/wdt_diag288.h | 2 + include/hw/xen/xen-backend.h | 3 + include/hw/xen/xen-block.h | 3 + include/hw/xen/xen-bus-helper.h | 3 + include/hw/xen/xen-bus.h | 3 + include/hw/xen/xen-legacy-backend.h | 3 + include/hw/xen/xen.h | 2 + include/hw/xen/xen_common.h | 3 + include/hw/xen/xen_pvdev.h | 3 + include/libdecnumber/decNumberLocal.h | 1 + include/migration/cpu.h | 5 + include/monitor/hmp-target.h | 4 + include/net/vhost_net.h | 2 + include/qemu/atomic128.h | 2 + include/qemu/cpuid.h | 2 + include/qemu/futex.h | 2 + include/qemu/iova-tree.h | 3 + include/qemu/ratelimit.h | 2 + include/qemu/thread-win32.h | 4 +- include/qemu/xattr.h | 3 + include/sysemu/balloon.h | 4 +- include/sysemu/cryptodev-vhost-user.h | 6 +- include/sysemu/cryptodev-vhost.h | 4 +- include/sysemu/dma.h | 2 + include/sysemu/dump.h | 3 + include/sysemu/hostmem.h | 2 + include/sysemu/hvf.h | 3 + include/sysemu/iothread.h | 1 + include/sysemu/kvm_int.h | 5 +- include/sysemu/memory_mapping.h | 5 + include/sysemu/numa.h | 2 + include/sysemu/os-posix.h | 2 + include/sysemu/os-win32.h | 2 + include/sysemu/vhost-user-backend.h | 3 + include/sysemu/xen-mapcache.h | 5 +- include/trace-tcg.h | 2 + include/ui/console.h | 2 + include/ui/egl-context.h | 3 + include/ui/egl-helpers.h | 6 ++ include/ui/gtk.h | 2 + include/ui/input.h | 1 + include/ui/pixel_ops.h | 5 + include/ui/qemu-pixman.h | 2 + include/ui/sdl2.h | 2 + include/ui/shader.h | 2 + include/ui/spice-display.h | 4 + target/hppa/cpu.h | 2 +- tests/Makefile.include | 33 +++++- tests/check-headers.mak | 116 ++++++++++++++++++++++ tests/header-test-template.c | 23 +++++ 425 files changed, 1292 insertions(+), 50 deletions(-) create mode 100644 tests/check-headers.mak create mode 100644 tests/header-test-template.c -- 2.21.0