diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd4a85f2a56fb8852a8a595010609ce62197db88..f10b28e39678577aa1644bce3f52443def0562e8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR)
 project(pairs CXX)
 #enable_testing()
 
+find_package(PythonInterp)
+find_package(Python)
+
 set(TESTCASE ${TESTCASE} CACHE STRING "Select the testcase from the following: md, dem")
 
 if(NOT TESTCASE)
@@ -42,8 +45,13 @@ else()
 endif()
 
 add_library(runtime_cpu STATIC runtime/devices/dummy.cpp)
-target_link_libraries(${CPU_BIN} PRIVATE runtime_cpu)
-add_custom_command(OUTPUT ${CPU_SRC} COMMAND python examples/${TESTCASE}.py cpu)
+target_link_libraries(${CPU_BIN} runtime_cpu)
+add_custom_target(gen_cpu ALL DEPENDS ${CPU_SRC})
+add_custom_command(
+    TARGET gen_cpu
+    PRE_BUILD # Call this command pre-build
+    COMMAND ${PYTHON_EXECUTABLE} examples/${TESTCASE}.py cpu
+    COMMENT "Generate CPU code")
 
 if(COMPILE_CUDA)
     find_package(CUDA REQUIRED)
@@ -66,9 +74,14 @@ if(COMPILE_CUDA)
     set_target_properties(runtime_gpu PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
 
     #set_property(TARGET ${GPU_BIN} PROPERTY CUDA_SEPARABLE_COMPILATION ON)
-    target_link_libraries(${GPU_BIN} PRIVATE runtime_gpu)
-    add_custom_command(OUTPUT ${GPU_SRC} COMMAND python examples/${TESTCASE}.py gpu)
-
+    target_link_libraries(${GPU_BIN} runtime_gpu)
+
+    add_custom_target(gen_gpu ALL DEPENDS ${GPU_SRC})
+    add_custom_command(
+        TARGET gen_gpu
+        PRE_BUILD # Call this command pre-build
+        COMMAND ${PYTHON_EXECUTABLE} examples/${TESTCASE}.py gpu
+        COMMENT "Generate GPU code")
 endif()
 
 target_link_libraries(${CPU_BIN} ${CMAKE_EXE_LINKER_FLAGS})