On Thu, Apr 2, 2015 at 10:38 AM, Paul Smith <p...@mad-scientist.net> wrote:
> On Wed, 2015-04-01 at 17:37 +0530, Basil Mathew wrote: > > This is a copy of the e-mail that I have send to Christian. > > You don't need to forward another copy: that's the beauty of a mailing > list: everyone gets all the mail :). > > That's also why when sending to mailing lists, especially archived lists > like this, we prefer people to use "inline replies" rather than > "top-posting replies"; this is an example of an inline reply where I > quote only the parts of your message I want to reply to and I reply > directly after the parts I want to address, rather than including the > entire message and adding comments to the top. > Thank you for the information, Hope, this time, I am doing it right. > > We use a kind of variant of the statement "-include > > $(sources_c:.c=.d)"; we use something like "include $(GEN_FILE_D)" > > where the variable "GEN_FILE_D" contains the list of available > > dependency(*.d) files in our build system. > > OK, that's critical information, thanks for providing it. > > > I suppose this means that it is not the "include" statement that is > > invoking the dependency file, but the rule itself to create the object > > file. Also attached below is the output that I get after executing the > > Makefile with --debug option which shows > > > > a) that the dependency is generated by the "%.o: %.c %.d" line > > That's not exactly true. What appears to be happening is that your > target wants to build an object file foo.o and matches this pattern. It > then needs to try to build the prerequisites, one of which is the foo.d > file before it can build the object file, so it uses the other pattern > rule "%.d : %.c" to build the foo.d file. > My mistake. I meant the same, but my e-mail was not clear enough. Thank you for the clarification. > > > b) although I am not giving you the entire debug log, please take my > > word that the log shows that the dependencies are generated for all > > the source files before the compilation for any of the source file is > > invoked. > > It looks to me like you are building with parallel make (-j), from debug > output like this: > Yes, you are right. I have mentioned this in my first post. > > > Finished prerequisites of target file `errm_dcmng1.o'. > > The prerequisites of `errm_dcmng1.o' are being made. > > ... > > Considering target file `errm_fctdg_test.o'. > > which shows that make is skipping building errm_dcmng1.o because one of > its prerequisites (in this case the .d file) is being built. After > this, make will go on and find something else to build, which will > probably be another .d file. This can make it seem like the .d files > are being built first. > I had the same notion, but what I could not understand was that there are some projects in our organization that contain some 3000 C source files, and the dependency generation phase itself takes more than 10 minutes with cpp.exe, but every time, I see that the compilation phase is invoked only after all the dependencies are computed, hence the post. From your feedback, I am satisfied with the notion. > > If you run your build linearly, without the -j flag, you should see it > behave as you expect. > > You are right. I found this when I was executing some test Make scripts to validate my above post without using the -j flag. I am assuming that if we don't explicitly specify the -j flag, make will execute a linear build(similar to -j = 1) > I'm not sure what difference it makes, though, whether the .d files are > created first as long as the right files are built in the right order > overall. > > I did not see any issue with the build, had posted this to clarify the behavior. Thank you all for the wonderful support _______________________________________________ Help-make mailing list Help-make@gnu.org https://lists.gnu.org/mailman/listinfo/help-make