
@bpv(CC)@      = @moar::cc@
@bpv(LD)@      = @moar::ld@
@bpv(CCINC)@   = @moar::ccinc@
@bpv(CFLAGS)@  = @moar::cflags@
@bpv(LDFLAGS)@ = @ldflags@
@bpv(LDLIBS)@  = @moar::ldlibs@
@bpv(MINGW_UNICODE)@ = @mingw_unicode@

MOAR_PREFIX = @nfp(@moar::prefix@)@
MOAR        = @nfpq(@moar::bindir@/moar@moar::exe@)@
@bpv(NQP)@       = @nfpq(@m_nqp@)@
@bpv(NQP_RR)@    = @bpm(NQP)@
@bpv(NQP_BIN)@       = @nfp(@m_nqp@)@
@bpv(RUN_RAKUDO_SCRIPT)@ = rakudo-m-early-build
@bpv(RUN_RAKUDO)@ = @shquot(@perl@)@ @bpm(RUN_RAKUDO_SCRIPT)@

@bpv(RUNNER_SUFFIX)@ = @moar::exe@

@bpv(INCPATH)@ = @nfp($(MOAR_PREFIX)/include)@
@bpv(MOAR_INC_PATHS)@ = \
    @insert_list(moar_includes)@

@bpv(RAKU)@ = raku@moar::exe@
@bpv(RAKU_DEBUG)@ = raku-debug@moar::exe@
@if(platform==windows @bpv(RAKU)@ = raku@moar::exe@
@bpv(INST_RAKU)@ = inst-raku@moar::exe@
@bpv(RAKU_DEBUG)@ = raku-debug@moar::exe@
@bpv(INST_RAKU_DEBUG)@ = inst-raku-debug@moar::exe@
@bpv(RAKUW)@ = rakuw@moar::exe@
@bpv(INST_RAKUW)@ = inst-rakuw@moar::exe@)@
@for_langalias(
@bpv(@uclangalias@)@ = @langalias@@moar::exe@
@bpv(@uclangalias@_DEBUG)@ = @langalias@-debug@moar::exe@
@bpv(@uclangalias@_M)@ = @langalias@-m@moar::exe@
@bpv(@uclangalias@_DEBUG_M)@ = @langalias@-debug-m@moar::exe@
@bpv(INST_@uclangalias@)@ = inst-@langalias@@moar::exe@
@bpv(INST_@uclangalias@_DEBUG)@ = inst-@langalias@-debug@moar::exe@
@bpv(INST_@uclangalias@_M)@ = inst-@langalias@-m@moar::exe@
@bpv(INST_@uclangalias@_DEBUG_M)@ = inst-@langalias@-debug-m@moar::exe@
@if(platform==windows @bpv(@uclangalias@W)@ = @langalias@w@moar::exe@
@bpv(@uclangalias@W_M)@ = @langalias@w-m@moar::exe@
@bpv(INST_@uclangalias@W)@ = inst-@langalias@w@moar::exe@
@bpv(INST_@uclangalias@W_M)@ = inst-@langalias@w-m@moar::exe@)@)@

@bpv(RAKUDO_OPS_DIR)@  = dynext
@bpv(RAKUDO_OPS_DLL)@  = @bpm(RAKUDO_OPS_DIR)@@nfp(/@perl6_ops_dll@)@
@bpv(RAKUDO_OPS_OBJ)@  = @nfp(@bpm(RAKUDO_OPS_DIR)@/perl6_ops@moar::obj@)@
@bpv(RAKUDO_OPS_DLL_SRC)@  = @nfp(src/vm/moar/ops/perl6_ops.c)@

@for_langalias(@for_toolchain(@bpv(@uclangalias@_@uctoolchain@_RUNNER)@ = @langalias@-@toolchain@-m@runner_suffix@
)@)@

@bpv(ALL_TARGETS)@ = \
@for_langalias(@tab@@bpm(INST_@uclangalias@)@ \
@tab@@bpm(INST_@uclangalias@_DEBUG)@ \
@tab@@bpm(INST_@uclangalias@_M)@ \
@tab@@bpm(INST_@uclangalias@_DEBUG_M)@ \
@if(platform==windows @tab@@bpm(INST_@uclangalias@W)@ \
@tab@@bpm(INST_@uclangalias@W_M)@ \
)@)@@if(platform==windows @tab@@bpm(INST_RAKU)@ \
@tab@@bpm(INST_RAKU_DEBUG)@ \
@tab@@bpm(INST_RAKUW)@ \
)@@for_langalias(@for_toolchain(@tab@@bpm(@uclangalias@_@uctoolchain@_RUNNER)@ \
)@)@

