[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#54390: YACC rules don't check DESTDIR existence for VPATH builds
From: |
Sam James |
Subject: |
bug#54390: YACC rules don't check DESTDIR existence for VPATH builds |
Date: |
Fri, 13 Jan 2023 07:07:39 +0000 |
> On 13 Jan 2023, at 07:01, Mike Frysinger <vapier@gentoo.org> wrote:
>
> On 13 Jan 2023 06:29, Sam James wrote:
>>> On 13 Jan 2023, at 06:13, Mike Frysinger <vapier@gentoo.org> wrote:
>>> On 14 Mar 2022 17:21, Sam James wrote:
>>>> It appears that YACC rules don't check for whether the destination
>>>> directory exists before executing ylwrap.
>>>>
>>>> When trying to package libaacs
>>>> (https://code.videolan.org/videolan/libaacs) with an out-of-source build,
>>>> I hit an unexpected build failure:
>>>> ```
>>>> /var/tmp/portage/media-libs/libaacs-0.11.1/work/libaacs-0.11.1/src/file/keydbcfg-parser.y:
>>>> warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
>>>> /var/tmp/portage/media-libs/libaacs-0.11.1/work/libaacs-0.11.1/build-aux/ylwrap:
>>>> 206: cannot create ../src/file/keydbcfg-parser.c: Directory nonexistent
>>>> updating src/file/keydbcfg-parser.h
>>>> mv: cannot move 'tmp-keydbcfg-parser.h' to
>>>> '../src/file/keydbcfg-parser.h': No such file or directory
>>>> make: *** [Makefile:1150: src/file/keydbcfg-parser.c] Error 2
>>>> ```
>>>>
>>>> I can workaround this by running `mkdir -p ${BUILD_DIR}/src/file` to
>>>> ensure that the necessary directory exists within the build directory
>>>> beforehand, but
>>>> it feels like I shouldn't have to.
>>>>
>>>> Their Makefile.am can be found here:
>>>> https://code.videolan.org/videolan/libaacs/-/blob/master/Makefile.am.
>>>> Snippet:
>>>> ```
>>>> libaacs_la_SOURCES=\
>>>> src/libaacs/aacs.h \
>>>> [...]
>>>> src/file/dirs.h \
>>>> src/file/file.h \
>>>> src/file/file.c \
>>>> src/file/filesystem.h \
>>>> src/file/filesystem.c \
>>>> src/file/keydbcfg.c \
>>>> src/file/keydbcfg.h \
>>>> src/file/keydb.h \
>>>> src/file/keydbcfg-parser.y \
>>>> src/file/keydbcfg-lexer.l \
>>>> src/file/mmc_device.h \
>>>> [...]
>>>> ```
>>>>
>>>> While src/libaacs exists within the build dir, src/file/ doesn't exist at
>>>> all, hence the failure.
>>>>
>>>> automake yacc rules should mkdir -p the needed directories within the
>>>> build dir for VPATH builds before running ylwrap/yacc.
>>>
>>> i think there's more to it. if you're using a release tarball for this
>>> project
>>> created by `make dist`, then you shouldn't be running yacc in the first
>>> place.
>>>
>>> https://www.gnu.org/software/automake/manual/html_node/Yacc-and-Lex.html
>>
>> Curiosity got the better of me (see previous reply) so:
>> ```
>> $ cd /tmp
>> $ git clone https://code.videolan.org/videolan/libaacs/
>> $(cd libaacs && ./bootstrap.sh)
>> $mkdir libaacs-oos && cd libaacs
>
> guessing you meant `cd libaacs-oos`
>
>> $ /tmp/libaacs/configure YACC=bison LEX=flex
>> $ make
>> $ make
>> YACC src/file/keydbcfg-parser.c
>> keydbcfg-parser.tab.c is unchanged
>> keydbcfg-parser.tab.h is unchanged
>> make[1]: Entering directory '/tmp/libaacs-oos'
>> YACC src/file/keydbcfg-parser.c
>> keydbcfg-parser.tab.c is unchanged
>> keydbcfg-parser.tab.h is unchanged
>> make[1]: Leaving directory '/tmp/libaacs-oos'
>> make all-am
>> make[1]: Entering directory '/tmp/libaacs-oos'
>> YACC src/file/keydbcfg-parser.c
>> keydbcfg-parser.tab.c is unchanged
>> keydbcfg-parser.tab.h is unchanged
>> CC src/file/keydbcfg-parser.lo
>> cc1: fatal error: src/file/keydbcfg-parser.c: No such file or directory
>> compilation terminated.
>> make[1]: *** [Makefile:1009: src/file/keydbcfg-parser.lo] Error 1
>> make[1]: Leaving directory '/tmp/libaacs-oos'
>> make: *** [Makefile:638: all] Error 2
>> ```
>>
>> so it's still looking in the source rather than the build directory for the
>> generated file?
>
> i'm not sure what you're trying to show here. that running make twice in a
> row produces weird/inconsistent results ? if that's the case, that's not
> the behavior i'm seeing over here.
>
No, that was just an error in copying stuff into email. It happens with running
make once,
so it should be:
```
$ cd /tmp
$ git clone https://code.videolan.org/videolan/libaacs/
$ (cd libaacs && ./bootstrap)
$ mkdir libaacs-oos && cd libaacs-oos
$ /tmp/libaacs/configure YACC=bison LEX=flex
$ make
YACC src/file/keydbcfg-parser.c
updating keydbcfg-parser.tab.c
updating keydbcfg-parser.tab.h
make[1]: Entering directory '/tmp/libaacs-oos'
YACC src/file/keydbcfg-parser.c
keydbcfg-parser.tab.c is unchanged
keydbcfg-parser.tab.h is unchanged
make[1]: Leaving directory '/tmp/libaacs-oos'
LEX src/file/keydbcfg-lexer.c
make all-am
make[1]: Entering directory '/tmp/libaacs-oos'
CC src/examples/aacs_info-aacs_info.o
CC src/libaacs/aacs.lo
CC src/libaacs/cci.lo
CC src/libaacs/content_cert.lo
CC src/libaacs/crypto.lo
CC src/libaacs/mkb.lo
CC src/libaacs/mmc.lo
CC src/libaacs/unit_key.lo
CC src/file/file.lo
CC src/file/filesystem.lo
CC src/file/keydbcfg.lo
YACC src/file/keydbcfg-parser.c
keydbcfg-parser.tab.c is unchanged
keydbcfg-parser.tab.h is unchanged
CC src/file/keydbcfg-parser.lo
cc1: fatal error: src/file/keydbcfg-parser.c: No such file or directory
compilation terminated.
make[1]: *** [Makefile:1009: src/file/keydbcfg-parser.lo] Error 1
make[1]: Leaving directory '/tmp/libaacs-oos'
make: *** [Makefile:638: all] Error 2
```
You can't reproduce the build failure?
> i'll note that the default configure+make works because dependency tracking
> is enabled which prepopulates the directory tree. it's failing for you in
> Gentoo because econf automatically adds --disable-dependency-tracking which
> turns all that logic off, and the directory tree doesn't exist.
I'm not sure how that corresponds with when I run configure manually as above?
What am I missing, or am I misunderstanding?
Thanks.
signature.asc
Description: Message signed with OpenPGP