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