@bpv(CLEANUPS)@ = \
  @bpm(RUN_RAKUDO_SCRIPT)@ \
@for_langalias(  @bpm(INST_@uclangalias@)@ \
  @bpm(INST_@uclangalias@_DEBUG)@ \
  @bpm(INST_@uclangalias@_M)@ \
  @bpm(INST_@uclangalias@_DEBUG_M)@ \
  @bpm(INST_@uclangalias@W)@ \
  @bpm(INST_@uclangalias@W_M)@ \
  @bpm(INST_@uclangalias@)@@moar::obj@ \
  @bpm(INST_@uclangalias@_DEBUG)@@moar::obj@ \
  @bpm(INST_@uclangalias@_M)@@moar::obj@ \
  @bpm(INST_@uclangalias@_DEBUG_M)@@moar::obj@ \
  @bpm(INST_@uclangalias@W)@@moar::obj@ \
  @bpm(INST_@uclangalias@W_M)@@moar::obj@ \
)@  @bpm(INST_RAKU)@ \
  @bpm(INST_RAKU_DEBUG)@ \
  @bpm(INST_RAKUW)@ \
  @bpm(INST_RAKU)@@moar::obj@ \
  @bpm(INST_RAKU_DEBUG)@@moar::obj@ \
  @bpm(INST_RAKUW)@@moar::obj@ \
  @bpm(RAKUDO_OPS_DLL)@ \
  @bpm(RAKUDO_OPS_OBJ)@ \
@for_langalias(@for_toolchain(  @bpm(@uclangalias@_@uctoolchain@_RUNNER)@ \
)@)@  rakudo-m.c \
  rakudo-m@moar::obj@ \
  rakudo.c \
  rakudo@moar::obj@ \
  rakudo@moar::exe@ \
  perl6@moar::exe@

@bpv(RAKUDO_OPS_EXTRA)@ = @bpm(RAKUDO_OPS_DLL)@

@bpv(NQP_FLAGS_EXTRA)@ = --vmlibs=@bpm(RAKUDO_OPS_DLL)@=Rakudo_ops_init

#@bpv(HARNESS_TYPE)@ = $(HARNESS_TYPE)

@bpv(HARNESS6)@ = @nfp(@base_dir@/@bpm(RUNNER)@)@ -Ilib @nfp(t/harness6)@
@bpv(HARNESS6_WITH_FUDGE)@ = @bpm(HARNESS6)@ --fudge

@bpv(RUN_CLEAN_TARGET_FILES)@ = @nfp(@base_dir@/@bpm(RUNNER)@)@ @script(clean-target-files.raku)@ $(VERBOSE)

@bsv(SPECIFIC_TEST_DIRS)@ = @nfp(t/09-moar)@ @nfp(t/12-rakuast)@

@include(Makefile-backend-common)@

@bpm(RAKUDO_OPS_DLL)@: @bpm(RAKUDO_OPS_DLL_SRC)@
	@echo(+++ Compiling	$@)@
	$(NOECHO)@bpm(CC)@ @moar::ccswitch@ @moar::ccshared@ @bpm(CFLAGS)@ @bpm(MOAR_INC_PATHS)@ @moar::ccout@@bpm(RAKUDO_OPS_OBJ)@ @bpm(RAKUDO_OPS_DLL_SRC)@
	$(NOECHO)@bpm(LD)@ @moar::ldswitch@ @moar::lddir@"@moar::libdir@" @moar::ldshared@ @bpm(LDFLAGS)@ @bpm(LDLIBS)@ @moar::ldout@@bpm(RAKUDO_OPS_DLL)@ @bpm(RAKUDO_OPS_OBJ)@ @moar_lib@

@backend_prefix@-runner-default: @bpm(INST_RAKUDO)@ @bpm(INST_RAKUDO_DEBUG)@

@if(platform!=windows @for_langalias(@for_toolchain(
@bpm(@uclangalias@_@uctoolchain@_RUNNER)@: @@configure_script@@ @bpm(C_RUNNER)@ @bsm(RAKUDO)@ @bsm(SETTING)@ @@template(rakudo-@toolchain@-m)@@ @@template(rakudo-debug-notice)@@ @@template(sh-prelude)@@
	@echo(+++ Generating	$@)@
	$(NOECHO)$(RM_F) $@
	$(NOECHO)$(CONFIGURE) --expand @nfpq(@backend_subdir@/rakudo-@toolchain@-m)@ --out $@ \
		--set-var=MOAR=$(MOAR) \
		--set-var=ctx_subdir=@backend_subdir@ \
		--set-var=runner_opts=@chomp(@insert(Makefile-runner_opts)@)@
	-$(NOECHO)$(CHMOD) 755 $@
)@)@)@

