Sorry for the late reply, but KS and LPC got in the way. Also added kbuild to the Cc. On Tue, 2010-10-26 at 09:37 -0200, Mauro Carvalho Chehab wrote: > Hi Steven, > > Em 26-10-2010 02:15, Steven Rostedt escreveu: > > I'm currently finishing up an automated test program (that I will be > > publishing shortly). This program does various randconfig builds, boots > > and tests (as well as bisecting and patch set testing). But enough about > > it. > > > > I hit this little build bug that is more annoying than anything else. If > > I have the following configuration: > > > > > > CONFIG_DVB_USB_DIBUSB_MB=y > > CONFIG_DVB_USB_DIBUSB_MC=m > > CONFIG_DVB_USB_NOVA_T_USB2=m > > > > It fails to build with this error: > > > > ERROR: "dibusb_dib3000mc_frontend_attach" [drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.ko] undefined! > > ERROR: "dibusb_dib3000mc_tuner_attach" [drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.ko] undefined! > > ERROR: "dibusb_dib3000mc_frontend_attach" [drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.ko] undefined! > > ERROR: "dibusb_dib3000mc_tuner_attach" [drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.ko] undefined! > > > > Those undefined functions are defined in > > drivers/media/dvb/dvb-usb/dibusb-common.c, but are surrounded by: > > > > #if defined(CONFIG_DVB_DIB3000MC) || \ > > (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE)) > > > > Which Mauro updated in Dec 2007 with this commit: > > 4a56087f3b7660c9824e9ec69b96ccf8d9b25d1c > > due to just having CONFIG_DVB_DIB3000MC not enough. > > > > Well, this is not enough either. Why? > > > > On build the object dibusb-common.o is built first because of the > > DVB_USB_DIBUSB_MB being builtin kernel core. Thus, it gets built with > > the preprocessor condition false. > > > > Then when the compile gets to the modules, the object dibusb-common.o > > has already been built, and gets linked in as is. > > > > We end up with the functions not defined and we get the above error. > > > > My question: Why does that preprocessor condition exist? Can't we just > > build those functions in regardless? > > Not sure if I understood your question. Short answer is: No. What about just changing it to: #if defined(CONFIG_DVB_DIB3000MC) || defined(CONFIG_DVB_DIB3000MC_MODULE) Looking at the kbuild system scripts/Makefile.lib we have: # When an object is listed to be built compiled-in and modular, # only build the compiled-in version obj-m := $(filter-out $(obj-y),$(obj-m)) So if this is defined as both a module and builtin, the module version will never be built. Then we need that code in that #if block regardless. No need for testing the define(MODULE). > > > > A detailed explanation follows: > > <detailed> > > On DVB drivers, there are a few separate > components: > - Tuner - receives the signal from antenna, converting them into an > intermediate frequency, tune to a station; > - Demod - decodes the intermediate frame into a MPEG-TS; > - Bridge - talks with the PCI/USB/.. bus and send/receive commands to Demod/Frontend. > > The tuner + frontend + satellite controller are called frontend. > > On a typical design, tuners are a separate chip, interconnected via an I2C bus, and > the demod may be separate or integrated with the bridge (or with the tuner). > > Since the design is modular, the same frontend may be used by different bridges, and a > given bridge may work with more than one frontend, depending on the specific device you may have. > > So, we basically have one Kconfig option for each component, to allow building kernels with > the minimum footprint. > > For example, picking a random DVB bridge: > > config DVB_DM1105 > tristate "SDMC DM1105 based PCI cards" > depends on DVB_CORE && PCI && I2C > depends on INPUT > select DVB_PLL if !DVB_FE_CUSTOMISE > select DVB_STV0299 if !DVB_FE_CUSTOMISE > select DVB_STV0288 if !DVB_FE_CUSTOMISE > select DVB_STB6000 if !DVB_FE_CUSTOMISE > select DVB_CX24116 if !DVB_FE_CUSTOMISE > select DVB_SI21XX if !DVB_FE_CUSTOMISE > select DVB_DS3000 if !DVB_FE_CUSTOMISE > > The components at the select are the frontend. > > In this specific case, there's just one demod supported (stv0299), > but it allows using 6 different types of tuners. > > If you want to build a kernel with a minimal footprint, and if you have just one device type, > you'll need only one tuner driver. > > </detailed> > > In the specific case you're mentioning, we have the following bridge drivers: > > config DVB_USB_NOVA_T_USB2 > tristate "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support" > depends on DVB_USB > select DVB_DIB3000MC > select DVB_PLL if !DVB_FE_CUSTOMISE > select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE > > config DVB_USB_DIBUSB_MB > tristate "DiBcom USB DVB-T devices (based on the DiB3000M-B) (see help for device list)" > depends on DVB_USB > select DVB_PLL if !DVB_FE_CUSTOMISE > select DVB_DIB3000MB > select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE > > config DVB_USB_DIBUSB_MC > tristate "DiBcom USB DVB-T devices (based on the DiB3000M-C/P) (see help for device list)" > depends on DVB_USB > select DVB_DIB3000MC > select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE > > > And the following frontends: > > config DVB_DIB3000MC > tristate "DiBcom 3000P/M-C" > depends on DVB_CORE && I2C > default m if DVB_FE_CUSTOMISE > help > A DVB-T tuner module. Designed for mobile usage. Say Y when you want > to support this frontend. > > config DVB_DIB3000MB > tristate "DiBcom 3000M-B" > depends on DVB_CORE && I2C > default m if DVB_FE_CUSTOMISE > help > A DVB-T tuner module. Designed for mobile usage. Say Y when you want > to support this frontend. > > The makefile for it is: > > obj-$(CONFIG_DVB_DIB3000MB) += dib3000mb.o > obj-$(CONFIG_DVB_DIB3000MC) += dib3000mc.o dibx000_common.o > obj-$(CONFIG_DVB_DIB7000M) += dib7000m.o dibx000_common.o > obj-$(CONFIG_DVB_DIB7000P) += dib7000p.o dibx000_common.o > obj-$(CONFIG_DVB_DIB8000) += dib8000.o dibx000_common.o > > For sure, the Makefile is not doing the right thing, for a random config on those drivers, > as some of the frontends may be compiled builtin, while others may be compiled as module. > > I can see two possible fixes: > > 1) create a Kconfig option for dibx000_common, and let the other frontends > select/depend on it; > 2) change the build system to not allow having some frontends builtin and others as modules. > > Probably, (1) is easier than (2). Yet, (2) may also fix other hidden cases like that. Or we just don't test for define(MODULE). If either CONFIG_DVB_DIB3000MC or CONFIG_DVB_DIB3000MC_MODULE are defined, the code must be there, because, if this code is built as both a module and builtin, only the builtin will be created. -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html