1# $NetBSD: directive-include.mk,v 1.11 2022/01/15 12:35:18 rillig Exp $ 2# 3# Tests for the .include directive, which includes another file. 4 5# TODO: Implementation 6 7.MAKEFLAGS: -dc 8 9# All included files are recorded in the variable .MAKE.MAKEFILES. 10# In this test, only the basenames of the files are compared since 11# the directories can differ. 12.include "/dev/null" 13.if ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null" 14. error 15.endif 16 17# Each file is recorded only once in the variable .MAKE.MAKEFILES. 18# Between 2015-11-26 and 2020-10-31, the very last file could be repeated, 19# due to an off-by-one bug in ParseTrackInput. 20.include "/dev/null" 21.if ${.MAKE.MAKEFILES:T} != "${.PARSEFILE} null" 22. error 23.endif 24 25.include "nonexistent.mk" 26.include "/dev/null" # size 0 27# including a directory technically succeeds, but shouldn't. 28#.include "." # directory 29 30# As of 2020-11-21, anything after the delimiter '"' is ignored. 31.include "/dev/null" and ignore anything in the rest of the line. 32 33# The filename to be included can contain expressions. 34DEV= null 35.include "/dev/${DEV}" 36 37# Expressions in double quotes or angle quotes are first parsed naively, to 38# find the closing '"'. In a second step, the expressions are expanded. This 39# means that the expressions cannot include the characters '"' or '>'. This 40# restriction is not practically relevant since the expressions inside 41# '.include' directives are typically kept as simple as possible. 42# 43# If the whole line were expanded before parsing, the filename to be included 44# would be empty, and the closing '"' would be in the trailing part of the 45# line, which is ignored as of 2021-12-03. 46DQUOT= " 47.include "${DQUOT}" 48 49# When the expression in a filename cannot be evaluated, the failing 50# expression is skipped and the file is included nevertheless. 51# FIXME: Add proper error handling, no file must be included here. 52.include "nonexistent${:U123:Z}.mk" 53 54# The traditional include directive is seldom used. 55include /dev/null # comment 56# expect+1: Cannot open /nonexistent 57include /nonexistent # comment 58sinclude /nonexistent # comment 59include ${:U/dev/null} # comment 60include /dev/null /dev/null 61# expect+1: Invalid line type 62include 63 64# XXX: trailing whitespace in diagnostic, missing quotes around filename 65### TODO: expect+1: Could not find 66# The following include directive behaves differently, depending on whether 67# the current file has a slash or is a relative filename. In the first case, 68# make opens the directory of the current file and tries to read from it, 69# resulting in the error message """ line 1: Zero byte read from file". 70# In the second case, the error message is "Could not find ", without quotes 71# or any other indicator for the empty filename at the end of the line. 72#include ${:U} 73 74 75# Since parse.c 1.612 from 2022-01-01 and before parse.c 1.620 from 76# 2022-01-07, including an empty regular file called bmake_malloc(0), which 77# may return a null pointer. On OpenBSD, this led to a segmentation fault in 78# Buf_InitSize, which assumes that bmake_malloc never returns NULL, just like 79# all other places in the code. 80_!= > directive-include-empty 81.include "${.CURDIR}/directive-include-empty" 82_!= rm directive-include-empty 83 84 85all: 86