@bpm(RUN_RAKUDO_SCRIPT)@: @@nfp(@template(@backend_subdir@/rakudo-m-early-build.in)@)@@
	$(NOECHO)$(RM_F) @q(@bpm(RUN_RAKUDO_SCRIPT)@)@
	$(NOECHO)$(CONFIGURE) --expand @nfpq(@backend_subdir@/@bpm(RUN_RAKUDO_SCRIPT)@)@ --out @bpm(RUN_RAKUDO_SCRIPT)@ \
		--set-var=base_dir=@nfpq(@base_dir@)@ \
		--set-var=moar=$(MOAR) \
		--set-var=nqp_libdir=@nfpq(@nqp::libdir@)@ \
		--set-var=rakudo=@bsm(RAKUDO)@

@bpm(RUNNER)@: @@configure_script@@ @bsm(RAKUDO)@@for_specs( @bsm(SETTING_@ucspec@)@)@ @@nfp(@template(@backend_subdir@/rakudo-m-build.c.in)@)@@ @@nfp(@template(@backend_subdir@/rakudo-m-build.c.windows)@)@@
	@echo(+++ Generating	$@)@
	$(NOECHO)$(RM_F) @q(@bpm(RUNNER)@)@
	$(NOECHO)$(CONFIGURE) --expand @nfpq(@backend_subdir@/rakudo-m-build.c)@ --out rakudo-m.c \
		--set-var=MOAR=$(MOAR) \
		--set-var=base_dir=@shquot(@nfp(@base_dir@)@)@ \
		--set-var=nqp_lib_dir=@shquot(@nfp(@nqp::libdir@)@)@ \
		--set-var=exec_name=@shquot(@nfp(@base_dir@/@bpm(RUNNER)@)@)@ \
		--set-var=mbc=@bsm(RAKUDO)@ \
		--set-var=nqp_home=@shquot(@nfp(@nqp_home@)@)@
	$(NOECHO)@bpm(CC)@ @moar::ccswitch@ @bpm(CFLAGS)@ @moar::ccout@rakudo-m@moar::obj@ rakudo-m.c
	$(NOECHO)@bpm(LD)@ @moar::ldout@$@ @bpm(LDFLAGS)@ @bpm(MINGW_UNICODE)@ rakudo-m@moar::obj@

@perl(
	# Use keys and values as macros to conform with possible future changes to
	# variable name standards.
    my %execs = (
        '@bpm(INST_PERL6)@'          => '@bpm(PERL6)@',
        '@bpm(INST_PERL6_DEBUG)@'    => '@bpm(PERL6_DEBUG)@',
        '@bpm(INST_PERL6_M)@'        => '@bpm(PERL6_M)@',
        '@bpm(INST_PERL6_DEBUG_M)@'  => '@bpm(PERL6_DEBUG_M)@',
        '@bpm(INST_RAKUDO)@'         => '@bpm(RAKUDO)@',
        '@bpm(INST_RAKUDO_DEBUG)@'   => '@bpm(RAKUDO_DEBUG)@',
        '@bpm(INST_RAKUDO_M)@'       => '@bpm(RAKUDO_M)@',
        '@bpm(INST_RAKUDO_DEBUG_M)@' => '@bpm(RAKUDO_DEBUG_M)@',
    );
    if ($cfg->cfg('platform') eq 'windows') {
		$execs{'@bpm(INST_PERL6W)@'}     = '@bpm(PERL6W)@';
		$execs{'@bpm(INST_PERL6W_M)@'}   = '@bpm(PERL6W_M)@';
		$execs{'@bpm(INST_RAKUDOW)@'}    = '@bpm(RAKUDOW)@';
		$execs{'@bpm(INST_RAKUDOW_M)@'}  = '@bpm(RAKUDOW_M)@';
		$execs{'@bpm(INST_RAKU)@'}       = '@bpm(RAKU)@';
		$execs{'@bpm(INST_RAKU_DEBUG)@'} = '@bpm(RAKU_DEBUG)@';
		$execs{'@bpm(INST_RAKUW)@'}      = '@bpm(RAKUW)@';
	}
    for my $build (keys %execs) {
        my $installed = $macros->expand($execs{$build});
		$build = $macros->expand($build);
        my %vars = (
            exec_name => $build,
        );
		my $obj = $build;
        my $qchar = $config{'quote'};
        $vars{exec_path_define} =
            '-DSTATIC_EXEC_PATH=' . $qchar . $cfg->c_escape_string($cfg->nfp($config{'prefix'} . '/bin/' . $installed )) . $qchar
            if $config{relocatable} eq 'nonreloc';
        $vars{debug_flag} = '-DMOAR_RAKUDO_RUNNER_DEBUG' if $build =~ /DEBUG/;
        if ($build !~ /RAKUW|RAKUDOW|PERL6W/) {
            $vars{subsystem_win_ld_flags} = '';
            $vars{subsystem_win_cc_flags} = '';
        }
        $vars{obj_file} = $obj;
        my $scope = $cfg->push_config(%vars);
        $out .= $macros->expand('@insert(Makefile-gen-c-runner)@');
    }
)@

