diff --git a/contribs/perlapi/libslurm/Makefile.am b/contribs/perlapi/libslurm/Makefile.am
index d15f43a84a91ef469ff0990f608108f549c55183..4683cea8cd2bef3a3c7dc50c502d1c7b4cb9803a 100644
--- a/contribs/perlapi/libslurm/Makefile.am
+++ b/contribs/perlapi/libslurm/Makefile.am
@@ -2,24 +2,28 @@ AUTOMAKE_OPTIONS = foreign
 # copied from pidgin
 #
 perl_dir = perl
-perl_src_dir = ${abs_srcdir}/${perl_dir}
 perlpath = /usr/bin/perl
 perl_sources = \
-	       $(perl_src_dir)/Makefile.PL.in \
-	       $(perl_src_dir)/ppport.h \
-	       $(perl_src_dir)/Slurm.pm \
-	       $(perl_src_dir)/Slurm.xs \
-	       $(perl_src_dir)/typemap \
-	       $(perl_src_dir)/msg.h \
-	       $(perl_src_dir)/alloc.c \
-	       $(perl_src_dir)/conf.c \
-	       $(perl_src_dir)/job.c \
-	       $(perl_src_dir)/launch.c \
-	       $(perl_src_dir)/node.c \
-	       $(perl_src_dir)/partition.c \
-	       $(perl_src_dir)/trigger.c
+	       $(perl_dir)/Makefile.PL.in \
+	       $(perl_dir)/ppport.h \
+	       $(perl_dir)/Slurm.pm \
+	       $(perl_dir)/Slurm.xs \
+	       $(perl_dir)/typemap \
+	       $(perl_dir)/msg.h \
+	       $(perl_dir)/alloc.c \
+	       $(perl_dir)/conf.c \
+	       $(perl_dir)/job.c \
+	       $(perl_dir)/launch.c \
+	       $(perl_dir)/node.c \
+	       $(perl_dir)/partition.c \
+	       $(perl_dir)/trigger.c
 
 $(perl_dir)/Makefile:	$(perl_dir)/Makefile.PL
+	@if test "x${top_srcdir}" != "x${top_builddir}"; then \
+		for f in ${perl_sources}; do \
+			${LN_S} -f ${abs_srcdir}/$$f $$f; \
+		done; \
+	fi
 	@cd $(perl_dir) && $(perlpath) Makefile.PL $(PERL_MM_PARAMS) prefix=${prefix}
 
 #
diff --git a/contribs/perlapi/libslurm/Makefile.in b/contribs/perlapi/libslurm/Makefile.in
index 58a466bf61681d6ca36e5b90c57c2c411e0ad84d..7ce6096e7cb69099d76fbcfa0c91cc17d6774f9d 100644
--- a/contribs/perlapi/libslurm/Makefile.in
+++ b/contribs/perlapi/libslurm/Makefile.in
@@ -268,22 +268,21 @@ AUTOMAKE_OPTIONS = foreign
 # copied from pidgin
 #
 perl_dir = perl
-perl_src_dir = ${abs_srcdir}/${perl_dir}
 perlpath = /usr/bin/perl
 perl_sources = \
-	       $(perl_src_dir)/Makefile.PL.in \
-	       $(perl_src_dir)/ppport.h \
-	       $(perl_src_dir)/Slurm.pm \
-	       $(perl_src_dir)/Slurm.xs \
-	       $(perl_src_dir)/typemap \
-	       $(perl_src_dir)/msg.h \
-	       $(perl_src_dir)/alloc.c \
-	       $(perl_src_dir)/conf.c \
-	       $(perl_src_dir)/job.c \
-	       $(perl_src_dir)/launch.c \
-	       $(perl_src_dir)/node.c \
-	       $(perl_src_dir)/partition.c \
-	       $(perl_src_dir)/trigger.c
+	       $(perl_dir)/Makefile.PL.in \
+	       $(perl_dir)/ppport.h \
+	       $(perl_dir)/Slurm.pm \
+	       $(perl_dir)/Slurm.xs \
+	       $(perl_dir)/typemap \
+	       $(perl_dir)/msg.h \
+	       $(perl_dir)/alloc.c \
+	       $(perl_dir)/conf.c \
+	       $(perl_dir)/job.c \
+	       $(perl_dir)/launch.c \
+	       $(perl_dir)/node.c \
+	       $(perl_dir)/partition.c \
+	       $(perl_dir)/trigger.c
 
 AM_CPPFLAGS = \
 	-DVERSION=\"$(VERSION)\" \
@@ -473,6 +472,11 @@ uninstall-am: uninstall-local
 
 
 $(perl_dir)/Makefile:	$(perl_dir)/Makefile.PL
+	@if test "x${top_srcdir}" != "x${top_builddir}"; then \
+		for f in ${perl_sources}; do \
+			${LN_S} -f ${abs_srcdir}/$$f $$f; \
+		done; \
+	fi
 	@cd $(perl_dir) && $(perlpath) Makefile.PL $(PERL_MM_PARAMS) prefix=${prefix}
 
 #
diff --git a/contribs/perlapi/libslurm/perl/Makefile.PL.in b/contribs/perlapi/libslurm/perl/Makefile.PL.in
index ecf7500e1dd850c4b968f032fd43b981bc30f7db..f1e4b234e3ad029f95f724c256f5eec261facc8b 100644
--- a/contribs/perlapi/libslurm/perl/Makefile.PL.in
+++ b/contribs/perlapi/libslurm/perl/Makefile.PL.in
@@ -83,10 +83,10 @@ $other_ld_flags = " -brtl -G -bnoentry -bgcbypass:1000 -bexpfull"
 
 WriteMakefile(
 	NAME              => 'Slurm',
-	VERSION_FROM      => '@abs_srcdir@/Slurm.pm', # finds $VERSION
+	VERSION_FROM      => 'Slurm.pm', # finds $VERSION
 	PREREQ_PM         => {}, # e.g., Module::Name => 1.1
 	($] >= 5.005 ?     ## Add these new keywords supported since 5.005
-	(ABSTRACT_FROM    => '@abs_srcdir@/Slurm.pm', # retrieve abstract from module
+	(ABSTRACT_FROM    => 'Slurm.pm', # retrieve abstract from module
 	 AUTHOR           => 'Hongjia Cao <hjcao@nudt.edu.cn>') : ()),
 	LIBS              => ["-L@top_builddir@/src/api/.libs -L@prefix@/lib -lslurm"], # e.g., '-lm'
 	DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
@@ -94,7 +94,7 @@ WriteMakefile(
 	# Un-comment this if you add C files to link with later:
 	OBJECT            => '$(O_FILES)', # link all the C files too
 	CCFLAGS           => '-g',
-	PM                => {'@abs_srcdir@/Slurm.pm' => '$(INST_LIBDIR)/Slurm.pm'},
+	PM                => {'Slurm.pm' => '$(INST_LIBDIR)/Slurm.pm'},
 	dynamic_lib       => {'OTHERLDFLAGS' => $other_ld_flags},
 );