Fix the parallel build.

- Override the GR_UNIQUE_TARGET function to not append a hash to the
  target name.
- Add explicit dependency between pygen_apps and _grgsm_swig
  The _grgs_swig needs to be built first because grcc evaluates and
  verify all imports
- Test the parallel build in the docker containers as well
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index c6b04d9..3e36430 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -32,7 +32,7 @@
 string(REPLACE ";" ":" PYTHONPATH "${PYTHONPATH}")
 
 ADD_CUSTOM_COMMAND(
-	OUTPUT grgsm_livemon
+	OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/grgsm_livemon
 	COMMAND "${CMAKE_COMMAND}"
 		-E env PYTHONPATH="${PYTHONPATH}" GRC_BLOCKS_PATH=${CMAKE_SOURCE_DIR}/grc
 		${PC_GNURADIO_RUNTIME_PREFIX}/${GR_RUNTIME_DIR}/grcc -d ${CMAKE_CURRENT_BINARY_DIR}
@@ -41,7 +41,7 @@
 	DEPENDS grgsm_livemon.grc
 	)
 ADD_CUSTOM_COMMAND(
-	OUTPUT grgsm_livemon_headless
+	OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/grgsm_livemon_headless
 	COMMAND "${CMAKE_COMMAND}"
 		-E env PYTHONPATH="${PYTHONPATH}" GRC_BLOCKS_PATH=${CMAKE_SOURCE_DIR}/grc
 		${PC_GNURADIO_RUNTIME_PREFIX}/${GR_RUNTIME_DIR}/grcc -d ${CMAKE_CURRENT_BINARY_DIR}
@@ -50,6 +50,27 @@
 	DEPENDS grgsm_livemon_headless.grc
 	)
 
+########################################################################
+# Override the GR_UNIQUE_TARGET function to not append a hash
+# to the `target` name, because we need a known name in order
+# to add an explicit dependency that's needed for the parallel build
+#
+# The original code segment (taken from GrPython.cmake) is
+#
+#    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
+#unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
+#print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
+#    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
+#
+########################################################################
+function(GR_UNIQUE_TARGET desc)
+    file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
+print(re.sub('\\W', '_', '${desc} ${reldir}'))"
+    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
+    add_custom_target(${_target} ALL DEPENDS ${ARGN})
+endfunction(GR_UNIQUE_TARGET)
+
 GR_PYTHON_INSTALL(
     PROGRAMS
 	${CMAKE_CURRENT_BINARY_DIR}/grgsm_livemon
@@ -59,6 +80,11 @@
     DESTINATION bin
 )
 
+# The add_dependencies(...) is very important for the parallel build `make -j $(nproc)`
+# The `pygen_apps` target is generated in GR_PYTHON_INSTALL function which calls
+# GR_UNIQUE_TARGET that we redefine above.
+add_dependencies(pygen_apps _grgsm_swig)
+
 install(
     PROGRAMS
     DESTINATION bin