##  testing targets

# No sense in moving this into Makefile-backend-common.in because moar backend
# is the only one supporting harness6
@backend_prefix@-test6: @backend_prefix@-coretest6

@backend_prefix@-coretest6: @backend_prefix@-all
	@bpm(HARNESS6)@ $(COMMON_TEST_DIRS) @bsm(SPECIFIC_TEST_DIRS)@

# Run the spectests that we know work.
@backend_prefix@-spectest6: @backend_prefix@-testable
	@bpm(HARNESS6_WITH_FUDGE)@ --tests-from-file=$(SPECTEST_DATA)

@backend_prefix@-spectest_full6: @backend_prefix@-testable
	@bpm(HARNESS6_WITH_FUDGE)@ @nfp(t/spec)@

@backend_prefix@-quicktest6: @backend_prefix@-testable
	@bpm(HARNESS6_WITH_FUDGE)@ --tests-from-file=$(SPECTEST_DATA) --quick

@backend_prefix@-stresstest6: @backend_prefix@-testable
	@bpm(HARNESS6_WITH_FUDGE)@ --tests-from-file=$(SPECTEST_DATA) --stress

#spectest_smolder: rakudo_test_run.tar.gz
#	./perl6 -e "shell qqx[git log -1 --pretty=format:%H].fmt(qq[curl -F architecture=@cpuarch@ -F platform=@osname@ -F revision=%s -F report_file=@rakudo_test_run.tar.gz -F username=parrot-autobot -F password=qa_rocks http://smolder.parrot.org/app/projects/process_add_report/5])"

# Run the tests in t/localtest.data
@backend_prefix@-localtest: @backend_prefix@-all spectest_update @nfp(t/localtest.data)@
	@bpm(HARNESS6_WITH_FUDGE)@ --tests-from-file=@nfp(t/localtest.data)@

# Run the tests in t/localtest.data with a higher verbosity
@backend_prefix@-localtest_loud: @backend_prefix@-all spectest_update @nfp(t/localtest.data)@
	@bpm(HARNESS6_WITH_FUDGE)@ --tests-from-file=@nfp(t/localtest.data)@ --verbosity=1

# Run many tests of your choice.
# make sometests TESTFILES=t/foo/bar
@backend_prefix@-sometests: @backend_prefix@-all
	@bpm(HARNESS6_WITH_FUDGE)@ $(TESTFILES)

@backend_prefix@-install-dirs::
	$(NOECHO)$(MKPATH) @nfpq($(DESTDIR)$(RAKUDO_HOME)/runtime/dynext)@

@backend_prefix@-install-pre:: 
	@echo(+++ Removing old files)@
	$(NOECHO)@bpm(RUN_CLEAN_TARGET_FILES)@ @nfpq(@nop($(DESTDIR))@@bpm(LIBDIR)@/Perl6)@ @bpm(RAKUDO_PRECOMPS)@
	$(NOECHO)@bpm(RUN_CLEAN_TARGET_FILES)@ @nfpq(@nop($(DESTDIR))@@bpm(LIBDIR)@/Perl6/BOOTSTRAP)@ @bpm(RAKUDO_BOOTSTRAP_PRECOMPS)@
	$(NOECHO)@bpm(RUN_CLEAN_TARGET_FILES)@ @nfpq($(DESTDIR)$(RAKUDO_HOME)/runtime)@ @for_specs($(SETTING_@ucspec@_MOAR) )@
	$(NOECHO)@bpm(RUN_CLEAN_TARGET_FILES)@ @nfpq($(DESTDIR)$(PREFIX)/bin)@ @bsm(RAKUDO)@ @bsm(RAKUDO_DEBUG)@ @bsm(PERL6)@ @bsm(PERL6_DEBUG)@

