diff --git a/CMakeLists.txt b/CMakeLists.txt
index abdcfe164d70111beb27869728b500ae13236ad1..3c1bbe7c28d9bf5de0d233f73ae07d4f07a1aee7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -116,10 +116,16 @@ if (BUILD_CONTRIB)
             WORKING_DIRECTORY ${CONTRIB_BUILD_PATH})
     else()
         set(SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extras/scripts)
-        execute_process(COMMAND python -m pip install ${SCRIPTS_DIR}/pywinmake)
         execute_process(
             COMMAND python ${SCRIPTS_DIR}/winmake.py
-            WORKING_DIRECTORY ${SCRIPTS_DIR})
+            WORKING_DIRECTORY ${SCRIPTS_DIR}
+            RESULT_VARIABLE BUILD_RESULT
+        )
+        if (BUILD_RESULT)
+            message(FATAL_ERROR "Contrib build failed.")
+        else()
+            message(STATUS "Contrib build successful.")
+        endif()
     endif()
 endif()
 
diff --git a/extras/scripts/winmake.py b/extras/scripts/winmake.py
index aad43a81dbc09a1168d795ea847ae4987a5e1a0f..aa0e7f8f673e7571457e97536385610f3de5e756 100644
--- a/extras/scripts/winmake.py
+++ b/extras/scripts/winmake.py
@@ -11,6 +11,7 @@ import os
 import time
 from datetime import timedelta
 import argparse
+import sys
 
 from pywinmake.utils import log, logger, sh_exec
 from pywinmake.package import Versioner, Paths, Operation, Package
@@ -77,7 +78,11 @@ def build_from_dir(path, out_dir=None):
     # Build the package at the given path.
     out_dir = os.path.join(path, "build") if out_dir is None else out_dir
     pkg = Package(src_dir=path, buildsrc_dir=out_dir)
-    builder.build(pkg)
+    if builder.build(pkg):
+        log.info(f"Package {pkg.name} built successfully.")
+    else:
+        log.error(f"Package {pkg.name} failed to build.")
+        sys.exit(1)
 
 def main():
     start_time = time.time()