diff --git a/src/backend/utils/Gen_dummy_probes.pl.prolog b/src/backend/utils/Gen_dummy_probes.pl.prolog
new file mode 100644
index 0000000000..1c8993377d
--- /dev/null
+++ b/src/backend/utils/Gen_dummy_probes.pl.prolog
@@ -0,0 +1,19 @@
+#! /usr/bin/perl -w
+#-------------------------------------------------------------------------
+#
+# Gen_dummy_probes.pl
+#    Perl script that generates probes.h file when dtrace is not available
+#
+# Portions Copyright (c) 2008-2021, PostgreSQL Global Development Group
+#
+#
+# IDENTIFICATION
+#    src/backend/utils/Gen_dummy_probes.pl
+#
+# This program was generated by running perl's s2p over Gen_dummy_probes.sed
+#
+#-------------------------------------------------------------------------
+
+# turn off perlcritic for autogenerated code
+## no critic
+
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index bcf9dd41ad..16c2217f2a 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -92,12 +92,16 @@ $(top_builddir)/src/include/utils/probes.h: probes.h
 # Nothing depends on it, so it will never be called unless explicitly requested
 # The last two lines of the recipe format the script according to  our
 # standard and put back some blank lines for improved readability.
+ifeq ($(vpath_build),yes)
+$(top_srcdir)/src/backend/utils/Gen_dummy_probes.pl: Gen_dummy_probes.sed
+else
 Gen_dummy_probes.pl: Gen_dummy_probes.sed
-	perl -ni -e ' print; exit if /^\$$0/;' $@
-	s2p -f $<  | sed -e 1,4d -e '/# #/d' -e '$$d' >> $@
-	perltidy --profile=../../tools/pgindent/perltidyrc $@
-	perl -pi -e '!$$lb && ( /^\t+#/  || /^# prototypes/ ) && print qq{\n};'\
-		-e '$$lb = m/^\n/; ' $@
+endif
+	(cat $(top_srcdir)/$(subdir)/Gen_dummy_probes.pl.prolog; \
+		s2p -f $< | sed -e 1,3d -e '/# #/ d' -e '$$ d') | \
+	perltidy --profile=$(top_srcdir)/src/tools/pgindent/perltidyrc | \
+	perl -p -e '!$$lb && ( /^\t+#/ || /^# prototypes/ ) && print qq{\n};' \
+		-e '$$lb = m/^\n/; ' > $@
 
 .PHONY: install-data
 install-data: errcodes.txt installdirs