@backend_prefix@-install-main:: @@bpm(RAKUDO_OPS_DLL)@@ @for_langalias(@@bpm(INST_@uclangalias@_M)@@ @@bpm(INST_@uclangalias@_DEBUG_M)@@ @if(platform==windows @@bpm(INST_@uclangalias@W_M)@@ )@)@
	$(NOECHO)$(CP) @bpm(RAKUDO_OPS_DLL)@ @nfpq($(DESTDIR)$(RAKUDO_HOME)/runtime/dynext)@
@for_langalias(
	$(NOECHO)$(CP) @bpm(INST_@uclangalias@_M)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(@uclangalias@_M)@)@
	$(NOECHO)$(CP) @bpm(INST_@uclangalias@_DEBUG_M)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(@uclangalias@_DEBUG_M)@)@
	@if(platform==windows $(NOECHO)$(CP) @bpm(INST_@uclangalias@W_M)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(@uclangalias@W_M)@)@)@
)@@if(platform!=windows @for_langalias(@for_toolchain(@insert(Makefile-install)@)@)@
)@@if(platform==windows @m_install@)@

@backend_prefix@-install-post::
@expand(@clean_old_p6_libs@)@

@backend_prefix@-runner-default-install: @backend_prefix@-install
	@echo(+++ Installing @uc(@backend@)@ launchers)@
	$(NOECHO)$(CP) @bpm(INST_RAKUDO)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKUDO)@)@
	$(NOECHO)$(CP) @bpm(INST_RAKUDO_DEBUG)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKUDO_DEBUG)@)@
	$(NOECHO)$(CP) @bpm(INST_PERL6)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(PERL6)@)@
	$(NOECHO)$(CP) @bpm(INST_PERL6_DEBUG)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(PERL6_DEBUG)@)@
@if(platform==windows
	$(NOECHO)$(CP) @bpm(INST_RAKUDOW)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKUDOW)@)@
	$(NOECHO)$(CP) @bpm(INST_PERL6W)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(PERL6W)@)@
)@
@if(with_raku_alias==on @tab@@echo(+++ Creating Raku executable alias)@
@if(platform!=windows
	$(NOECHO)$(LN_S) @nfpq(./@bpm(RAKUDO)@)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKU)@)@
	$(NOECHO)$(LN_S) @nfpq(./@bpm(RAKUDO_DEBUG)@)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKU_DEBUG)@)@
)@@if(platform==windows
	$(NOECHO)$(CP) @bpm(INST_RAKU)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKU)@)@
	$(NOECHO)$(CP) @bpm(INST_RAKU_DEBUG)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKU_DEBUG)@)@
	$(NOECHO)$(CP) @bpm(INST_RAKUW)@ @nfpq($(DESTDIR)$(PREFIX)/bin/@bpm(RAKUW)@)@
)@
)@
manifest:
	@echo(+++ Creating	MANIFEST)@
	$(NOECHO)echo MANIFEST >MANIFEST
	@nowcho@git ls-files | $(PERL5) -ne '/^\./ || print' >>MANIFEST
	@nowcho@cd @nfp(t/spec)@ && git clean -xdf
	@nowcho@find @nfp(t/spec)@ -type f | grep -v '\.git' >>MANIFEST
	@nowcho@sort -u -o MANIFEST MANIFEST

release: manifest @bpm(RUN_RAKUDO_SCRIPT)@
	$(NOECHO)[ -n "$(VERSION)" ] || ( echo "\nTry 'make release VERSION=yyyy.mm'\n\n"; exit 1 )
	@echo(+++ Releasing $(VERSION))@
	$(NOECHO)bash -c '[ "$$(cat VERSION)" == "$(VERSION)" ] || ( echo -e "\nVersion on command line and in VERSION file differ\n"; exit 1 )'
	$(NOECHO)[ -d rakudo-$(VERSION) ] || ln -s . rakudo-$(VERSION)
	$(NOECHO)@bpm(RUN_RAKUDO)@ -ne 'say "rakudo-$(VERSION)@slash@$$_"' MANIFEST | \
		tar -zcv --owner=0 --group=0 --numeric-owner -T - -f rakudo-$(VERSION).tar.gz
	$(NOECHO)rm rakudo-$(VERSION)


##  cleaning
@backend_prefix@-clean:
	@echo(+++ Cleaning up @uc(@backend@)@)@
	$(NOECHO)$(RM_F) @bpm(CLEANUPS_ALL)@
	$(NOECHO)$(RM_F) non-existent-copy-mtgt non-existent-copy-stgt

@backend_prefix@-testclean:

# vim: ft=make noexpandtab ts=4 sw=4
