bugmake - Bugs: bug #50376, Incompatibility in make versions -...


bug #50376: Incompatibility in make versions - directory/ dependency no longer match directory goal

Submitter:  Gur Stavi <gstavi>
Submitted:  Wed 22 Feb 2017 08:06:37 AM UTC
Severity:  3 - Normal Item Group:  Bug
Status:  None Privacy:  Public
Assigned to:  None Open/Closed:  Open
Component Version:  4.2.1 Operating System:  None
Fixed Release:  None Triage Status:  None
* Mandatory Fields

Add a New Comment Rich Markup

Sat 25 Feb 2017 02:43:25 AM UTC, comment #1: 

In 2010's make-3.82, which is where this behavior changed, and later releases, the rule appears like this in make -p:

my_dir/hello.txt: | my_dir/

In make-3.81, it didn't have the trailing slash.  $(dir) still produced a trailing slash there.  From printf debugging, I think the trailing slash was being removed by the call to multi_glob in parse_prereqs, as it was then called.  That was removed by this part:

diff --git a/file.c b/file.c
index a618beb..4e3bece 100644
--- a/file.c
+++ b/file.c
@@ -415,8 +415,7 @@ struct dep *
 parse_prereqs (char *p)
   struct dep *new = (struct dep *)
-    multi_glob (parse_file_seq (&p, '|', sizeof (struct dep), 1),
-                sizeof (struct dep), 0);
+    parse_file_seq (&p, sizeof (struct dep), '|', NULL, 0);

   if (*p)
@@ -426,8 +425,7 @@ parse_prereqs (char *p)

       ood = (struct dep *)
-        multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1),
-                    sizeof (struct dep), 0);
+        parse_file_seq (&p, sizeof (struct dep), '\0', NULL, 0);

       if (! new)
         new = ood;

... of this commit:

2009-09-16 17:07:01 +0000 -email is unavailable- (8f30b68871bde8687c7fcff8bac66e2b5765129e)

- Add xcalloc() and call it - Fix memory errors found by valgrind - Remove multi_glob() and empower parse_file_seq() to do its job:   the goal here is to remove the confusing reverse/re-reverse we do on   the file lists: needed for future fixes. - Add a prefix arg to parse_file_seq() - Make concat() variadic so it can take arbitrary #'s of strings

Martin Dorey <mdorey>
Wed 22 Feb 2017 08:06:37 AM UTC, original submission:  

Consider the makefile below.

OUT_DIR = my_dir
OUT_FILE = $(OUT_DIR)/hello.txt

$(OUT_FILE): | $(dir $(OUT_FILE))
echo Hello World > $@

mkdir $@

Running with make v3.81 results in:
mkdir my_dir
echo Hello World > my_dir/hello.txt

Running with Make v4.2.1 results in:
make: * No rule to make target 'my_dir/', needed by 'my_dir/hello.txt'.  Stop.

Is this intentional?

Since $(dir) function keeps slash at the end of the result it mostly forces directory goals to have the slash as well. It may be a good habit but could be a big compatibility issue for existing makefiles. I encountered it when make failed on a colleague's newer system.

Gur Stavi <gstavi>


(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:

No files currently attached


Depends on the following items: None found

Items that depend on this one: None found


Carbon-Copy List
  • -email is unavailable- added by mdorey (Posted a comment)
  • -email is unavailable- added by gstavi (Submitted the item)

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

    Only logged-in users can vote.


    No changes have been made to this item

    Back to the top

    Powered by Savane 3.13-b921.
    Corresponding source code