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 > The intermediate files generated by yacc (or lex) will be included in any > distribution that is made. That way the user doesn’t need to have yacc or lex. cloning that repo and running `make dist` shows the file is generated, and it's listed in am__DIST_COMMON, but it still doesn't make it into the tarball. oh, it looks like this is self-inflicted: https://code.videolan.org/videolan/libaacs/-/blob/0.11.1/Makefile.am#L88 https://code.videolan.org/videolan/libaacs/-/commit/f60f46da1dc5e87f70b6edc965a8909d3f21c247 that makes no sense. file a bug with them. -mike