git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [msysGit] Missing inversion in Makefile (ee9be06)

From
Philip Oakley <philipoakley@iee.org>
Date
Feb 10, 2015, 22:36 UTC
Message-ID
<C928DF3E5D7D423588EF2C2BA09D8A73@PhilipOakley>
In-Reply-To
<4C7BB65E9EE445F08645582230EA9782@PhilipOakley>
Another go at this XY-Problem...
From: "Philip Oakley" <philipoakley@iee.org>
Sent: Saturday, December 27, 2014 8:17 PM
Show 38 quoted lines
> From: "Johannes Sixt" <j6t@kdbg.org>
>> Am 27.12.2014 um 19:49 schrieb Philip Oakley:
>>> Hi,
>>>
>>> In ee9be06 (perl: detect new files in MakeMaker builds, 2012-07-27)
>>> there is a step to detect if there has been an update to the PM.* 
>>> files,
>>> however it appears that the logic is inverted in the comparison.
>>>
>>> I need some extra eye's on this to be sure I have it right (I'm 
>>> trying
>>> to debug an old Windows breakage...).
>>>
>>> The resultant output of a make dry run included (on my m/c)..:
>>>
>>>  find perl -type f -name '*.pm' | sort >perl/PM.stamp+ && \
>>>   { cmp perl/PM.stamp+ perl/PM.stamp >/dev/null 2>/dev/null || mv
>>> perl/PM.stamp+ perl/PM.stamp; } && \
>>>   rm -f perl/PM.stamp+
>>>  make -C perl  PERL_PATH='/usr/bin/perl' prefix='/c/Documents and
>>> Settings/Philip' perl.mak
>>>
>>> Shouldn't it be `{ ! cmp ` so that when the files are not identical, 
>>> the
>>> move is performed?
>>>
>>> https://github.com/git/git/blob/ee9be06770223238c6a22430eb874754dd22dfb0/Makefile#L2097
>>
>> The existing code looks correct to me. cmp succeeds when the files 
>> are
>> identical and fails when they are different: When it succeeds (files 
>> are
>> equal), the mv is not executed. When it fails, either because a file
>> does not exist or they are different, the mv is executed.
>>
> Thanks. The inverse logic had me confused.
> It's like 7400's again, for those that remember;-)
>
Here's where the real problem starts...
Show 9 quoted lines
> I was getting errors from
> `cd $git_dir && make -n MSVC=1 V=1 2>MakeDryErrs.txt 1>MakeDry.txt` 
> (borrowed from 'msvc-build') which reported the PM.stamp as a problem, 
> with the quoted code being the last part of the MakeDry.txt (and no 
> PM.stamp seen).
>
> Now that I've been poking and investigating the error's stopped! It's 
> all getting rather frustrating. Time to go again on a clean and 
> rebuild..

I'm trying to get the msysgit msvc-build script[1], which essentially implements the Git 'compat/vcbuild/README', to work again in terms of creating a Visual Studio [2008] project file (.sln).

If I run the code (find perl -type f -name '*.pm' ...) manually then the PM.stamp file is created allowing future dry-runs to succeed - hence some of my confusion.

The script uses git's 'contrib/buildsystems/engine.pl' to parse the 
output of:
 `make -n MSVC=1 V=1 2>\dev\null` [2]

This appears to no longer work because the -n (dry-run) option fails to run the required 'perl/PM.stamp' during the dry-run. At least that's now my understanding.

The https://www.gnu.org/software/make/manual/html_node/Instead-of-Execution.html page indicates that adding a + to the right rule would be needed to also run the PM.stamp process during dry-run.

At the moment I'm getting (on my old WinXP machine, using Msysgit 1.9.5 as a basis)

$ make -n MSVC=1 V=1 1>makedry.txt make[1]: *** No rule to make target `PM.stamp', needed by `perl.mak'. Stop. make: *** [perl/perl.mak] Error 2

i.e. PM.stamp was not created so can't be the target of the dry-run make rule.

The makedry.txt file generated ends with the
find perl -type f -name '*.pm' | sort >perl/PM.stamp+ && \
 { cmp perl/PM.stamp+ perl/PM.stamp >/dev/null 2>/dev/null || mv 
perl/PM.stamp+ perl/PM.stamp; } && \
 rm -f perl/PM.stamp+
make -C perl  PERL_PATH='/usr/bin/perl' prefix='/c/Documents and 
Settings/Philip' perl.mak
make[1]: Entering directory `/c/msysgit195/git/perl'
make -C .. GIT-CFLAGS
make[2]: Entering directory `/c/msysgit195/git'
FLAGS='compat/vcbuild/scripts/clink.pl:  -Imsvcgit/32bits/include [...]
     if test x"$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
  echo >&2 "    * new build flags"; \
  echo "$FLAGS" >GIT-CFLAGS; \
            fi
make[2]: Leaving directory `/c/msysgit195/git'
make[1]: Leaving directory `/c/msysgit195/git/perl'

i.e. the commands for the PM.stamp process are listed, rather than executed as may have been hoped.

I've tried hacking the plus(+) prefix onto the "perl/PM.stamp: FORCE" rule, but it gave the same error.

What would be the right way of making a dry-run produce a suitable complete output? Make files are not something I normally delve into.

-- Philip

[1] https://github.com/msysgit/msysgit/blob/master/bin/msvc-build [2] https://github.com/git/git/blob/master/contrib/buildsystems/engine.pl#L75

Previous: Philip Oakley
Message 4 of 4 in “Missing inversion in Makefile (ee9be06)”
  1. Philip OakleyDec 27, 2014
  2. Johannes SixtDec 27, 2014
  3. Philip OakleyDec 27, 2014
  4. Philip OakleyFeb 10, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.