diff --git a/.github/workflows/windows-test-scheduled.yml b/.github/workflows/windows-test-scheduled.yml
index c3516772b..451b37f79 100644
--- a/.github/workflows/windows-test-scheduled.yml
+++ b/.github/workflows/windows-test-scheduled.yml
@@ -65,8 +65,7 @@ jobs:
       - name: Build the platform libraries (make lib)
         if: steps.check-sha.outputs.cache-hit != 'true'
         shell: cmd
-        run: make lib QUIET=1 SHELL=cmd
-        # make -j2 lib fails with SHELL=cmd (not sure why)
+        run: make -j2 lib QUIET=1 SHELL=cmd
 
       - name: Run the regression tests (make test)
         if: steps.check-sha.outputs.cache-hit != 'true'
diff --git a/libsrc/Makefile b/libsrc/Makefile
index 732fa1d0e..0873d019f 100644
--- a/libsrc/Makefile
+++ b/libsrc/Makefile
@@ -122,9 +122,13 @@ endef # ZIP_recipe
 zip:
 	$(foreach dir,$(OUTPUTDIRS),$(ZIP_recipe))
 
-$(TARGETS):
+$(TARGETS): | ../lib
 	@$(MAKE) --no-print-directory $@
 
+# ../lib must be created globally before doing lib targets in parallel
+../lib:
+	@$(call MKDIR,$@)
+
 else # TARGET
 
 CA65FLAGS =
@@ -293,10 +297,12 @@ $(EXTRA_OBJPAT): $(EXTRA_SRCPAT) | ../libwrk/$(TARGET) ../lib
 	@echo $(TARGET) - $(<F)
 	@$(CA65) -t $(TARGET) $(CA65FLAGS) --create-dep $(@:../lib/%.o=../libwrk/$(TARGET)/%.d) -o $@ $<
 
+$(EXTRA_OBJS): | ../lib
+
 ../lib/$(TARGET).lib: $(OBJS) | ../lib
 	$(AR65) a $@ $?
 
-../libwrk/$(TARGET) ../lib ../target/$(TARGET)/util:
+../libwrk/$(TARGET) ../target/$(TARGET)/util:
 	@$(call MKDIR,$@)
 
 $(TARGET): $(EXTRA_OBJS) ../lib/$(TARGET).lib