From: Keith M. <kei...@to...> - 2007-09-27 15:46:06
|
Wu Yongwei wrote, quoting me: >> Wu Yongwei wrote: >>> I noticed a change between Make 3.79 and 3.81. In Make 3.79 I was >>> able to do the following: >>> >>> --------------------------------------------------------------------- >>> all: debug >>> >>> debug: DEBUG DEBUG/test.exe >>> >>> DEBUG: >>> mkdir DEBUG >>> >>> DEBUG/test.exe: >>> ... >>> >>> .PHONY: all debug >>> --------------------------------------------------------------------- >>> >>> It worked well in Make 3.79. However, with 3.81 it will complain: >>> >>> make: Circular debug <- debug dependency dropped. > > Yes, I understand your points below. However, I think it may be > useful to differentiate the case-sensitiveness of files/directories > and targets (esp. phony targets). Remember that, in the general case, a make target represents an entity which will *physically* exist within the file system; in other words, a make target *is* a file name, or a directory name. Thus, when there is no case sensitivity within the file system, it makes no sense to expect any such distinction within the make rules. > The message above looks wrong to me. > > I mean, it is perfectly OK to believe the directory/file "DeBUG" > matches the build target "DEBUG", but it may be overkill to think the > target "debug" is equivalent to the target "DEBUG". Do remember that a make prerequisite is just another target, which must be realised first. The message refers to debug: DEBUG ... i.e. the target `debug' has a prerequisite, which is another target called `DEBUG'. On a case-sensitive file system, these are indisputably different file system entities; hence distinct targets. On a case-insensitive file system, they are indistinguishable, hence the `debug' target depends on itself -- a (direct and immediate) circular dependency -- so I can't see anything wrong with the message. > Just wild thoughts. I did not look at the code of make, so it may be > not be easily doable. If it were to be done, it would have to be by the upstream GNU maintainers. For mingw32-make, we are now using their code OOTB, without modification. Chuck may have applied some minor patches for the MSYS build -- he can say with more authority than I -- but what you are suggesting would seem to go right to the heart of the beast, for it would require a fundamental change in the conceptual meaning of a make target. >> If you are writing Makefiles which you wish to be portable to systems >> with fundamentally case-insensitive file systems, such as Woe32, then it >> is dangerous to rely on case-sensitive behaviour in the Makefile rules. >> If you want to use a directory named with any case-insensitive variation >> of `debug', then don't use `debug' as a phony target; instead, you could >> use `all-debug', or some such alternative name. > > This is the current way I am doing. I changed the directory name > instead. I wish it were not necessary. I fear there is no logical way around it. Declaring the target `PHONY' doesn't magically imbue it with any special property which distinguishes it in any way from other targets, in terms of their relationship to the file system; all it does is tell make that the target must always be remade, even if the designated file system entity already exists, and appears to be up to date. If you want a very hackish workaround, you could rename make.exe as (say) make81.exe, restore the old make-3.79 as make79.exe, and write a driver script, called make, using some custom command line option, or an environment variable trigger, to pass its remaining arguments to either make79, when you want the case-sensitive behaviour, or to make81, when you want case-insensivity, or need new features. (If you want to have new features, *and* case-sensitivity together, then you would need to build a custom MSYS image of make-3.81). Regards, Keith. |