diff --git a/Makefile b/Makefile
index 76449741ecde2f544529fb79d1a91f81f5011836..6476fa521284943c3f29487ed0be8dd3d9b14a22 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,8 @@ include libfftpack/planck.make
 include libsharp/planck.make
 include docsrc/planck.make
 
+CYTHON_MODULES=python/libsharp/libsharp.so $(if $(MPI_CFLAGS), python/libsharp/libsharp_mpi.so)
+
 $(all_lib): %: | $(LIBDIR)_mkdir
 	@echo "#  creating library $*"
 	$(ARCREATE) $@ $^
@@ -62,10 +64,15 @@ perftest: compile_all
 genclean:
 	rm libsharp/sharp_legendre.c || exit 0
 
-python/libsharp/libsharp.so: python/libsharp/libsharp.pyx $(LIB_libsharp)
+$(CYTHON_MODULES): %.so: %.pyx
+ifndef PIC_CFLAGS
+	$(error Python extension must be built using the --enable-pic configure option.)
+endif
 	cython $<
-	$(CC) -fPIC `python-config --cflags` -I$(INCDIR) -o python/libsharp/libsharp.o -c python/libsharp/libsharp.c
-	$(CL) -shared python/libsharp/libsharp.o -L$(LIBDIR) -lsharp -lfftpack -lc_utils `python-config --libs` -o $@
+	$(CC) $(DEBUG_CFLAGS) $(OPENMP_CFLAGS) $(PIC_CFLAGS) `python-config --cflags` -I$(INCDIR) -o $(<:.pyx=.o) -c $(<:.pyx=.c)
+	$(CL) -shared $(<:.pyx=.o) $(OPENMP_CFLAGS) $(CYTHON_OBJ) -L$(LIBDIR) -lsharp -lfftpack -lc_utils -L`python-config --prefix`/lib `python-config --ldflags` -o $@
+
+python: $(all_lib) hdrcopy $(CYTHON_MODULES)
 
-pytest: python/libsharp/libsharp.so
+pytest: python
 	cd python && nosetests --nocapture libsharp/tests/test_sht.py
diff --git a/config/config.auto.in b/config/config.auto.in
index 32b340ba6f24612c2f175c5097a56305133d19f4..841cec085bc0699cc8f6f222bad3b89ca85bcd98 100644
--- a/config/config.auto.in
+++ b/config/config.auto.in
@@ -5,5 +5,8 @@ CL=@CC@
 CCFLAGS_NO_C=@CCFLAGS_NO_C@
 CCFLAGS=$(CCFLAGS_NO_C) -c
 CLFLAGS=-L. -L$(LIBDIR) @LDCCFLAGS@ -lm
-
+DEBUG_CFLAGS=@DEBUG_CFLAGS@
+MPI_CFLAGS=@MPI_CFLAGS@
+OPENMP_CFLAGS=@OPENMP_CFLAGS@
+PIC_CFLAGS=@PIC_CFLAGS@
 ARCREATE=@ARCREATE@
diff --git a/config/rules.common b/config/rules.common
index 419584d616cebdb10991d66ccdded0560284de0b..bac2a2c705e041063bf844fa4f6fa7017c87938e 100644
--- a/config/rules.common
+++ b/config/rules.common
@@ -1,9 +1,10 @@
-BLDROOT = $(SRCROOT)/build.$(SHARP_TARGET)
-PREFIX  = $(SRCROOT)/$(SHARP_TARGET)
-BINDIR	= $(PREFIX)/bin
-INCDIR	= $(PREFIX)/include
-LIBDIR	= $(PREFIX)/lib
-DOCDIR	= $(SRCROOT)/doc
+BLDROOT   = $(SRCROOT)/build.$(SHARP_TARGET)
+PREFIX    = $(SRCROOT)/$(SHARP_TARGET)
+BINDIR    = $(PREFIX)/bin
+INCDIR    = $(PREFIX)/include
+LIBDIR    = $(PREFIX)/lib
+DOCDIR    = $(SRCROOT)/doc
+PYTHONDIR = $(SRCROOT)/python/libsharp
 
 # do not use any suffix rules
 .SUFFIXES:
@@ -26,6 +27,7 @@ $(BLDROOT)/%.o : $(SRCROOT)/%.cc | echo_config
 
 clean:
 	rm -rf $(BLDROOT) $(PREFIX) $(DOCDIR) autom4te.cache/ config.log config.status
+	rm -rf $(PYTHONDIR)/*.c $(PYTHONDIR)/*.o $(PYTHONDIR)/*.so
 
 distclean: clean
 	rm -f config/config.auto
diff --git a/configure.ac b/configure.ac
index 1f65d086bca55959a817d8733a3058c567b1254a..79b435e656aae34322abe5f5fced13fbb14d284e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,20 +82,20 @@ case $system in
     ;;
 esac
 
-CCFLAGS="$CCFLAGS $OPENMP_CFLAGS"
-
 if test $ENABLE_DEBUG = yes; then
-  CCFLAGS="$CCFLAGS -g"
+  DEBUG_CFLAGS="-g"
 fi
 
 if test $ENABLE_PIC = yes; then
-  CCFLAGS="$CCFLAGS -fPIC"
+  PIC_CFLAGS="-fPIC"
 fi
 
 if test $ENABLE_MPI = yes; then
-  CCFLAGS="$CCFLAGS -DUSE_MPI"
+  MPI_CFLAGS="-DUSE_MPI"
 fi
 
+CCFLAGS="$CCFLAGS $DEBUG_CFLAGS $OPENMP_CFLAGS $PIC_CFLAGS $MPI_CFLAGS"
+
 CCFLAGS_NO_C="$CCFLAGS $CPPFLAGS"
 
 LDCCFLAGS="$LDFLAGS $CCFLAGS"
@@ -104,6 +104,10 @@ AC_SUBST(SILENT_RULE)
 AC_SUBST(CC)
 AC_SUBST(CCFLAGS_NO_C)
 AC_SUBST(LDCCFLAGS)
+AC_SUBST(DEBUG_CFLAGS)
+AC_SUBST(MPI_CFLAGS)
+AC_SUBST(OPENMP_CFLAGS)
+AC_SUBST(PIC_CFLAGS)
 AC_SUBST(ARCREATE)
 
 AC_OUTPUT(config/config.auto)