diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1b69b6d5947b04efa72e1699e74c7022791693da..f8e28a3d23e7b0ada5040a5ee01fb8d13d855962 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,9 @@ option(BUILD_DOXYGEN_DOCS "Enables building the VkCV doxygen documentation" OFF)
 option(BUILD_SHARED "Enables building VkCV as shared libraries" OFF)
 option(BUILD_VMA_VULKAN_VERSION "Enforce a specific Vulkan version for VMA" OFF)
 
+# uncomment the following line if cmake will refuse to build projects
+#set(BUILD_PROJECTS ON)
+
 if ((WIN32) AND (NOT BUILD_VMA_VULKAN_VERSION))
 	set(BUILD_VMA_VULKAN_VERSION "1.3.0")
 endif()
diff --git a/scripts/generate.sh b/scripts/generate.sh
index cf9ff2d607217890b6fd0586e1dddece962d59b9..23e5b0ee54589ebfacbb08942ec9a5018d8704fa 100755
--- a/scripts/generate.sh
+++ b/scripts/generate.sh
@@ -1,5 +1,11 @@
 #!/bin/sh
-CMAKE_PROJECT_DIR="$(pwd)"
+if [ $# -gt 0 ]; then
+  CMAKE_PROJECT_DIR="$(realpath "$1")"
+  mkdir -p $CMAKE_PROJECT_DIR
+else
+  CMAKE_PROJECT_DIR="$(pwd)"
+fi
+
 CMAKE_PROJECT_NAME="$(basename "$CMAKE_PROJECT_DIR")"
 
 # Navigate to the main directory of the cloned repository
@@ -8,6 +14,12 @@ cd ..
 
 CMAKE_FRAMEWORK_DIR="$(realpath -s --relative-to="$CMAKE_PROJECT_DIR" "$(pwd)")"
 
+if [ "$CMAKE_FRAMEWORK_DIR" == "../.." ]; then
+  IS_INTERNAL_PROJECT=true
+else
+  IS_INTERNAL_PROJECT=false
+fi
+
 # Navigate back to the project directory
 cd "$CMAKE_PROJECT_DIR" || exit
 
@@ -21,16 +33,26 @@ generate_cmake_lists() {
   echo "set(CMAKE_CXX_STANDARD 20)"
   echo "set(CMAKE_CXX_STANDARD_REQUIRED ON)"
   echo
-  echo "set(BUILD_MODULES ON CACHE INTERNAL \"\")"
-  echo "set(BUILD_PROJECTS OFF CACHE INTERNAL \"\")"
-  echo "set(BUILD_DOXYGEN_DOCS OFF CACHE INTERNAL \"\")"
-  echo "set(BUILD_SHARED OFF CACHE INTERNAL \"\")"
-  echo "add_subdirectory($CMAKE_FRAMEWORK_DIR)"
-  echo
+
+  if test "$IS_INTERNAL_PROJECT" = false; then
+    echo "set(BUILD_MODULES ON CACHE INTERNAL \"\")"
+    echo "set(BUILD_PROJECTS OFF CACHE INTERNAL \"\")"
+    echo "set(BUILD_DOXYGEN_DOCS OFF CACHE INTERNAL \"\")"
+    echo "set(BUILD_SHARED OFF CACHE INTERNAL \"\")"
+    echo "add_subdirectory($CMAKE_FRAMEWORK_DIR)"
+    echo
+  fi
+  
   echo "add_executable($CMAKE_PROJECT_NAME src/main.cpp)"
   echo
-  echo "target_include_directories($CMAKE_PROJECT_NAME SYSTEM BEFORE PRIVATE \${vkcv_includes})"
-  echo "target_link_libraries($CMAKE_PROJECT_NAME \${vkcv_libraries})"
+
+  if test "$IS_INTERNAL_PROJECT" = true; then
+    echo "target_include_directories($CMAKE_PROJECT_NAME SYSTEM BEFORE PRIVATE \${vkcv_include} \${vkcv_includes})"
+    echo "target_link_libraries($CMAKE_PROJECT_NAME vkcv \${vkcv_libraries})"
+  else
+    echo "target_include_directories($CMAKE_PROJECT_NAME SYSTEM BEFORE PRIVATE \${vkcv_includes})"
+    echo "target_link_libraries($CMAKE_PROJECT_NAME \${vkcv_libraries})"
+  fi
 }
 
 generate_main_cpp() {
@@ -44,7 +66,12 @@ generate_main_cpp() {
   echo "    { VK_KHR_SWAPCHAIN_EXTENSION_NAME }"
   echo "  );"
   echo "  "
-  echo "  vkcv::WindowHandle windowHandle = core.createWindow(\"$CMAKE_PROJECT_NAME\", 800, 600, true);"
+  echo "  vkcv::WindowHandle windowHandle = core.createWindow("
+  echo "    \"$CMAKE_PROJECT_NAME\","
+  echo "    800,"
+  echo "    600,"
+  echo "    true"
+  echo "  );"
   echo "  "
   echo "  while (vkcv::Window::hasOpenWindow()) {"
   echo "    vkcv::Window::pollEvents();"