diff --git a/CMakeLists.txt b/CMakeLists.txt
index 22217ba30b0c3771a4fd51505549b658de616778..4cefad7288acc2f437db19d304657614f2004182 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -95,7 +95,9 @@ if(BORNAGAIN_GUI)
     string(APPEND CMAKE_CXX_FLAGS " -DHAVE_QT=ON")
 endif()
 include(BornAgain/Config)
-include(BornAgain/PythonAPI)
+if(BORNAGAIN_PYTHON)
+    include(BornAgain/PythonAPI)
+endif()
 include(BornAgain/PythonDocs)
 
 # debug optimization
@@ -134,6 +136,9 @@ if(BORNAGAIN_TIDY)
 endif()
 
 add_subdirectory(Fit)
+if(BORNAGAIN_PYTHON)
+    add_dependencies(BornAgainFit swig_runtime)
+endif()
 add_subdirectory(Tests/UnitTests/Fit)
 
 add_subdirectory(Core)
diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
index e6f5abbbadceee6fd94e32dbeebed724c4ce97f2..d08c9c3346e28dfb0a3050a88360f2ad3b1b0e57 100644
--- a/Core/CMakeLists.txt
+++ b/Core/CMakeLists.txt
@@ -34,10 +34,6 @@ endif(BORNAGAIN_PYTHON)
 # exposing library name and list of include directories outside
 set(${lib}_LIBRARY ${lib} PARENT_SCOPE)
 
-if(BORNAGAIN_PYTHON)
-    add_dependencies(${lib} swig_runtime)
-endif()
-
 # --- external dependencies ---
 
 target_link_libraries(${lib} ${BornAgainFit_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
@@ -76,33 +72,9 @@ endif()
 
 # --- installation ---
 
-install(TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
-install(FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
-    DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
 
 foreach(file ${include_files})
     get_filename_component(dir ${file} DIRECTORY)
     install(FILES ${file} DESTINATION ${destination_include}/${name}/${dir})
 endforeach()
 
-if(WIN32)
-    # python in windows required .pyd extension for the library name
-    if(BORNAGAIN_PYTHON)
-        add_custom_command(
-            TARGET ${lib}
-            POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
-            )
-        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
-            DESTINATION ${destination_lib} COMPONENT Libraries)
-        add_custom_command(
-            TARGET ${lib}
-            POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
-            )
-    endif()
-endif()
diff --git a/Fit/CMakeLists.txt b/Fit/CMakeLists.txt
index c4d423cdad03dd2f5382b0b59db75d78fbd9ead2..b9b52dec7e70e6068aced6bfae8cb0de310e9bbe 100644
--- a/Fit/CMakeLists.txt
+++ b/Fit/CMakeLists.txt
@@ -41,33 +41,9 @@ endif()
 
 # --- installation ---
 
-install(TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
-install(FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
-    DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
 
 foreach(file ${include_files})
     get_filename_component(dir ${file} DIRECTORY)
     install(FILES ${file} DESTINATION ${destination_include}/${name}/${dir})
 endforeach()
 
-if(WIN32)
-    # python in windows required .pyd extension for the library name
-    if(BORNAGAIN_PYTHON)
-        add_custom_command(
-            TARGET ${lib}
-            POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
-            )
-        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
-            DESTINATION ${destination_lib} COMPONENT Libraries)
-        add_custom_command(
-            TARGET ${lib}
-            POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
-            )
-    endif()
-endif()
diff --git a/cmake/BornAgain/PythonAPI.cmake b/cmake/BornAgain/PythonAPI.cmake
index 59f2d020f55ea793e7fd4532113215e6dc96bafe..1262f810d6d710e97a9dedc8eea6f63b286febb1 100644
--- a/cmake/BornAgain/PythonAPI.cmake
+++ b/cmake/BornAgain/PythonAPI.cmake
@@ -1,5 +1,9 @@
 # Configure and install the Swig runtime, the BornAgain Python module, and more
 
+if(NOT BORNAGAIN_PYTHON)
+    message(FATAL_ERROR "PythonAPI included though BORNAGAIN_PYTHON=false")
+endif()
+
 configure_file(${WRAP_DIR}/python/plot_utils.py
     ${CMAKE_BINARY_DIR}/lib/bornagain/plot_utils.py COPYONLY)
 
@@ -22,6 +26,7 @@ if(CONFIGURE_BINDINGS)
         DEPENDS ${swig_dependencies} ${include_files}
         )
 endif()
+
 add_custom_target(swig_runtime DEPENDS ${AUTO_DIR}/swig_runtime.h)
 
 install(DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/
diff --git a/cmake/BornAgain/SwigLib.cmake b/cmake/BornAgain/SwigLib.cmake
index 2ccb8a738aebf616a5d3d5111aa103aec9f31a52..856e74ebf422bf8695e1e3127df1e2e535e03548 100644
--- a/cmake/BornAgain/SwigLib.cmake
+++ b/cmake/BornAgain/SwigLib.cmake
@@ -69,4 +69,30 @@ function(SwigLib name lib TMP_DIR)
     target_include_directories(${lib} PUBLIC ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS})
     target_link_libraries(${lib} ${Python3_LIBRARIES})
 
+    install(TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
+    install(FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
+        DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
+
+    if(WIN32)
+        # python in windows required .pyd extension for the library name
+        if(BORNAGAIN_PYTHON)
+            add_custom_command(
+                TARGET ${lib}
+                POST_BUILD
+                COMMAND ${CMAKE_COMMAND} -E copy
+                ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+                ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
+                )
+            install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
+                DESTINATION ${destination_lib} COMPONENT Libraries)
+            add_custom_command(
+                TARGET ${lib}
+                POST_BUILD
+                COMMAND ${CMAKE_COMMAND} -E copy
+                ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+                ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
+                )
+        endif()
+    endif()
+
 endfunction()