Hi David,

On 8/22/22 04:45, David A. Wheeler wrote:


On Aug 20, 2022, at 11:35 AM, Alejandro Colomar <alx.manpa...@gmail.com> wrote:
I'd say there is:  make(1) treats file names as text strings, not really file 
names, for most of its operations.  As an example, foo/ and foo/. are different 
targets.  I don't see why ./bar and bar should be the same.  Consistency is 
essential; otherwise, what to expect?  Why does make(1) need to special-case a 
leading ./ ?

Because treating "./foo" and "foo" as different files is likely to lead to 
endless footguns.

Consistency is nice, but making something easy to use *correctly* is more important. I have no 
problem with special-casing "./XXX" as a synonym for "XXX"; anything else would 
be *unexpected* (if for no other reason than backwards compatibility).

As far as "foo/" vs. "foo/.", it's *much* less common to have directories as 
prerequisites or targets, so not handling them with special conveniences seems quite reasonable.

Is it so *much* less common? I never really knew that make(1) treats ./foo and foo as the same thing until this bug report. make(1) is (almost) very consistent in that it handles text, and not really file names. But _all_ non-phony targets should declare a dependency like '|$$(@D)/', unless you can guarantee that it already exists by the time you'll try to create the file (e.g., when the file depends on another file in the same dir).

My Makefiles are plagued with that dependency, but a correctly-written Makefile shouldn't even notice that ./ is trimmed.

Do other make(1) implementations trim this leading ./?

Cheers,

Alex


--- David A. Wheeler



--
Alejandro Colomar
<http://www.alejandro-colomar.es/>

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to