#                                                                    -*-perl-*-

$description = 'Test the $(shell ...) function.';

$details = '';

# Test standard shell
run_make_test('.PHONY: all
OUT := $(shell echo hi)
all: ; @echo $(OUT)
              ','','hi');

# Test shells inside rules.
run_make_test('.PHONY: all
all: ; @echo $(shell echo hi)
              ','','hi');

# Verify .SHELLSTATUS
run_make_test('.PHONY: all
PRE := $(.SHELLSTATUS)
$(shell exit 0)
OK := $(.SHELLSTATUS)
$(shell exit 1)
BAD := $(.SHELLSTATUS)
all: ; @echo PRE=$(PRE) OK=$(OK) BAD=$(BAD)
              ','','PRE= OK=0 BAD=1');

# Test unescaped comment characters in shells.  Savannah bug #20513
run_make_test(q!
FOO := $(shell echo '#')
foo: ; echo '$(FOO)'
!,
              '', "echo '#'\n#\n");

# Test that exported variables are passed to $(shell ...)
$ENV{FOO} = 'baz';
run_make_test(q!
OUT = $(shell echo $$FOO)
foo: ; @echo '$(OUT)'
!,
              '', 'baz');

$ENV{FOO} = 'baz';
run_make_test(q!
FOO = bar
OUT = $(shell echo $$FOO)
foo: ; @echo '$(OUT)'
!,
              '', 'bar');

run_make_test(q!
export FOO = bar
OUT = $(shell echo $$FOO)
foo: ; @echo '$(OUT)'
!,
              '', 'bar');

# Test shells inside exported environment variables, simply expanded.
run_make_test('
export HI := $(shell echo hi)
.PHONY: all
all: ; @echo $$HI
',
              '','hi');

# Test shells inside exported environment variables.  See SV 10593
run_make_test('
export HI = $(shell echo hi)
.PHONY: all
all: ; @echo $$HI
',
              '',"hi");

$ENV{HI} = 'foo';
run_make_test('
HI = $(shell echo hi)
.PHONY: all
all: ; @echo $$HI
',
              '',"hi");

$ENV{HI} = 'foo';
run_make_test('
HI = $(shell echo hi)
bad := $(HI)
.PHONY: all
all: ; @echo $$HI $(bad)
',
              '',"hi hi");

# SV 63016: Exported variable that contains a variable containing $(shell...)

run_make_test('
HI = $(shell echo hi)
export bad = $(HI)
.PHONY: all
all:; : $(HI)
',
              '',": hi");

if ($port_type ne 'W32') {
    # Test shell errors in recipes including offset
    # This needs to be ported to Windows, or else Windows error messages
    # need to converted to look like more normal make errors.
    run_make_test('
.RECIPEPREFIX = >
all:
>@echo hi
>$(shell ./basdfdfsed there)
>@echo $(.SHELLSTATUS)
',
                  '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\nhi\n127\n");

    run_make_test('
$(shell ./basdfdfsed where)
all: ; @echo $(.SHELLSTATUS)
',
                  '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\n127\n");

    # Test SHELLSTATUS for kill.
    # This test could be ported to Windows, using taskkill ... ?

    # Figure out the exit code for SIGINT
    my $pid = fork();
    if (! $pid) {
        exec('kill -2 $$') or die "exec: Cannot execute sleep\n";
    }
    waitpid($pid, 0);
    # .SHELLSTATUS for a signal gives 128 + the signal number
    my $ret = $?;
    if ($ret > 255) {
       # Solaris 10 perl 5.8.4 puts signal number + 128 into the high 8 bits.
       $ret >>= 8;
    }
    $ret |= 128;

    run_make_test('.PHONY: all
$(shell kill -2 $$$$)
STAT := $(.SHELLSTATUS)
all: ; @echo STAT=$(STAT)
              ','',"STAT=$ret\n");

    # Test that not-found errors can be redirected
    if ($ERR_command_not_found) {
        $_ = $ERR_command_not_found;
        s/#CMDNAME#/bad-command/g;
        run_make_test(q!
out := $(shell bad-command 2>&1)
all: ; @echo '$(.SHELLSTATUS): $(out)'
!,
                      '', "127: $_\n");
    }

    # If we're using pipes for jobserver, then we will close them and not
    # allow them to be available to sub-makes invoked via $(shell ...)
    if (exists $FEATURES{'jobserver'}) {
        run_make_test(q!
ifeq ($(ELT),)
default:; @$(MAKE) -f #MAKEFILE# ELT=1
else ifeq ($(ELT),1)
OUTPUT := $(shell $(MAKE) -f #MAKEFILE# ELT=2)
$(info $(OUTPUT))
default:;: $(ELT)
else
default:;: $(ELT)
endif
!,
                      '--no-print-directory -j2 --jobserver-style=pipe', "#MAKE#[2]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.\n: 2\n: 1");
    }
}

# If we're not using pipes for jobserver, then they are available in sub-makes
# invoked by $(shell ...)
if ($port_type eq 'W32' || exists $FEATURES{'jobserver-fifo'}) {
    run_make_test(q!
ifeq ($(ELT),)
default:; @$(MAKE) -f #MAKEFILE# ELT=1
else ifeq ($(ELT),1)
OUTPUT := $(shell $(MAKE) -f #MAKEFILE# ELT=2)
$(info $(OUTPUT))
default:;: $(ELT)
else
default:;: $(ELT)
endif
!,
                  '--no-print-directory -j2', ": 2\n: 1");
}

1;
