Repository: NREL/OpenStudio (language: python)

Issue:
Release v3.8.0 Tasks
The purpose is this issue is to document tasks that need to be done in order to reach a 3.8.0 release. There is a separate [issue](https://github.com/NREL/OpenStudio/issues/5102) that is related to the quality control steps involved in the 3.8.0 release, but the items listed here need to be addressed before we are ready to move through the QC motions. There is also [another issue](https://github.com/NREL/OpenStudio/issues/5082) to iron out the big tasks, but this issue is more specific.

This is in the approximate order of operations. Please add known tasks here.

- [x] Confirm that Ruby 3.2.2 is the correct target. @DavidGoldwasser would you be able to help get confirmation from SketchUp that they will release against the 3.2.2 version of Ruby? It will be painful if we do a Ruby update and that ends up being the wrong version.
- [x]  @kbenne Document obscure changes to loading the embedded Ruby gems. @kbenne, specifically [this](https://github.com/NREL/OpenStudio/commit/0fbb223bb9def421962ea1607fcbc5745b88e554#r140311044) commit comment has information that would be good to put into a code comment. This is an obscure but important change that we are bound to forget.
- [x] @kbenne consolidate Ruby gem loading code, or bring [this]((https://github.com/NREL/OpenStudio/commit/0fbb223bb9def421962ea1607fcbc5745b88e554#r140311044) ) change over to the classic cli implementation.
- [x] @kbenne, @jmarrec, and @joseph-robertson  Merge all of the branches going into the release into the [develop](https://github.com/NREL/OpenStudio/tree/develop) branch. This includes the [ruby/3.2.2]()https://github.com/NREL/OpenStudio/tree/ruby/3.2.2 branch. When we merge Ruby 3.2.2 to develop the CI will break and we will be flying blind for a period of time.
- [x] #5152
- [x] @wenyikuang Establish [openstudio-gems](https://github.com/NREL/openstudio-gems) CI for Ruby 3.2.2. Currently @jmarrec is using GitHub actions to do this on his personal fork.
- [x] @wenyikuang Fix the CI for the develop branch. This will require updating to conan2 and and Ruby 3.2.2 (assuming that ends up being the correct target)
- [x] @jmarrec Consolidate notes on building with conan2. We have https://github.com/NREL/OpenStudio/blob/ruby/3.2.2/BUILDING.md#building-with-conan-v2 and also some (probably stale) notes in the Wiki https://github.com/NREL/OpenStudio/wiki#building-openstudio.
- [x] @kbenne and @jmarrec Remove stale conan related build code that is no longer used in conan2 world. Specifically https://github.com/NREL/OpenStudio/blob/ruby/3.2.2/ConanInstall.cmake, but there could be other stuff.
- [ ] @kbenne integrate the latest openstudio-standards release from @mdahlhausen, however we plan to generate our first RC with the current version of standards, while we wait for the final openstudio-standards release.
- [x] ~~@DavidGoldwasser Review and update Ruby version requirement in assorted gemspec files.~~ (This one is superceded by the more detailed checklist in the more [recent comment](https://github.com/NREL/OpenStudio/issues/5136#issuecomment-2061074061))
     * https://github.com/NREL/OpenStudio-measure-tester-gem/blob/develop/openstudio_measure_tester.gemspec#L30
     * https://github.com/NREL/openstudio-extension-gem/blob/v0.8.0-rc1/openstudio-extension.gemspec#L29
     * https://github.com/NREL/openstudio-standards/blob/master/openstudio-standards.gemspec#L15
     * https://github.com/NREL/OpenStudio-workflow-gem/blob/develop/openstudio-workflow.gemspec#L19


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 8808334fecb..ed2f730c382 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,5 @@ htmlcov/
 coverage.xml
 .pytest_cache/
 junit.xml
+
+CMakeUserPresets.json
diff --git a/BUILDING.md b/BUILDING.md
new file mode 100644
index 00000000000..15b0ca86bf8
--- /dev/null
+++ b/BUILDING.md
@@ -0,0 +1,39 @@
+# Building with conan v2
+
+Check you have conan v2, and add the nrel-v2 remote to grab ruby and swig/4.1.1
+
+```shell
+conan --version
+conan remote add -f nrel-v2 http://conan.openstudio.net/artifactory/api/conan/conan-v2
+```
+
+
+```shell
+conan install . --output-folder=../OS-build-release-v2 --build=missing -c tools.cmake.cmaketoolchain:generator=Ninja -s compiler.cppstd=20 -s build_type=Release
+cd ../OS-build-release-v2
+. ./conanbuild.sh
+
+# Run cmake, but do pass the CMAKE_TOOLCHAIN_FILE
+#/OS-build-release-v2 %
+cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE:STRING=Release \
+  -DBUILD_TESTING:BOOL=ON -DCPACK_BINARY_TGZ:BOOL=ON -DCPACK_BINARY_DEB:BOOL=ON \
+  -DCPACK_BINARY_IFW:BOOL=OFF -DCPACK_BINARY_NSIS:BOOL=OFF -DCPACK_BINARY_RPM:BOOL=OFF -DCPACK_BINARY_STGZ:BOOL=OFF \
+  -DCPACK_BINARY_TBZ2:BOOL=OFF -DCPACK_BINARY_TXZ:BOOL=OFF -DCPACK_BINARY_TZ:BOOL=OFF \
+  -DBUILD_PYTHON_BINDINGS:BOOL=ON -DBUILD_PYTHON_PIP_PACKAGE:BOOL=ON \
+  -DPYTHON_VERSION=3.8.13 -DPython_ROOT_DIR:PATH=/home/julien/.pyenv/versions/3.8.13/  \
+  -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON \
+  ../OpenStudio
+
+# You can deactivate now if you want
+. ./deactivate_conanbuild.sh
+```
+
+Note that is also makes cmake presets, at root of OpenStudio, you can also try `cmake --list-presets`. To configure `cmake --preset conan-release`; to build `cmake --build --preset conan-release`.
+
+
+If you want to update a dependency in the conan.lock, just delete the line, and use this:
+
+
+```shell
+conan install . --output-folder=../OS-build-release-v2 --build=missing -c tools.cmake.cmaketoolchain:generator=Ninja -s compiler.cppstd=20 -s build_type=Release --lockfile-partial --lockfile-out=conan.lock
+```
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d3783b99925..7336abc1043 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -427,20 +427,34 @@ endif()
 ###############################################################################
 # Conan
 
-# Note JM 2019-04-24: Another option is to globally set "print_run_commands = True" in ~/.conan/conan.conf
-option(CONAN_PRINT_RUN_COMMANDS "Log every conan self.run command" OFF)
-mark_as_advanced(CONAN_PRINT_RUN_COMMANDS)
-if(CONAN_PRINT_RUN_COMMANDS)
-  set(ENV{CONAN_PRINT_RUN_COMMANDS} "1")
-  message(STATUS "Setting CONAN_PRINT_RUN_COMMANDS: $ENV{CONAN_PRINT_RUN_COMMANDS}")
-else()
-  unset(ENV{CONAN_PRINT_RUN_COMMANDS})
-  message(STATUS "CONAN_PRINT_RUN_COMMANDS: $ENV{CONAN_PRINT_RUN_COMMANDS}")
+if(BUILD_RUBY_BINDINGS)
+  find_package(Ruby)
+  message("Ruby_INCLUDE_DIRS=${Ruby_INCLUDE_DIRS}")
+endif()
+find_package(pugixml)
+find_package(LibXslt)
+find_package(libxml2)
+find_package(jsoncpp)
+find_package(fmt)
+find_package(SQLite3)
+find_package(cpprestsdk)
+find_package(websocketpp)
+find_package(Boost)
+find_package(geographiclib)
+find_package(SWIG 4.1.1 EXACT REQUIRED CONFIG)
+message("SWIG_EXECUTABLE=${SWIG_EXECUTABLE}")
+message("SWIG_DIR=${SWIG_DIR}")
+find_package(TinyGLTF)
+find_package(CLI11)
+find_package(minizip)
+find_package(OpenSSL)
+find_package(ZLIB)
+if(BUILD_TESTING)
+  find_package(GTest)
+endif()
+if(BUILD_BENCHMARK)
+  find_package(benchmark)
 endif()
-
-# Attempt to run, it'll do the right thing if the calling cmake script already ran it
-set(CONAN_INSTALL_FILE "${PROJECT_SOURCE_DIR}/ConanInstall.cmake")
-include("${CONAN_INSTALL_FILE}")
 
 # A macro to find a conan related value especially when using multi-config builds (MSVC)
 # But it also works with single-config builds
@@ -457,13 +471,9 @@ endmacro()
 
 ###############################################################################
 
-if(BUILD_RUBY_BINDINGS)
-  get_target_property(RUBY_INCLUDE_DIRS CONAN_PKG::openstudio_ruby INTERFACE_INCLUDE_DIRECTORIES)
-endif()
-
 # Export to Parent
 if(hasParent)
-  set(RUBY_INCLUDE_DIRS "${RUBY_INCLUDE_DIRS}" PARENT_SCOPE)
+  set(Ruby_INCLUDE_DIRS "${Ruby_INCLUDE_DIRS}" PARENT_SCOPE)
 endif()
 
 ###############################################################################
@@ -741,7 +751,7 @@ else()
 endif()
 
 # Find EnergyPlus, which will set the ENERGYPLUS_XXX variables and cache them
-find_package(EnergyPlus "${ENERGYPLUS_VERSION}" REQUIRED)
+find_package(EnergyPlus "${ENERGYPLUS_VERSION}" REQUIRED MODULE)
 get_filename_component(ENERGYPLUS_DIR "${ENERGYPLUS_EXE}" DIRECTORY)
 
 # Radiance
@@ -824,6 +834,9 @@ if(BUILD_CLI)
 
   set(OPENSTUDIO_GEMS_BASEURL "http://openstudio-resources.s3.amazonaws.com/dependencies")
 
+  # TODO: temp
+  set(OPENSTUDIO_GEMS_BASEURL "https://github.com/jmarrec/openstudio-gems/releases/download/v3.2.2-3")
+
   # To use the package produced by a PR to https://github.com/NREL/openstudio-gems
   set(USE_OPENSTUDIO_GEMS_PR FALSE)
   if (USE_OPENSTUDIO_GEMS_PR)
@@ -834,19 +847,19 @@ if(BUILD_CLI)
   if(UNIX)
      if(APPLE)
        if (ARCH MATCHES arm64)
-         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20231102-darwin_arm64.tar.gz")
-         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "d4c8d521f7bcb27248046b3023a9d835")
+         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20240214-darwin_arm64-3.2.2.tar.gz")
+         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "1572d65fd0e0d383320fb280abb2a873")
        else()
-         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20231102-darwin.tar.gz")
-         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "dbcc97ba8d86ec602fba9df2d52bf5d0")
+         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20240214-darwin-3.2.2.tar.gz")
+         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "e8af80ce8468c5c5c55c3a006377568b")
        endif()
      else()
        if (ARCH MATCHES "arm64")
-         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20231102-linux_arm64.tar.gz")
-         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "0628a7304d82540b24e2be3583e27a57")
+         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20240214-linux_arm64-3.2.2.tar.gz")
+         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "TDB")
        else()
-         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20231102-linux.tar.gz")
-         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "cfa0c61a158ee0404a3c37d24a0a2af0")
+         set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20240214-linux-3.2.2.tar.gz")
+         set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "b4e50ae9b09e8935c6882fb9cfb95847")
        endif()
        if (USE_OPENSTUDIO_GEMS_PR)
          set(OPENSTUDIO_GEMS_BASEURL "${OPENSTUDIO_GEMS_BASEURL}/openstudio-gems-linux/${OPENSTUDIO_GEMS_PR_NUMBER}")
@@ -854,8 +867,8 @@ if(BUILD_CLI)
      endif()
   elseif(WIN32)
     # OpenStudio gems are only supported on 64 bit windows
-    set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20231102-windows.tar.gz")
-    set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "e94254443a04d6d5b4d0b9dab499816e")
+    set(OPENSTUDIO_GEMS_ZIP_FILENAME "openstudio3-gems-20240214-windows-3.2.2.tar.gz")
+    set(OPENSTUDIO_GEMS_ZIP_EXPECTED_MD5 "3f3cff39bd6ef6f3ba268fcf07565a66")
     if (USE_OPENSTUDIO_GEMS_PR)
       set(OPENSTUDIO_GEMS_BASEURL "${OPENSTUDIO_GEMS_BASEURL}/openstudio-gems-windows/${OPENSTUDIO_GEMS_PR_NUMBER}")
     endif()
@@ -915,7 +928,7 @@ endif()
 # Plus, it doesn't appear to work on windows either, the PATH doesn't include it.
 #find_program(SWIG_EXECUTABLE swig PATHS CURRENT_CONAN_SWIG_ROOT NO_DEFAULT_PATH)
 #if(NOT SWIG_EXECUTABLE)
-#  message(FATAL_ERROR "Couldn't find swig, which shouldn't happen. CONAN_BIN_DIRS_SWIG_INSTALLER=${CONAN_BIN_DIRS_SWIG_INSTALLER}, CONAN_SWIG_ROOT_RELEASE=${CONAN_SWIG_ROOT_RELEASE}, CURRENT_CONAN_SWIG_ROOT=${CURRENT_CONAN_SWIG_ROOT}, ${ENV{SWIG_LIB}}, ${ENV{SWIG_INSTALLER_ROOT}}")
+#  message(FATAL_ERROR "Couldn't find swig, which shouldn't happen. CONAN_BIN_DIRS_SWIG_INSTALLER=${CONAN_BIN_DIRS_SWIG_INSTALLER}, CONAN_SWIG_ROOT_RELEASE=${CONAN_SWIG_ROOT_RELEASE}, CURRENT_CONAN_SWIG_ROOT=${CURRENT_CONAN_SWIG_ROOT}, ${ENV{SWIG_DIR}}, ${ENV{SWIG_INSTALLER_ROOT}}")
 #endif()
 
 # Another thing I tried is to use the `virtualenv` generator (`conan_cmake_run( ... GENERATORS virtualenv)`),
@@ -924,17 +937,17 @@ endif()
 # I also tried using CMake to extract the value from the activate.sh script on all plaftorms but it seems even more of a hack
 
 # So instead, we use a generator expression to find the right value. At least it makes sense, and should be robust.
-FindValue(CONAN_SWIG_ROOT)
+FindValue(swig_PACKAGE_FOLDER)
 
-set(SWIG_EXECUTABLE "${CURRENT_CONAN_SWIG_ROOT}/bin/swig")
+# set(SWIG_EXECUTABLE "${CURRENT_swig_PACKAGE_FOLDER}/bin/swig")
 
 # The conan-provided binary has a built-in swiglib (`swig -swiglib`) that points to the build box on which it was built, which is problematic for us.
-set(SWIG_LIB "${CURRENT_CONAN_SWIG_ROOT}/bin/swiglib")
+# set(SWIG_DIR "${CURRENT_swig_PACKAGE_FOLDER}/bin/swiglib")
 
 # Export SWIG to parent scope
 if(hasParent)
   set(SWIG_EXECUTABLE "${SWIG_EXECUTABLE}" PARENT_SCOPE)
-  set(SWIG_LIB "${SWIG_LIB}" PARENT_SCOPE)
+  set(SWIG_DIR "${SWIG_DIR}" PARENT_SCOPE)
 endif()
 
 set(ALL_RUBY_BINDING_TARGETS "") # global list
diff --git a/ConanInstall.cmake b/ConanInstall.cmake
deleted file mode 100644
index b2dfdf16a94..00000000000
--- a/ConanInstall.cmake
+++ /dev/null
@@ -1,227 +0,0 @@
-# This file lists and installs the Conan packages needed
-
-# TODO: DO NOT DO `set(CONAN_OPTIONS "")` since some higher level stuff is added via OpenStudioApplication
-# CONAN_QT is added by OpenStudioApplication
-
-if(NOT CONAN_OPENSTUDIO_ALREADY_RUN)
-
-  set(CMAKE_CONAN_EXPECTED_HASH
-      5cdb3042632da3efff558924eecefd580a0e786863a857ca097c3d1d43df5dcd)
-  set(CMAKE_CONAN_VERSION "0.18.1")
-
-  if(EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
-    file(SHA256 "${CMAKE_BINARY_DIR}/conan.cmake" CMAKE_CONAN_HASH)
-  elseif(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake"
-         OR NOT "${CMAKE_CONAN_HASH}" MATCHES "${CMAKE_CONAN_EXPECTED_HASH}")
-    # Put it in CMAKE_BINARY_DIR so we don't end up with two when building OpenStudioApplication
-    message(
-      STATUS
-        "openstudio: Downloading conan.cmake ${CMAKE_CONAN_VERSION} from https://github.com/conan-io/cmake-conan"
-    )
-    file(
-      DOWNLOAD
-      "https://raw.githubusercontent.com/conan-io/cmake-conan/${CMAKE_CONAN_VERSION}/conan.cmake"
-      "${CMAKE_BINARY_DIR}/conan.cmake"
-      EXPECTED_HASH SHA256=${CMAKE_CONAN_EXPECTED_HASH}
-      TLS_VERIFY ON)
-  else()
-    message(STATUS "openstudio: using existing conan.cmake")
-  endif()
-
-  include(${CMAKE_BINARY_DIR}/conan.cmake)
-
-  conan_check(VERSION 1.53.0 REQUIRED)
-
-  message(STATUS "openstudio: RUNNING CONAN")
-
-  # Add NREL remote and place it first in line, since we vendored dependencies to NREL's repo, they will be picked first
-  # TJC 2021-04-27 bintray.com is decommissioned as of 2021-05-01. See commercialbuildings as replacement below.
-  if(LSB_RELEASE_ID_SHORT MATCHES "CentOS")
-    # Use this specific remote where I uploaded the centos-build packages
-    # The os is still Linux, the compiler is still GCC. But the GLIBC used is **way older**
-    conan_add_remote(NAME openstudio-centos INDEX 0
-      URL https://conan.openstudio.net/artifactory/api/conan/openstudio-centos)
-
-    # Pass `-D_GLIBCXX_USE_CXX11_ABI=0` to make sure it detects libstdc++ and not libstdc++1
-    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
-    # Centos uses a different channel recipe for ruby
-    if(BUILD_RUBY_BINDINGS OR BUILD_CLI)
-      # Track NREL/stable in general, on a feature branch this could be temporarily switched to NREL/testing
-      set(CONAN_RUBY "openstudio_ruby/2.7.2@nrel/centos#ae043c41b4bec82e98ca765ce8b32a11")
-    endif()
-
-  else()
-    conan_add_remote(NAME nrel INDEX 0
-      URL https://conan.openstudio.net/artifactory/api/conan/openstudio)
-
-    if(BUILD_RUBY_BINDINGS OR BUILD_CLI)
-      # Track NREL/stable in general, on a feature branch this could be temporarily switched to NREL/testing
-      # TODO: temp, revert to stable soon
-      set(CONAN_RUBY "openstudio_ruby/2.7.2@nrel/testing#d66e3b66568b13acf3b16d866bec68d0")
-     endif()
-  endif()
-
-  # conan_add_remote(
-  #   NAME bincrafters URL
-  #   https://bincrafters.jfrog.io/artifactory/api/conan/public-conan)
-
-  # Enable revisions in conan: check if they are already enabled, if not do it and warn user
-  execute_process(
-    COMMAND ${CONAN_CMD} config get general.revisions_enabled
-    OUTPUT_VARIABLE CONAN_REV_STATUS
-    ERROR_VARIABLE CONAN_REV_STATUS
-    OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-  message(
-    STATUS "Conan: config get general.revisions_enabled=${CONAN_REV_STATUS}")
-  if(NOT "${CONAN_REV_STATUS}" STREQUAL "True")
-    message(
-      AUTHOR_WARNING
-        "Conan: Force enabling revisions (conan config set general.revisions_enabled=True)"
-    )
-    execute_process(COMMAND ${CONAN_CMD} config set
-                            general.revisions_enabled=True)
-  endif()
-
-  # TODO:  list(APPEND CONAN_OPTIONS "fmt:header_only=True")
-
-  if(APPLE)
-    # #4120 - global is the 'default' visibility in gcc/clang
-    list(APPEND CONAN_OPTIONS "boost:visibility=global")
-  endif()
-
-  # You do want to rebuild packages if there's a newer recipe in the remote (which applies mostly to our own openstudio_ruby where we don't
-  # bump the actual package version when we make changes) than the binaries were built with
-  # 'outdated' also acts like 'missing': if no binary, will build them.
-  # list(APPEND CONAN_BUILD "outdated")
-  list(APPEND CONAN_BUILD "missing")
-
-  if(BUILD_TESTING)
-    set(CONAN_GTEST "gtest/1.11.0#8aca975046f1b60c660ee9d066764d69")
-  else()
-    set(CONAN_GTEST "")
-  endif()
-
-
-  # Build ALL dependencies to avoid problems with the way too old CentOS GLIBC
-  # Please read: `developer/conan/binary_incompatility_glibc.md`
-  if(DEFINED CONAN_FIRST_TIME_BUILD_ALL)
-    if(CONAN_FIRST_TIME_BUILD_ALL)
-      message("FIRST TIME: FORCE BUILDING ALL CONAN PACKAGES")
-      # TODO: Try to avoid rebuilding everything...?
-      set(CONAN_BUILD "all") # This works, but it's gonna be sloooowww
-      # if(LSB_RELEASE_ID_SHORT MATCHES "Ubuntu" AND LSB_RELEASE_VERSION_SHORT MATCHES "18.04")
-      #   # build only the ones that are problematic
-      #   # boost: undefined reference to statx
-      #   list(APPEND CONAN_BUILD "boost")
-      #   # This isn't enough for Ubuntu 18.04, I also get another issue: undefined reference to fnctl64 (fnctl -> fnclt64 happened in GLIBC 2.28) when linking libopenstudio.lib
-      #   # but I do not know which package it's coming from
-      # endif()
-      # Force switch it off for the next time
-      set(CONAN_FIRST_TIME_BUILD_ALL OFF  CACHE BOOL OFF FORCE)
-    endif()
-  endif()
-  message("CONAN_BUILD=${CONAN_BUILD}")
-
-  if(BUILD_BENCHMARK)
-    set(CONAN_BENCHMARK "benchmark/1.6.1#94c40ebf065e3b20cab6a4f1b03a65fe")
-  endif()
-
-  # msys2/cci.latest is not supported on win32. We don't expect to run it on something else than an x86_64 anyways
-  if(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bit
-    set(CONAN_FORCE_SETTINGS_BUILD SETTINGS_BUILD arch=x86_64)
-    message(AUTHOR_WARNING "Forcing --settings:build arch=x86_64")
-    if(NOT WIN32)
-      message(AUTHOR_WARNING "You are trying to build on x86 on a non-windows, this is completely untested and unsupported")
-    endif()
-  endif()
-
-  set(CONAN_UPDATE "UPDATE")
-
-  if(CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
-    set(CONAN_CMAKE_MULTI ON)
-    if (NOT CONAN_CONFIGURATION_TYPES)
-      # Cache it, and let user change it (if they want to pull RelWithDebInfo for eg)
-      set(CONAN_CONFIGURATION_TYPES "Release;Debug" CACHE STRING "List of configurations for which you want to fetch conan packages")
-      mark_as_advanced(CONAN_CONFIGURATION_TYPES)
-    endif()
-    message(STATUS "Conan: Using cmake_multi generator")
-    set(CONAN_GENERATOR "cmake_multi")
-  else()
-    message(STATUS "Conan: Using cmake generator")
-    set(CONAN_CMAKE_MULTI OFF)
-    set(CONAN_GENERATOR "cmake")
-    if (NOT CONAN_CONFIGURATION_TYPES)
-      set(CONAN_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE})
-    endif()
-  endif()
-
-
-  message(STATUS "Conan: conan_cmake_configure")
-  # This will create the conanfile.txt
-  conan_cmake_configure(
-    REQUIRES
-    ${CONAN_READLINE}
-    ${CONAN_QT}
-    ${CONAN_RUBY}
-    "openssl/1.1.1o#213dbdeb846a4b40b4dec36cf2e673d7" # force every package to align on the same as our conan-openstudio-ruby
-    "boost/1.79.0#f664bfe40e2245fa9baf1c742591d582"
-    "pugixml/1.12.1#5a39f82651eba3e7d6197903a3202e21"
-    "libxml2/2.9.14#fc433aeebfe525657d73334c61f96944"
-    "libxslt/1.1.34#9085031f5b9b2bb328ad615cd1bf1282"
-    "jsoncpp/1.9.5#536d080aa154e5853332339bf576747c"
-    "minizip/1.2.12#0b5296887a2558500d0323c6c94c8d02" # This depends on zlib, and basically patches it
-    "zlib/1.2.12#3b9e037ae1c615d045a06c67d88491ae" # Also needed, so we can find zlib.h and co (+ pinning exactly is good)
-    "fmt/9.1.0#811e918ca4b4e0b9ddd6d5a2883efa82"
-    "sqlite3/3.38.5#010911927ce1889b5cf824f45e7cd3d2"
-    "cpprestsdk/2.10.18#df2f6ac88e47cadd9c9e8e0971e00d89"
-    "websocketpp/0.8.2#3fd704c4c5388d9c08b11af86f79f616"
-    "geographiclib/1.52#76536a9315a003ef3511919310b2fe37"
-    "swig/4.1.0#f4419c5ab88f877272cbaa36dd0237ff"
-    "tinygltf/2.5.0#c8b2aca9505e86312bb42aa0e1c639ec"
-    "cli11/2.3.2#8ccdf14fb1ad53532d498c16ae580b4b"
-    ${CONAN_GTEST}
-    ${CONAN_BENCHMARK}
-    # Override to avoid dependency mismatches
-    #"bzip2/1.0.8#d4a5c7144832d75fc3f349c5346160b0"
-    #"libyaml/0.2.5#9e234874df88c3ba7249f6d1368fceaf"
-    GENERATORS ${CONAN_GENERATOR}
-  )
-
-  foreach(build_type ${CONAN_CONFIGURATION_TYPES})
-    conan_cmake_autodetect(settings BUILD_TYPE ${build_type})
-    message(STATUS "Conan: Autodetected settings for build type ${build_type}: ${settings}")
-
-    # Avoid polluting with cppstd which prevents downloading some existing binary packages (like boost)
-    # Former deprecated conan_cmake_run was NOT adding compiler.cppstd
-    foreach(ARG ${settings})
-      if(${ARG} MATCHES "compiler.cppstd=(.*)")
-        message("Removing ${ARG}")
-        list(REMOVE_ITEM settings ${ARG})
-      endif()
-    endforeach()
-
-    conan_cmake_install(PATH_OR_REFERENCE .
-      BUILD ${CONAN_BUILD}
-      OPTIONS ${CONAN_OPTIONS}
-      SETTINGS ${settings}
-      ${CONAN_FORCE_SETTINGS_BUILD}
-      ${CONAN_UPDATE}
-    )
-  endforeach()
-
-  # Loads the conanbuildinfo.cmake / conanbuildinfo_multi.cmake
-  conan_load_buildinfo()
-  # conan_basic_setup in the conanbuildinfo.cmake. TARGETS => set cmake targets, NO_OUTPUT_DIRS => Don't modify the BIN / LIB folders etc
-  conan_basic_setup(TARGETS NO_OUTPUT_DIRS KEEP_RPATHS)
-
-  set(CONAN_OPENSTUDIO_ALREADY_RUN TRUE)
-
-  #message("CONAN_TARGETS = ${CONAN_TARGETS}")
-  message(STATUS "openstudio: DONE RUNNING CONAN")
-
-else()
-
-  message(STATUS "openstudio: CONAN RUN BY CALLING SCRIPT")
-
-endif()
diff --git a/FetchRubyMinGW.cmake b/FetchRubyMinGW.cmake
index b2bfced526d..0ceb5f908fa 100644
--- a/FetchRubyMinGW.cmake
+++ b/FetchRubyMinGW.cmake
@@ -1,4 +1,3 @@
-
 macro(FetchRubyMinGW)
   # Mingw based ruby lib (only the dll stub library) from Ruby Installer
   # We need this for stand alone ruby bindings
@@ -6,8 +5,8 @@ macro(FetchRubyMinGW)
   # Only need this on Windows systems
   if(WIN32)
     if(NOT EXISTS ${RUBY_MINGW_LIB_DIR})
-      set(RUBY_MINGW_LIB_ZIP_FILENAME "Ruby270-mingw-install.tar.gz")
-      set(RUBY_MINGW_LIB_ZIP_EXPECTED_MD5 "c9fd6232f49ae6031b914ac1e59229ec")
+      set(RUBY_MINGW_LIB_ZIP_FILENAME "Ruby322-mingw-install.tar.gz")
+      set(RUBY_MINGW_LIB_ZIP_EXPECTED_MD5 "34583cb818feff74ac50b3c140825694")
 
       set(RUBY_MINGW_LIB_ZIP_LOCAL_PATH "${PROJECT_BINARY_DIR}/${RUBY_MINGW_LIB_ZIP_FILENAME}")
       if(EXISTS "${RUBY_MINGW_LIB_ZIP_LOCAL_PATH}")
@@ -24,8 +23,9 @@ macro(FetchRubyMinGW)
 
         execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${RUBY_MINGW_LIB_ZIP_LOCAL_PATH} WORKING_DIRECTORY "${PROJECT_BINARY_DIR}")
       endif()
-
-      set(RUBY_MINGW_STUB_LIB "${PROJECT_BINARY_DIR}/Ruby-mingw-install/libx64-msvcrt-ruby270.dll.a")
+      # TODO: I botched the tar.gz, it extracts to the root of the project_binary dir
+      set(RUBY_MINGW_STUB_LIB "${PROJECT_BINARY_DIR}/libx64-ucrt-ruby320.dll.a")
+      # set(RUBY_MINGW_STUB_LIB "${PROJECT_BINARY_DIR}/Ruby-mingw-install/libx64-ucrt-ruby320.dll.a")
     endif()
   endif()
 endmacro()
diff --git a/ProjectMacros.cmake b/ProjectMacros.cmake
index b02c5f25969..cf944fa06a2 100644
--- a/ProjectMacros.cmake
+++ b/ProjectMacros.cmake
@@ -28,7 +28,7 @@ macro(CREATE_TEST_TARGETS BASE_NAME SRC DEPENDENCIES)
     set(ALL_DEPENDENCIES ${DEPENDENCIES})
 
     target_link_libraries(${BASE_NAME}_tests
-      CONAN_PKG::gtest
+      gtest::gtest
       ${ALL_DEPENDENCIES}
     )
 
@@ -225,7 +225,7 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
   if(BUILD_RUBY_BINDINGS)
     add_custom_command(
       OUTPUT "${SWIG_WRAPPER}"
-      COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+      COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
               "${SWIG_EXECUTABLE}"
               "-ruby" "-c++" "-fvirtual" "-I${PROJECT_SOURCE_DIR}/src" "-I${PROJECT_BINARY_DIR}/src" "${extra_includes}" "${extra_includes2}" ${RUBY_AUTODOC}
               -module "${MODULE}" -initname "${LOWER_NAME}"
@@ -280,8 +280,8 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
     set_target_properties(${swig_target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/ruby/")
     set_target_properties(${swig_target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ruby/")
     target_link_libraries(${swig_target} ${${PARENT_TARGET}_depends})
-    target_include_directories(${swig_target} SYSTEM PRIVATE ${RUBY_INCLUDE_DIRS})
-    target_compile_definitions(${swig_target} PRIVATE SHARED_OS_LIBS)
+    target_include_directories(${swig_target} SYSTEM PRIVATE ${Ruby_INCLUDE_DIRS})
+    target_compile_definitions(${swig_target} PRIVATE SHARED_OS_LIBS PUBLIC -DRUBY_DONT_SUBST)
     add_dependencies(${swig_target} ${PARENT_TARGET})
 
     execute_process(COMMAND \"${CMAKE_COMMAND}\" -E copy \"\${resolved_item_var}\" \"\${CMAKE_INSTALL_PREFIX}/Ruby/openstudio/\")
@@ -332,7 +332,7 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
 
     add_custom_command(
       OUTPUT "${SWIG_WRAPPER_FULL_PATH}" "${PYTHON_GENERATED_SRC}"
-      COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+      COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
               "${SWIG_EXECUTABLE}"
               "-python" ${SWIG_PYTHON_3_FLAGS} "-c++" ${PYTHON_AUTODOC}
               -outdir ${PYTHON_GENERATED_SRC_DIR} "-I${PROJECT_SOURCE_DIR}/src" "-I${PROJECT_BINARY_DIR}/src"
@@ -609,7 +609,7 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
       OUTPUT ${SWIG_WRAPPER_FULL_PATH}
       COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CSHARP_GENERATED_SRC_DIR}"
       COMMAND "${CMAKE_COMMAND}" -E make_directory "${CSHARP_GENERATED_SRC_DIR}"
-      COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+      COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
               "${SWIG_EXECUTABLE}"
               "-csharp" "-c++" -namespace ${NAMESPACE} ${CSHARP_AUTODOC}
               -outdir "${CSHARP_GENERATED_SRC_DIR}"  "-I${PROJECT_SOURCE_DIR}/src" "-I${PROJECT_BINARY_DIR}/src"
@@ -703,7 +703,7 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
       OUTPUT ${SWIG_WRAPPER}
       COMMAND "${CMAKE_COMMAND}" -E remove_directory "${JAVA_GENERATED_SRC_DIR}"
       COMMAND "${CMAKE_COMMAND}" -E make_directory "${JAVA_GENERATED_SRC_DIR}"
-      COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+      COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
               "${SWIG_EXECUTABLE}"
               "-java" "-c++"
               -package ${NAMESPACE}
@@ -829,7 +829,7 @@ macro(MAKE_SWIG_TARGET NAME SIMPLENAME KEY_I_FILE I_FILES PARENT_TARGET PARENT_S
 
     add_custom_command(
       OUTPUT ${SWIG_WRAPPER}
-      COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+      COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
               "${SWIG_EXECUTABLE}"
               "-javascript" ${SWIG_ENGINE} "-c++"
               #-namespace ${NAMESPACE}
diff --git a/conan.lock b/conan.lock
new file mode 100644
index 00000000000..1c7cad33361
--- /dev/null
+++ b/conan.lock
@@ -0,0 +1,60 @@
+{
+    "version": "0.5",
+    "requires": [
+        "zlib/1.3.1#af8f2ef3d8e0fddf1975281d7fe43bf6%1705999193.687",
+        "websocketpp/0.8.2#842a0419153a8aa52f3ea3a1da557d38%1695972005.713",
+        "tinygltf/2.5.0#65c28d0a4c3cbd4ef92b08b59df769da%1701621757.442",
+        "termcap/1.3.1#1986f84bf21dd07ea774b027a3201fcb%1678542508.75",
+        "swig/4.1.1#8f418438101ef7712d52a9fe739d32f9%1707838298.077707",
+        "stb/cci.20230920#9792498b81cf34a90138d239e36b0bf8%1700546289.605",
+        "sqlite3/3.38.5#4b875d4249cdfb4c1235e6b3ea6c18e7%1676251415.466",
+        "ruby/3.2.2#7a66613b28107b3318a6ff60701c1b6b%1707386606.655",
+        "readline/8.2#5618fbfed2466d9dc0fa8834faf06a6a%1702837438.071",
+        "pugixml/1.12.1#d0378a7e4e32d2d379c3a272269e4330%1691917297.122",
+        "pcre2/10.42#74a354d74d291503aadffe6453d976f5%1694473548.558",
+        "openssl/3.1.0#adb90207a855ebfe1f1caa88b39c4fe0%1696808387.085",
+        "nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d%1701220705.259",
+        "minizip/1.2.13#75d20b6a37ef70126334467f61acadde%1694478425.47",
+        "libyaml/0.2.5#67a8e4c752b3a452c4796ddc90589f74%1676469565.275",
+        "libxslt/1.1.37#8c0548495527cea12de08ad6212fc3ce%1703714812.414",
+        "libxml2/2.11.6#41c14895baba105865cb22ecaf948115%1703682489.517",
+        "libiconv/1.17#9d9082101394d053c67e95d3bc9f1e78%1701083487.832",
+        "libgettext/0.22#2c87563d7a69544dd9379f038aca3b0b%1692434363.136",
+        "libffi/3.4.4#35eb63842b505824b70aedc1baefc916%1682741110.044",
+        "libbacktrace/cci.20210118#ec1aa63bbc10145c6a299e68e711670c%1676205469.545",
+        "jsoncpp/1.9.5#9d91be1604af36ced56ae89ee65d53e0%1673844106.486",
+        "gtest/1.14.0#4372c5aed2b4018ed9f9da3e218d18b3%1691143988.385",
+        "gmp/6.3.0#df20ffb6d21c34d67704305bcd1dea9e%1698225617.026",
+        "geographiclib/1.52#924902501fa76987856594495c1d42bc%1698736427.151",
+        "fmt/9.1.0#551bb6d903fc22780392707fed0efb18%1704167365.696",
+        "cpprestsdk/2.10.19#889c41bf66e2838146eec76e3f22af8d%1701762308.51",
+        "cli11/2.3.2#1424b9b1d9e3682a7122f415b078b4d7%1689507488.926",
+        "bzip2/1.0.8#457c272f7da34cb9c67456dd217d36c4%1703591832.799",
+        "boost/1.79.0#d8a5b9e748e4152d6f489d7d87a1f129%1706000284.647",
+        "benchmark/1.8.3#2b95dcd66432d8ea28c5ac4db0be2fb2%1693521845.265"
+    ],
+    "build_requires": [
+        "yasm/1.3.0#fb800a15413dca19bfaef9e4b5d50694%1676208399.011",
+        "winflexbison/2.5.25#6b08309e90720974e49b4cf745242e64%1695252638.759",
+        "strawberryperl/5.32.1.1#8f83d05a60363a422f9033e52d106b47%1666134191.176",
+        "pkgconf/2.1.0#27f44583701117b571307cf5b5fe5605%1701537936.436",
+        "ninja/1.11.1#77587f8c8318662ac8e5a7867eb4be21%1684431244.21",
+        "nasm/2.15.05#058c93b2214a49ca1cfe9f8f26205568%1703550024.076",
+        "msys2/cci.latest#5a31efa2bde593541fd5ac3bcc50c01c%1699871190.424",
+        "meson/1.2.2#aace9dcc1db58fa42ecb5292f724092d%1695994576.349",
+        "m4/1.4.19#b38ced39a01e31fef5435bc634461fd2%1700758725.451",
+        "flex/2.6.4#e35bc44b3fcbcd661e0af0dc5b5b1ad4%1674818991.113",
+        "cmake/3.28.1#92f79424d7b65b12a84a2180866c3a78%1703679314.116",
+        "cccl/1.3#6c9fc62128a11c1805de5dff1a1a0639%1668808540.988",
+        "bison/3.8.2#ed1ba0c42d2ab7ab64fc3a62e9ecc673%1688556312.342",
+        "b2/4.10.1#1b290403d8648c79f468f5a6496f829a%1699871262.816",
+        "automake/1.16.5#058bda3e21c36c9aa8425daf3c1faf50%1688481772.751",
+        "autoconf/2.71#53be95d228b2dcb30dc199cb84262d8f%1693395343.513"
+    ],
+    "python_requires": [],
+    "overrides": {
+        "boost/1.83.0": [
+            "boost/1.79.0#d8a5b9e748e4152d6f489d7d87a1f129"
+        ]
+    }
+}
\ No newline at end of file
diff --git a/conanfile.py b/conanfile.py
new file mode 100644
index 00000000000..19d3d0cad1d
--- /dev/null
+++ b/conanfile.py
@@ -0,0 +1,49 @@
+from conan import ConanFile
+from conan.tools.apple import is_apple_os
+
+class CompressorRecipe(ConanFile):
+    settings = "os", "compiler", "build_type", "arch"
+    generators = "CMakeToolchain", "CMakeDeps"
+
+    options = {
+        "with_testing": [True, False],
+        "with_benchmark": [True, False],
+
+    }
+    default_options = {
+        "with_testing": True,
+        "with_benchmark": True,
+    }
+
+    def requirements(self):
+        self.requires("ruby/3.2.2")
+
+        if is_apple_os(self):
+            self.requires("boost/1.79.0", force=True, options={'visibility': 'global'})  #f664bfe40e2245fa9baf1c742591d582
+        else:
+            self.requires("boost/1.79.0", force=True)
+        self.requires("pugixml/1.12.1")  #5a39f82651eba3e7d6197903a3202e21
+        self.requires("libxml2/[<2.12.0]") # deprecated xmlSubstituteEntitiesDefault and co https://github.com/GNOME/libxml2/commit/db8b9722cb2a1f7dca7374ec38ecaa4936ab3869
+        self.requires("libxslt/1.1.37")  #9085031f5b9b2bb328ad615cd1bf1282
+        self.requires("jsoncpp/1.9.5")  #536d080aa154e5853332339bf576747c
+        self.requires("fmt/9.1.0")  #811e918ca4b4e0b9ddd6d5a2883efa82
+        self.requires("sqlite3/3.38.5")  #010911927ce1889b5cf824f45e7cd3d2
+        self.requires("cpprestsdk/2.10.19")  #df2f6ac88e47cadd9c9e8e0971e00d89
+        self.requires("websocketpp/0.8.2")  #3fd704c4c5388d9c08b11af86f79f616
+        self.requires("geographiclib/1.52")  #76536a9315a003ef3511919310b2fe37
+        self.requires("swig/4.1.1")  # Pending https://github.com/conan-io/conan-center-index/pull/19058
+        self.requires("tinygltf/2.5.0")  #c8b2aca9505e86312bb42aa0e1c639ec
+        self.requires("cli11/2.3.2")  #8ccdf14fb1ad53532d498c16ae580b4b
+
+        self.requires("minizip/1.2.13")  #0b5296887a2558500d0323c6c94c8d02 # This depends on zlib, and basically patches it
+        self.requires("zlib/[>=1.2.11 <2]")  #3b9e037ae1c615d045a06c67d88491ae # Also needed, so we can find zlib.h and co (+ pinning exactly is good)
+        self.requires("openssl/[>=3 <4]")
+
+        if self.options.with_testing:
+            self.requires("gtest/1.14.0")
+        if self.options.with_benchmark:
+            self.requires("benchmark/1.8.3")
+
+
+    #def build_requirements(self):
+    #    self.tool_requires("cmake/3.22.6")
diff --git a/embedded/CMakeLists.txt b/embedded/CMakeLists.txt
index 46ad3be9de4..bd97186c264 100644
--- a/embedded/CMakeLists.txt
+++ b/embedded/CMakeLists.txt
@@ -2,7 +2,7 @@ add_executable(CreateEmbeddedSource
   CreateEmbeddedSource.cpp
 )
 
-target_link_libraries(CreateEmbeddedSource CONAN_PKG::zlib)
+target_link_libraries(CreateEmbeddedSource ZLIB::ZLIB)
 
 # Add a specific manifest for CreateEmbeddedSource that will include the LongPathAware attribute, which,
 # in conjunction with the regkey LongPathsEnabled=1 will make it work with paths that are longer than MAX_PATH (win10 only)
diff --git a/embedded/EmbedFiles.cmake b/embedded/EmbedFiles.cmake
index 73273fb8f1c..4fed64f5b97 100644
--- a/embedded/EmbedFiles.cmake
+++ b/embedded/EmbedFiles.cmake
@@ -1,3 +1,58 @@
+#[=======================================================================[.rst:
+EmbedFiles
+----------
+
+This module defines functions to embed some files as binary into the executable.
+
+.. command:: embed_files
+
+  This is the command responsible for calling CreateEmbeddedSource::
+
+    embed_files(<FILES> <EMBEDDED_LOCATIONS> <CXX_OUTPUT_FILES>)
+
+  The required arguments:
+
+  ``FILES``
+    The list of file paths on disk to embed
+
+  ``EMBEDDED_LOCATIONS``
+    a indexed matched list of paths for each embedded file
+
+  ``CXX_OUTPUT_FILES``
+    a variable that will be set to a list of cxx files to compile executable or library
+
+.. command:: glob_for_file_exts_and_prepare_for_embedded
+
+  This is a helper that will glob recursively for specific file extensions in a base directory and return
+  two lists corresponding to ``FILES`` and ``EMBEDDED_LOCATION`` (a relative path with ``BASE_DIR`` as base)
+
+    glob_for_file_exts_and_prepare_for_embedded(
+      <BASE_DIR> <foundFiles> <foundEmbeddedPaths>
+      [VERBOSE]
+      EXTENSIONS <ext> [<ext>...]
+    )
+
+  The required arguments:
+
+  ``BASE_DIR``
+    The base directory on disk to search in
+
+  ``foundFiles``
+  Result variable for the disk files found that match the extensions requested
+
+  ``foundEmbeddedPaths``
+  Paths relative to the ``BASE_DIR``
+
+  ``EXTENSIONS``
+  a list of extensions to search for. At least one must be provided or it'll throw
+
+  The options are:
+
+  ``VERBOSE``
+  outputs a table with the number of files found for each extension requested
+#]=======================================================================]
+
+#------------------------------------------------------------------------------
 # FILES is a list of file paths to embed
 # EMBEDDED_LOCATIONS is a indexed matched list of paths for each embedded file
 # CXX_OUTPUT_FILES is a variable that will be set to a list of cxx files to compile executable or library
@@ -101,4 +156,69 @@ function(embed_files FILES EMBEDDED_LOCATIONS CXX_OUTPUT_FILES)
 
   set(${CXX_OUTPUT_FILES} ${EMBED_SOURCE_FILES} PARENT_SCOPE)
 endfunction()
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+function(glob_for_file_exts_and_prepare_for_embedded BASE_DIR foundFiles foundEmbeddedPaths)
+  set(prefix "")
+  set(valueLessKeywords VERBOSE)
+  set(singleValueKeywords "")
+  set(multiValueKeywords EXTENSIONS)
+
+  cmake_parse_arguments(
+    PARSE_ARGV 3 # Start at one with NAME is the first param
+      "${prefix}"
+      "${valueLessKeywords}"
+      "${singleValueKeywords}"
+      "${multiValueKeywords}"
+  )
+
+  if (_UNPARSED_ARGUMENTS)
+    message(FATAL_ERROR "Extra unknown arguments were passed: ${_UNPARSED_ARGUMENTS}")
+  endif()
+  if (_KEYWORDS_MISSING_VALUES)
+    message(FATAL_ERROR "Keywords missing values: ${_KEYWORDS_MISSING_VALUES}")
+  endif()
+  if (_VERBOSE)
+    message("Globbing in ${BASE_DIR}:")
+    message("| extension | nFound |")
+    message("| --------- | ------ |")
+  endif()
 
+  if (NOT _EXTENSIONS)
+    message(FATAL_ERROR "EXTENSIONS is required")
+  endif()
+  foreach(_ext ${_EXTENSIONS})
+    file(GLOB_RECURSE _found_files FOLLOW_SYMLINKS "${BASE_DIR}/**/*.${_ext}")
+    if (_VERBOSE)
+      list(LENGTH _found_files _nFound)
+      # message("- Found ${_nFound} files for extension ${_ext}")
+      string(LENGTH ${_ext} _extLength)
+      math(EXPR _spacing "9 - ${_extLength}")
+      string(REPEAT " " ${_spacing} _spaces)
+
+      string(LENGTH ${_nFound} _foundLength)
+      math(EXPR _spacing "6 - ${_foundLength}")
+      string(REPEAT " " ${_spacing} _spaces2)
+
+      message("| ${_ext}${_spaces} | ${_nFound}${_spaces2} |")
+    endif()
+    foreach(_file ${_found_files} )
+      file(RELATIVE_PATH LOCATION ${BASE_DIR} ${_file})
+      list(APPEND _files ${_file})
+      list(APPEND _embeddedPaths ${LOCATION})
+    endforeach()
+  endforeach()
+
+  if (_VERBOSE)
+    list(LENGTH _files _nFound)
+    message("| ========= | ====== |")
+    message("|   Total   |  ${_nFound}  |")
+  endif()
+
+  # Return
+  set(${foundFiles} ${_files} PARENT_SCOPE)
+  set(${foundEmbeddedPaths} ${_embeddedPaths} PARENT_SCOPE)
+endfunction()
+#------------------------------------------------------------------------------
diff --git a/python/engine/CMakeLists.txt b/python/engine/CMakeLists.txt
index 346a0e62a08..bd26c25b5f0 100644
--- a/python/engine/CMakeLists.txt
+++ b/python/engine/CMakeLists.txt
@@ -1,6 +1,6 @@
 add_custom_command(
   OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SWIGPythonRuntime.hxx"
-  COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+  COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
           "${SWIG_EXECUTABLE}"
           "-python"
           -external-runtime "${CMAKE_CURRENT_BINARY_DIR}/SWIGPythonRuntime.hxx"
@@ -32,7 +32,8 @@ target_link_libraries(
   PRIVATE
   openstudiolib
   openstudio_scriptengine
-  CONAN_PKG::fmt
+  #openstudio_utilities_minimal
+  fmt::fmt
   Python::Python
 )
 
@@ -48,7 +49,7 @@ if(BUILD_TESTING)
   set(pythonengine_test_depends
     openstudio_scriptengine
     openstudiolib
-    CONAN_PKG::fmt
+    fmt::fmt
   )
 
   set(pythonengine_test_src
diff --git a/ruby/bindings/InitRubyBindings.cpp b/ruby/bindings/InitRubyBindings.cpp
index 4bd07445f12..55b42d65ca1 100644
--- a/ruby/bindings/InitRubyBindings.cpp
+++ b/ruby/bindings/InitRubyBindings.cpp
@@ -19,7 +19,7 @@
 // <conan_fmt>/include/fmt/core.h:405:7: error: expected unqualified-id
 // using int128_t = __int128_t;
 //       ^
-// <conan_openstudio_ruby>include/ruby-2.7.0/arm64-darwin21/ruby/config.h:202:18: note: expanded from macro 'int128_t'
+// <conan_openstudio_ruby>include/ruby-3.2.0/arm64-darwin21/ruby/config.h:202:18: note: expanded from macro 'int128_t'
 // #define int128_t __int128
 
 // #include <ranges>
@@ -492,120 +492,6 @@ if original_arch
   RbConfig::CONFIG['arch'] = original_arch
 end
 
-module Gem
-class Specification < BasicSpecification
-
-  # This isn't ideal but there really is no available method to add specs for our use case.
-  # Using self.dirs=() works for ruby official gems but since it appends the dir paths with 'specifications' it breaks for bundled gem specs
-  def self.add_spec spec
-    warn "Gem::Specification.add_spec is deprecated and will be removed in RubyGems 3.0" unless Gem::Deprecate.skip
-    # TODO: find all extraneous adds
-    # puts
-    # p :add_spec => [spec.full_name, caller.reject { |s| s =~ /minitest/ }]
-
-    # TODO: flush the rest of the crap from the tests
-    # raise "no dupes #{spec.full_name} in #{all_names.inspect}" if
-    #   _all.include? spec
-
-    raise "nil spec!" unless spec # TODO: remove once we're happy with tests
-
-    return if _all.include? spec
-
-    _all << spec
-    stubs << spec
-    (@@stubs_by_name[spec.name] ||= []) << spec
-    sort_by!(@@stubs_by_name[spec.name]) { |s| s.version }
-    _resort!(_all)
-    _resort!(stubs)
-  end
-
-  def gem_dir
-    embedded = false
-    tmp_loaded_from = loaded_from.clone
-    if tmp_loaded_from.chars.first == ':'
-      tmp_loaded_from[0] = ''
-      embedded = true
-    end
-
-    joined = File.join(gems_dir, full_name)
-    if embedded
-      test = /bundler\/gems/.match(tmp_loaded_from)
-      if test
-        @gem_dir = ':' + (File.dirname tmp_loaded_from)
-      else
-        @gem_dir = joined
-      end
-    else
-      @gem_dir = File.expand_path joined
-    end
-  end
-
-  def full_gem_path
-    # TODO: This is a heavily used method by gems, so we'll need
-    # to aleast just alias it to #gem_dir rather than remove it.
-    embedded = false
-    tmp_loaded_from = loaded_from.clone
-    if tmp_loaded_from.chars.first == ':'
-      tmp_loaded_from[0] = ''
-      embedded = true
-    end
-
-    joined = File.join(gems_dir, full_name)
-    if embedded
-      test = /bundler\/gems/.match(tmp_loaded_from)
-      if test
-        @full_gem_path = ':' + (File.dirname tmp_loaded_from)
-        @full_gem_path.untaint
-        return @full_gem_path
-      else
-        @full_gem_path = joined
-        @full_gem_path.untaint
-        return @full_gem_path
-      end
-    else
-      @full_gem_path = File.expand_path joined
-      @full_gem_path.untaint
-    end
-    return @full_gem_path if File.directory? @full_gem_path
-
-    @full_gem_path = File.expand_path File.join(gems_dir, original_name)
-  end
-
-  def gems_dir
-    # TODO: this logic seems terribly broken, but tests fail if just base_dir
-    @gems_dir = File.join(loaded_from && base_dir || Gem.dir, "gems")
-  end
-
-  def base_dir
-    return Gem.dir unless loaded_from
-
-    embedded = false
-    tmp_loaded_from = loaded_from.clone
-    if tmp_loaded_from.chars.first == ':'
-      tmp_loaded_from[0] = ''
-      embedded = true
-    end
-
-    test = /bundler\/gems/.match(tmp_loaded_from)
-    result = if (default_gem? || test) then
-        File.dirname File.dirname File.dirname tmp_loaded_from
-      else
-        File.dirname File.dirname tmp_loaded_from
-      end
-
-    if embedded
-      result = ':' + result
-    end
-    @base_dir = result
-  end
-
-end
-end
-
-# have to do some forward declaration and pre-require to get around autoload cycles
-#module Bundler
-#end
-
 # This is the code chunk to allow for an embedded IRB shell. From Jason Roelofs, found on StackOverflow
 module IRB # :nodoc:
   def self.start_session(binding)
@@ -707,11 +593,21 @@ void setGemPathDir(const std::vector<openstudio::path>& gemPathDirs) {
 }
 
 void locateEmbeddedGems(bool use_bundler) {
+  // It is important to find, eval, and call add_spec for all of the gemspecs
+  // that are in the embedded file system. The rubgems find/load mechanims will
+  // attempt to use a number of Ruby file, directory, and path operations that
+  // are not compaitable with the embdded file system. By doing the find, eval,
+  // add_spec routine up front, rubygems will avoid trying to load things off of
+  // the embedded file system itself.
+  //
+  // A previous version of this routine added embedded file paths to the gem
+  // path, such as Gem.paths.path << ':/ruby/3.2.0/gems/'. This is not
+  // sustainable because it requires shims for many of the Ruby file operations
+  // so that they work with embedded files. The solution here avoids File
+  // operations on embdded file system with the exception of our own
+  // EmbeddedScripting::getFileAsString
 
   std::string initCmd = R"ruby(
-
-  Gem.paths.path << ':/ruby/2.7.0/gems/'
-  Gem.paths.path << ':/ruby/2.7.0/bundler/gems/'
   Gem::Deprecate.skip = true
 
   # find all the embedded gems
@@ -723,6 +619,15 @@ void locateEmbeddedGems(bool use_bundler) {
         begin
           spec = EmbeddedScripting::getFileAsString(f)
           s = eval(spec)
+
+          # These require io-console, which we don't have on Windows
+	  if Gem.win_platform?
+              next if s.name == 'reline'
+              next if s.name == 'debug'
+              next if s.name == 'irb'
+              next if s.name == 'readline'
+	  end
+
           s.loaded_from = f
           # This is shenanigans because otherwise rubygems will think extensions are missing
           # But we are initing them manually so they are not missing
@@ -782,7 +687,7 @@ void locateEmbeddedGems(bool use_bundler) {
       if original_embedded_gems[spec.name]
         # check if gem can be loaded from RUBYLIB, this supports developer use case
         original_load_path.each do |lp|
-          if File.exists?(File.join(lp, spec.name)) || File.exists?(File.join(lp, spec.name + '.rb')) || File.exists?(File.join(lp, spec.name + '.so'))
+          if File.exist?(File.join(lp, spec.name)) || File.exist?(File.join(lp, spec.name + '.rb')) || File.exist?(File.join(lp, spec.name + '.so'))
             $logger.debug "Found #{spec.name} in '#{lp}', overrides gem #{spec.spec_file}"
             do_activate = false
             break
@@ -941,7 +846,7 @@ void setupEmbeddedGems(const std::vector<openstudio::path>& includeDirs, const s
     setRubyEnvVarPath("BUNDLE_PATH", bundleGemDirPath);
   } else if (use_bundler) {
     // bundle was requested but bundle_path was not provided
-    std::cout << "Warn: Bundle activated but ENV['BUNDLE_PATH'] is not set" << '\n' << "Info: Setting BUNDLE_PATH to ':/ruby/2.7.0/'" << std::endl;
+    std::cout << "Warn: Bundle activated but ENV['BUNDLE_PATH'] is not set" << '\n' << "Info: Setting BUNDLE_PATH to ':/ruby/3.2.0/'" << std::endl;
   }
 
   if (!bundleWithoutGroups.empty()) {
diff --git a/ruby/engine/CMakeLists.txt b/ruby/engine/CMakeLists.txt
index 601be0496cd..6f145e8e214 100644
--- a/ruby/engine/CMakeLists.txt
+++ b/ruby/engine/CMakeLists.txt
@@ -16,177 +16,81 @@ endforeach()
 
 CONFIGURE_FILE_WITH_CHECKSUM("InitMacros.hxx.in" "${CMAKE_CURRENT_BINARY_DIR}/InitMacros.hxx")
 
-set(MODULE_ROOT "${CONAN_OPENSTUDIO_RUBY_ROOT}")
-if ("${MODULE_ROOT}" STREQUAL "")
-  set(MODULE_ROOT "${CONAN_OPENSTUDIO_RUBY_ROOT_DEBUG}")
+set(configs "RELEASE" "DEBUG" "RELWITHDEBINFO" "MINSIZEREL")
+foreach(_config ${configs})
+  message(DEBUG "Testing config=${config}")
+  set(MODULE_ROOT "${ruby_PACKAGE_FOLDER_${_config}}")
+  if (NOT  "${MODULE_ROOT}" STREQUAL "")
+    message("Found Ruby package folder for config ${_config} at ${MODULE_ROOT}")
+    break()
+  endif()
+endforeach()
+
+if("${MODULE_ROOT}" STREQUAL "")
+  message(FATAL_ERROR "MODULE_ROOT for ruby not found")
 endif()
 
-message("Searching for ruby modules in '${MODULE_ROOT}/lib/**/*.rb'")
-file(GLOB_RECURSE  EXTENSION_RB  FOLLOW_SYMLINKS "${MODULE_ROOT}/lib/**/*.rb")
 
-foreach( _FILE ${EXTENSION_RB} )
-  file(RELATIVE_PATH LOCATION ${MODULE_ROOT}/lib ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-set(GEMFILE_FILES "${OPENSTUDIO_GEMS_DIR}/openstudio-gems.gemspec" "${PROJECT_BINARY_DIR}/openstudio-gems/Gemfile" "${PROJECT_BINARY_DIR}/openstudio-gems/Gemfile.lock")
-file(GLOB_RECURSE RB_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.rb")
-file(GLOB_RECURSE ERB_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.erb")
-file(GLOB_RECURSE JS_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.js")
-file(GLOB_RECURSE CSS_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.css")
-file(GLOB_RECURSE GIF_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.gif")
-file(GLOB_RECURSE PNG_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.png")
-file(GLOB_RECURSE HTML_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.html")
-file(GLOB_RECURSE IDF_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.idf")
-file(GLOB_RECURSE OSM_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.osm")
-file(GLOB_RECURSE EPW_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.epw")
-file(GLOB_RECURSE DDY_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.ddy")
-file(GLOB_RECURSE STAT_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.stat")
-file(GLOB_RECURSE CSV_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.csv")
-file(GLOB_RECURSE JSON_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.json")
-file(GLOB_RECURSE SPEC_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.gemspec")
-file(GLOB_RECURSE GZ_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.gz")
-file(GLOB_RECURSE YML_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.yml")
-file(GLOB_RECURSE DATA_FILES FOLLOW_SYMLINKS "${OPENSTUDIO_GEMS_DIR}/**/*.data")
-file(GLOB_RECURSE OS_FILES FOLLOW_SYMLINKS "${CMAKE_SOURCE_DIR}/ruby/module/openstudio/**/*.rb")
+# TODO: Previously just globbing for .rb files, I think we're missing a lot of files, the gemspecs in particular, the .pem SSL certs for rubygems, those rbs files too?
+glob_for_file_exts_and_prepare_for_embedded("${MODULE_ROOT}/lib" rubyFiles rubyEmbeddedPaths VERBOSE EXTENSIONS rb gemspec pem js css gif png json rbs yml)
+list(APPEND FILES ${rubyFiles})
+list(APPEND EMBEDDED_PATHS ${rubyEmbeddedPaths})
 
+set(GEMFILE_FILES
+  # "${OPENSTUDIO_GEMS_DIR}/openstudio-gems.gemspec"
+  "${PROJECT_BINARY_DIR}/openstudio-gems/Gemfile" "${PROJECT_BINARY_DIR}/openstudio-gems/Gemfile.lock")
 foreach( _FILE ${GEMFILE_FILES} )
   file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
   list(APPEND FILES ${_FILE})
   list(APPEND EMBEDDED_PATHS ${LOCATION})
 endforeach()
 
-foreach( _FILE ${RB_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${DATA_FILES} )
-   file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-   list(APPEND FILES ${_FILE})
-   list(APPEND EMBEDDED_PATHS ${LOCATION})
- endforeach()
-
-foreach( _FILE ${ERB_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${JS_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${CSS_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${GIF_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${PNG_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${HTML_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${IDF_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${OSM_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${EPW_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${DDY_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${STAT_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${CSV_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${JSON_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${SPEC_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
-
-foreach( _FILE ${GZ_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
+# Note: from export-extensions.cmake
+list(LENGTH gemFiles _nFoundGemFiles)
+list(LENGTH gemEmbeddedPaths _nFoundGemsEmbeddedPaths)
+message("gemFiles=${_nFoundGemFiles}, gemEmbeddedPaths=${_nFoundGemsEmbeddedPaths}")
+# glob_for_file_exts_and_prepare_for_embedded("${OPENSTUDIO_GEMS_DIR}" gemFiles gemEmbeddedPaths
+#  VERBOSE
+#  EXTENSIONS rb data erb js css gif png html idf osm epw ddy stat csv json gemspec gz yml
+#)
 
-foreach( _FILE ${YML_FILES} )
-  file(RELATIVE_PATH LOCATION "${PROJECT_BINARY_DIR}/openstudio-gems" ${_FILE})
-  list(APPEND FILES ${_FILE})
-  list(APPEND EMBEDDED_PATHS ${LOCATION})
-endforeach()
+list(APPEND FILES ${gemFiles})
+list(APPEND EMBEDDED_PATHS ${gemEmbeddedPaths})
 
 # DLM: this is temporary, these files should live somewhere else and be included in the shared Ruby lib
+file(GLOB_RECURSE OS_FILES FOLLOW_SYMLINKS "${CMAKE_SOURCE_DIR}/ruby/module/openstudio/**/*.rb")
 foreach( _FILE ${OS_FILES} )
   file(RELATIVE_PATH LOCATION "${CMAKE_SOURCE_DIR}/ruby/module" ${_FILE})
   list(APPEND FILES ${_FILE})
   list(APPEND EMBEDDED_PATHS ${LOCATION})
 endforeach()
 
-list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/embedded_help.rb")
-list(APPEND EMBEDDED_PATHS "embedded_help.rb")
-
-list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/openstudio_cli.rb")
-list(APPEND EMBEDDED_PATHS "openstudio_cli.rb")
-
-list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/openstudio_init_extended.rb")
-list(APPEND EMBEDDED_PATHS "openstudio_init_extended.rb")
+set(local_rb_files
+  embedded_help.rb
+  openstudio_cli.rb
+  openstudio_init_extended.rb
+  measure_manager.rb
+  measure_manager_server.rb
+)
 
+foreach (_FILE ${local_rb_files})
+  list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/${_FILE}")
+  list(APPEND EMBEDDED_PATHS "${_FILE}")
+endforeach()
 
-list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/measure_manager.rb")
-list(APPEND EMBEDDED_PATHS "measure_manager.rb")
+set(_contents "")
+foreach(_line ${FILES})
+   set(_contents "${_contents}${_line}\n")
+endforeach()
+file(WRITE "${PROJECT_BINARY_DIR}/embedded_files.txt" "${_contents}")
+set(_contents "")
+foreach(_line ${EMBEDDED_PATHS})
+   set(_contents "${_contents}${_line}\n")
+endforeach()
+file(WRITE "${PROJECT_BINARY_DIR}/embedded_paths.txt" "${_contents}")
 
-list(APPEND FILES "${CMAKE_CURRENT_SOURCE_DIR}/measure_manager_server.rb")
-list(APPEND EMBEDDED_PATHS "measure_manager_server.rb")
+list(LENGTH FILES nFoundToEmbed)
+message("Total files to embed: ${nFoundToEmbed} files")
 
 embed_files("${FILES}" "${EMBEDDED_PATHS}" OUTPUT)
 
@@ -203,7 +107,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}
 
 add_custom_command(
   OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/embedded_scripting_wrap.cxx"
-  COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+  COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
           "${SWIG_EXECUTABLE}"
           "-ruby"
           "-c++"
@@ -261,7 +165,7 @@ target_link_libraries(rubyengine
   openstudiolib
   rubybindings
   rubyinterpreter
-  CONAN_PKG::fmt
+  fmt::fmt
   ${ruby_extension_libs}
   ${ALL_RUBY_BINDING_TARGETS}
 )
@@ -291,7 +195,7 @@ if(BUILD_TESTING)
   set(rubyengine_test_depends
     openstudio_scriptengine
     openstudiolib
-    CONAN_PKG::fmt
+    fmt::fmt
   )
 
   set(rubyengine_test_src
diff --git a/ruby/engine/InitRubyEngine.cpp b/ruby/engine/InitRubyEngine.cpp
index d94037db9c7..debca1a9787 100644
--- a/ruby/engine/InitRubyEngine.cpp
+++ b/ruby/engine/InitRubyEngine.cpp
@@ -10,12 +10,29 @@
 #include <iostream>
 #include <embedded_files.hxx>
 
+extern "C"
+{
+  // static void Init_builtin_prelude(void);
+  // void Init_builtin_gem_prelude(void);
+}
+
 namespace openstudio {
 
 void RubyEngine::initRubyEngine() {
   RUBY_INIT_STACK;
   ruby_init();
 
+  ruby_gc_set_params();
+  ruby_init_loadpath();
+
+  Init_enc();
+  // rb_enc_set_default_internal(rb_enc_from_encoding(rb_utf8_encoding()));
+  // rb_enc_set_default_external(rb_enc_from_encoding(rb_utf8_encoding()));
+
+  Init_ext(); /* load statically linked extensions before rubygems */
+  // Init_extra_exts();
+  rb_call_builtin_inits();
+
   swig::GC_VALUE::hash_id = rb_intern("hash");
   swig::GC_VALUE::lt_id = rb_intern("<");
   swig::GC_VALUE::gt_id = rb_intern(">");
@@ -40,6 +57,8 @@ void RubyEngine::initRubyEngine() {
   swig::GC_VALUE::lshift_id = rb_intern("<<");
   swig::GC_VALUE::rshift_id = rb_intern(">>");
 
+  // rb_provide("rbconfig.so");
+
   // Need embedded_help for requiring files out of the embedded system
   auto embedded_extensions_string = embedded_files::getFileAsString(":/embedded_help.rb");
 
@@ -56,337 +75,6 @@ void RubyEngine::initRubyEngine() {
     ruby_cleanup(1);
     throw;
   }
-
-  // encodings
-  // Get the symbols from: `DUMPBIN /ARCHIVEMEMBERS  <path/to/ruby/>/lib/enc/libenc.lib`
-  Init_encdb();
-  rb_provide("enc/encdb.so");
-  Init_big5();
-  rb_provide("enc/big5.so");
-  Init_cesu_8();
-  rb_provide("enc/cesu_8.so");
-  Init_cp949();
-  rb_provide("enc/cp949.so");
-  Init_emacs_mule();
-  rb_provide("enc/emacs_mule.so");
-  Init_euc_jp();
-  rb_provide("enc/euc_jp.so");
-  Init_euc_kr();
-  rb_provide("enc/euc_kr.so");
-  Init_euc_tw();
-  rb_provide("enc/euc_tw.so");
-  Init_gb18030();
-  rb_provide("enc/gb18030.so");
-  Init_gb2312();
-  rb_provide("enc/gb2312.so");
-  Init_gbk();
-  rb_provide("enc/gbk.so");
-  Init_iso_8859_1();
-  rb_provide("enc/iso_8859_1.so");
-  Init_iso_8859_10();
-  rb_provide("enc/iso_8859_10.so");
-  Init_iso_8859_11();
-  rb_provide("enc/iso_8859_11.so");
-  Init_iso_8859_13();
-  rb_provide("enc/iso_8859_13.so");
-  Init_iso_8859_14();
-  rb_provide("enc/iso_8859_14.so");
-  Init_iso_8859_15();
-  rb_provide("enc/iso_8859_15.so");
-  Init_iso_8859_16();
-  rb_provide("enc/iso_8859_16.so");
-  Init_iso_8859_2();
-  rb_provide("enc/iso_8859_2.so");
-  Init_iso_8859_3();
-  rb_provide("enc/iso_8859_3.so");
-  Init_iso_8859_4();
-  rb_provide("enc/iso_8859_4.so");
-  Init_iso_8859_5();
-  rb_provide("enc/iso_8859_5.so");
-  Init_iso_8859_6();
-  rb_provide("enc/iso_8859_6.so");
-  Init_iso_8859_7();
-  rb_provide("enc/iso_8859_7.so");
-  Init_iso_8859_8();
-  rb_provide("enc/iso_8859_8.so");
-  Init_iso_8859_9();
-  rb_provide("enc/iso_8859_9.so");
-  Init_koi8_r();
-  rb_provide("enc/koi8_r.so");
-  Init_koi8_u();
-  rb_provide("enc/koi8_u.so");
-  Init_shift_jis();
-  rb_provide("enc/shift_jis.so");
-  Init_utf_16be();
-  rb_provide("enc/utf_16be.so");
-  Init_utf_16le();
-  rb_provide("enc/utf_16le.so");
-  Init_utf_32be();
-  rb_provide("enc/utf_32be.so");
-  Init_utf_32le();
-  rb_provide("enc/utf_32le.so");
-  Init_windows_1250();
-  rb_provide("enc/windows_1250.so");
-  Init_windows_1251();
-  rb_provide("enc/windows_1251.so");
-  Init_windows_1252();
-  rb_provide("enc/windows_1252.so");
-  Init_windows_1253();
-  rb_provide("enc/windows_1253.so");
-  Init_windows_1254();
-  rb_provide("enc/windows_1254.so");
-  Init_windows_1257();
-  rb_provide("enc/windows_1257.so");
-  Init_windows_31j();
-  rb_provide("enc/windows_31j.so");
-
-  // Get the symbols from: `DUMPBIN /ARCHIVEMEMBERS  <path/to/ruby>/lib/enc/libtrans.lib`
-  Init_transdb();
-  rb_provide("enc/trans/transdb.so");
-
-  Init_trans_big5();
-  rb_provide("enc/trans/big5.so");
-
-  Init_trans_cesu_8();
-  rb_provide("enc/trans/cesu_8.so");
-
-  Init_trans_chinese();
-  rb_provide("enc/trans/chinese.so");
-
-  Init_trans_ebcdic();
-  rb_provide("enc/trans/ebcdic.so");
-
-  Init_trans_emoji();
-  rb_provide("enc/trans/emoji.so");
-
-  Init_trans_emoji_iso2022_kddi();
-  rb_provide("enc/trans/emoji_iso2022_kddi.so");
-
-  Init_trans_emoji_sjis_docomo();
-  rb_provide("enc/trans/emoji_sjis_docomo.so");
-
-  Init_trans_emoji_sjis_kddi();
-  rb_provide("enc/trans/emoji_sjis_kddi.so");
-
-  Init_trans_emoji_sjis_softbank();
-  rb_provide("enc/trans/emoji_sjis_softbank.so");
-
-  Init_trans_escape();
-  rb_provide("enc/trans/escape.so");
-
-  Init_trans_gb18030();
-  rb_provide("enc/trans/gb18030.so");
-
-  Init_trans_gbk();
-  rb_provide("enc/trans/gbk.so");
-
-  Init_trans_iso2022();
-  rb_provide("enc/trans/iso2022.so");
-
-  Init_trans_japanese();
-  rb_provide("enc/trans/japanese.so");
-
-  Init_trans_japanese_euc();
-  rb_provide("enc/trans/japanese_euc.so");
-
-  Init_trans_japanese_sjis();
-  rb_provide("enc/trans/japanese_sjis.so");
-
-  Init_trans_korean();
-  rb_provide("enc/trans/korean.so");
-
-  Init_trans_single_byte();
-  rb_provide("enc/trans/single_byte.so");
-
-  Init_trans_utf8_mac();
-  rb_provide("enc/trans/utf8_mac.so");
-
-  Init_trans_utf_16_32();
-  rb_provide("enc/trans/utf_16_32.so");
-
-  Init_bigdecimal();
-  rb_provide("bigdecimal");
-  rb_provide("bigdecimal.so");
-
-  Init_continuation();
-  rb_provide("continuation");
-  rb_provide("continuation.so");
-
-  Init_coverage();
-  rb_provide("coverage");
-  rb_provide("coverage.so");
-
-  Init_cparse();
-  rb_provide("cparse");
-  rb_provide("racc/cparse");
-  rb_provide("cparse.so");
-  rb_provide("racc/cparse.so");
-
-  Init_date_core();
-  rb_provide("date_core");
-  rb_provide("date_core.so");
-
-  Init_digest();
-  rb_provide("digest");
-  rb_provide("digest.so");
-
-  Init_escape();
-  rb_provide("escape");
-  rb_provide("escape.so");
-
-  Init_etc();
-  rb_provide("etc");
-  rb_provide("etc.so");
-
-  Init_fcntl();
-  rb_provide("fcntl");
-  rb_provide("fcntl.so");
-
-  Init_fiber();
-  rb_provide("fiber");
-  rb_provide("fiber.so");
-
-  Init_fiddle();
-  rb_provide("fiddle");
-  rb_provide("fiddle.so");
-
-  // TODO: Fix this
-  // #ifndef _WIN32
-  Init_generator();
-  rb_provide("json/ext/generator");
-  rb_provide("json/ext/generator.so");
-  // #endif
-
-  Init_md5();
-  rb_provide("md5");
-  rb_provide("digest/md5");
-  rb_provide("md5.so");
-  rb_provide("digest/md5.so");
-
-  Init_monitor();
-  rb_provide("monitor");
-  rb_provide("monitor.so");
-
-  Init_nkf();
-  rb_provide("nkf");
-  rb_provide("nkf.so");
-
-  Init_nonblock();
-  rb_provide("nonblock");
-  rb_provide("nonblock.so");
-  rb_provide("io/nonblock");
-  rb_provide("io/nonblock.so");
-
-  Init_ruby_description();
-
-  Init_objspace();
-  rb_provide("objspace");
-  rb_provide("objspace.so");
-
-  // TODO: Fix this
-  // #ifndef _WIN32
-  Init_parser();
-  rb_provide("json/ext/parser");
-  rb_provide("json/ext/parser.so");
-  // #endif
-
-  Init_pathname();
-  rb_provide("pathname");
-  rb_provide("pathname.so");
-
-  // TODO: Fix this
-  // #ifndef _WIN32
-  Init_psych();
-  rb_provide("psych");
-  rb_provide("psych.so");
-  // #endif
-
-  Init_ripper();
-  rb_provide("ripper");
-  rb_provide("ripper.so");
-
-  Init_rmd160();
-  rb_provide("rmd160");
-  rb_provide("digest/rmd160");
-  rb_provide("rmd160.so");
-  rb_provide("digest/rmd160.so");
-
-  Init_sdbm();
-  rb_provide("sdbm");
-  rb_provide("sdbm.so");
-
-  Init_sha1();
-  rb_provide("sha1");
-  rb_provide("digest/sha1");
-  rb_provide("sha1.so");
-  rb_provide("digest/sha1.so");
-
-  Init_sha2();
-  rb_provide("sha2");
-  rb_provide("digest/sha2");
-  rb_provide("sha2.so");
-  rb_provide("digest/sha2.so");
-
-  Init_sizeof();
-  rb_provide("sizeof");
-  rb_provide("sizeof.so");
-
-  Init_socket();
-  rb_provide("socket");
-  rb_provide("socket.so");
-
-  Init_stringio();
-  rb_provide("stringio");
-  rb_provide("stringio.so");
-
-  Init_strscan();
-  rb_provide("strscan");
-  rb_provide("strscan.so");
-
-  Init_wait();
-  rb_provide("wait");
-  rb_provide("io/wait");
-  rb_provide("wait.so");
-  rb_provide("io/wait.so");
-
-  Init_zlib();
-  rb_provide("zlib");
-  rb_provide("zlib.so");
-
-  Init_openssl();
-  rb_provide("openssl");
-  rb_provide("openssl.so");
-
-  Init_nonblock();
-  rb_provide("io/nonblock");
-  rb_provide("io/nonblock.so");
-
-#ifndef _WIN32
-  // Init_console on Windows fails to load openssl
-  Init_console();
-  rb_provide("console");
-  rb_provide("console.so");
-
-  Init_dbm();
-  rb_provide("dbm");
-  rb_provide("dbm.so");
-
-  Init_gdbm();
-  rb_provide("gdbm");
-  rb_provide("gdbm.so");
-
-  Init_pty();
-  rb_provide("pty");
-  rb_provide("pty.so");
-
-  Init_readline();
-  rb_provide("readline");
-  rb_provide("readline.so");
-
-  Init_syslog();
-  rb_provide("syslog");
-  rb_provide("syslog.so");
-#endif
 }
 
 }  // namespace openstudio
diff --git a/ruby/engine/InitRubyEngine.hpp b/ruby/engine/InitRubyEngine.hpp
index 6c2044ad23e..20c0aa816de 100644
--- a/ruby/engine/InitRubyEngine.hpp
+++ b/ruby/engine/InitRubyEngine.hpp
@@ -8,114 +8,12 @@
 
 extern "C"
 {
-  void Init_encdb();
-  void Init_big5();
-  void Init_cesu_8();
-  void Init_cp949();
-  void Init_emacs_mule();
-  void Init_euc_jp();
-  void Init_euc_kr();
-  void Init_euc_tw();
-  void Init_gb18030();
-  void Init_gb2312();
-  void Init_gbk();
-  void Init_iso_8859_1();
-  void Init_iso_8859_10();
-  void Init_iso_8859_11();
-  void Init_iso_8859_13();
-  void Init_iso_8859_14();
-  void Init_iso_8859_15();
-  void Init_iso_8859_16();
-  void Init_iso_8859_2();
-  void Init_iso_8859_3();
-  void Init_iso_8859_4();
-  void Init_iso_8859_5();
-  void Init_iso_8859_6();
-  void Init_iso_8859_7();
-  void Init_iso_8859_8();
-  void Init_iso_8859_9();
-  void Init_koi8_r();
-  void Init_koi8_u();
-  void Init_shift_jis();
-  void Init_utf_16be();
-  void Init_utf_16le();
-  void Init_utf_32be();
-  void Init_utf_32le();
-  void Init_windows_1250();
-  void Init_windows_1251();
-  void Init_windows_1252();
-  void Init_windows_1253();
-  void Init_windows_1254();
-  void Init_windows_1257();
-  void Init_windows_31j();
-
-  void Init_transdb();
-  void Init_trans_big5();
-  void Init_trans_cesu_8();
-  void Init_trans_chinese();
-  void Init_trans_ebcdic();
-  void Init_trans_emoji();
-  void Init_trans_emoji_iso2022_kddi();
-  void Init_trans_emoji_sjis_docomo();
-  void Init_trans_emoji_sjis_kddi();
-  void Init_trans_emoji_sjis_softbank();
-  void Init_trans_escape();
-  void Init_trans_gb18030();
-  void Init_trans_gbk();
-  void Init_trans_iso2022();
-  void Init_trans_japanese();
-  void Init_trans_japanese_euc();
-  void Init_trans_japanese_sjis();
-  void Init_trans_korean();
-  void Init_trans_single_byte();
-  void Init_trans_utf8_mac();
-  void Init_trans_utf_16_32();
-
-  void Init_bigdecimal();
-  void Init_bigdecimal(void);
-  void Init_continuation(void);
-  void Init_coverage(void);
-  void Init_cparse(void);
-  void Init_date_core(void);
-  void Init_digest(void);
-  void Init_escape(void);
-  void Init_etc(void);
-  void Init_fcntl(void);
-  void Init_fiber(void);
-  void Init_fiddle(void);
-  void Init_generator(void);
-  void Init_md5(void);
-  void Init_monitor(void);
-  void Init_nkf(void);
-  void Init_nonblock(void);
-  void Init_objspace(void);
-  void Init_parser(void);
-  void Init_pathname(void);
-  void Init_psych(void);
-  void Init_ripper(void);
-  void Init_rmd160(void);
-  void Init_sdbm(void);
-  void Init_sha1(void);
-  void Init_sha2(void);
-  void Init_sizeof(void);
-  void Init_socket(void);
-  void Init_stringio(void);
-  void Init_strscan(void);
-  void Init_wait(void);
-  void Init_zlib(void);
-
-  void Init_openssl(void);
-  void Init_ruby_description(void);
-
-#ifndef _WIN32
-  void Init_console(void);
-  void Init_dbm(void);
-  void Init_gdbm(void);
-  void Init_pty(void);
-  void Init_readline(void);
-  void Init_syslog(void);
-#endif
-
+  void ruby_gc_set_params(void);
+  // cf https://bugs.ruby-lang.org/issues/19758
+  // I've included the ext/extinit.o and enc/encinit.o in the object files to that should work
+  void Init_enc(void);
+  void Init_ext(void);
+  void rb_call_builtin_inits(void);
 }  // extern C
 
 #endif  // INITRUBYENGINE_included
diff --git a/ruby/engine/RubyEngine.cpp b/ruby/engine/RubyEngine.cpp
index 12d0ddbf434..232fa69a6c4 100644
--- a/ruby/engine/RubyEngine.cpp
+++ b/ruby/engine/RubyEngine.cpp
@@ -215,7 +215,7 @@ extern "C"
 
   int rb_hasFile(const char* t_filename) {
     // TODO Consider expanding this to use the path which we have artificially defined in embedded_help.rb
-    std::string expandedName = fmt::format(":/ruby/2.7.0/{}.rb", t_filename);
+    std::string expandedName = fmt::format(":/ruby/3.2.0/{}.rb", t_filename);
     return embedded_files::hasFile(expandedName) ? 1 : 0;
   }
 
diff --git a/ruby/engine/embedded_gems.rb b/ruby/engine/embedded_gems.rb
index 4a3298a9257..eab0ca0098b 100644
--- a/ruby/engine/embedded_gems.rb
+++ b/ruby/engine/embedded_gems.rb
@@ -54,8 +54,8 @@ def setup_embedded_gems() #includeDirs, gemPathDirs, gemHomeDir, bundleGemFilePa
     # bundle was requested but bundle_path was not provided
     $logger.warn "Bundle activated but ENV['BUNDLE_PATH'] is not set"
 
-    $logger.info "Setting BUNDLE_PATH to ':/ruby/2.7.0/'"
-    ENV['BUNDLE_PATH'] = ':/ruby/2.7.0/'
+    $logger.info "Setting BUNDLE_PATH to ':/ruby/3.2.0/'"
+    ENV['BUNDLE_PATH'] = ':/ruby/3.2.0/'
 
   end
 
@@ -78,8 +78,8 @@ def setup_embedded_gems() #includeDirs, gemPathDirs, gemHomeDir, bundleGemFilePa
 
   end
 
-  Gem.paths.path << ':/ruby/2.7.0/gems/'
-  Gem.paths.path << ':/ruby/2.7.0/bundler/gems/'
+  Gem.paths.path << ':/ruby/3.2.0/gems/'
+  Gem.paths.path << ':/ruby/3.2.0/bundler/gems/'
   Gem::Deprecate.skip = true
 
   # find all the embedded gems
@@ -150,7 +150,7 @@ class << s
       if original_embedded_gems[spec.name]
         # check if gem can be loaded from RUBYLIB, this supports developer use case
         original_load_path.each do |lp|
-          if File.exists?(File.join(lp, spec.name)) || File.exists?(File.join(lp, spec.name + '.rb')) || File.exists?(File.join(lp, spec.name + '.so'))
+          if File.exist?(File.join(lp, spec.name)) || File.exist?(File.join(lp, spec.name + '.rb')) || File.exist?(File.join(lp, spec.name + '.so'))
             $logger.debug "Found #{spec.name} in '#{lp}', overrides gem #{spec.spec_file}"
             do_activate = false
             break
diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb
index 07a97d9449b..40b1dc35272 100644
--- a/ruby/engine/embedded_help.rb
+++ b/ruby/engine/embedded_help.rb
@@ -63,12 +63,54 @@ module Kernel
   #if ENV['RUBYLIB']
   #  ENV['RUBYLIB'].split(File::PATH_SEPARATOR).each {|lib| $LOAD_PATH.unshift(lib)}
   #end
+
+  # ruby -e 'puts $LOAD_PATH', this comes from loadpath.c (ruby_initial_load_paths)
+  # <ruby_dir>/lib/ruby/site_ruby/3.2.0
+  # <ruby_dir>/lib/ruby/site_ruby/3.2.0/x86_64-linux
+  # <ruby_dir>/lib/ruby/site_ruby
+  # <ruby_dir>/lib/ruby/vendor_ruby/3.2.0
+  # <ruby_dir>/lib/ruby/vendor_ruby/3.2.0/x86_64-linux
+  # <ruby_dir>/lib/ruby/vendor_ruby
+  # <ruby_dir>/lib/ruby/3.2.0
+  # <ruby_dir>/lib/ruby/3.2.0/x86_64-linux
+
+  # Change 3.2.2 to 3.2.0
+  RUBY_V = (RUBY_VERSION.split('.')[0..1] + ['0']).join('.')
+  # Debug
+  # puts "Initial load path:
+  # puts $LOAD_PATH
+
+  # TODO: double check and update platform-specific includes
   $LOAD_PATH << ':'
-  $LOAD_PATH << ':/ruby/2.7.0'
-  $LOAD_PATH << ':/ruby/2.7.0/x86_64-darwin16'
-  $LOAD_PATH << ':/ruby/2.7.0/x86_64-darwin17'
-  $LOAD_PATH << ':/ruby/2.7.0/x86_64-darwin18'
-  $LOAD_PATH << ':/ruby/2.7.0/x64-mswin64_140'
+  $LOAD_PATH << ":/ruby/site_ruby/#{RUBY_V}"
+  $LOAD_PATH << ":/ruby/site_ruby/#{RUBY_V}/#{RUBY_PLATFORM}"
+  $LOAD_PATH << ":/ruby/site_ruby"
+  $LOAD_PATH << ":/ruby/vendor_ruby/#{RUBY_V}"
+  $LOAD_PATH << ":/ruby/vendor_ruby/#{RUBY_V}/#{RUBY_PLATFORM}"
+  $LOAD_PATH << ":/ruby/vendor_ruby"
+  $LOAD_PATH << ":/ruby/#{RUBY_V}"
+  $LOAD_PATH << ":/ruby/#{RUBY_V}/#{RUBY_PLATFORM}"
+
+  # puts "==============="
+  # puts "New load path:"
+  # puts $LOAD_PATH
+
+  # TODO: keep fallbacks?
+  # $LOAD_PATH << ':/ruby/3.2.0'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin16'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin17'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin18'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin19'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin20'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin21'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-darwin22'
+  # $LOAD_PATH << ':/ruby/3.2.0/arm64-darwin20'
+  # $LOAD_PATH << ':/ruby/3.2.0/arm64-darwin21'
+  # $LOAD_PATH << ':/ruby/3.2.0/arm64-darwin22'
+  # $LOAD_PATH << ':/ruby/3.2.0/arm64-darwin23'
+  # $LOAD_PATH << ':/ruby/3.2.0/x86_64-linux'
+  # $LOAD_PATH << ':/ruby/3.2.0/aarch64-linux'
+  # $LOAD_PATH << ':/ruby/3.2.0/x64-mswin64_140'
   # DLM: now done in embedded gem initialization section in openstudio_cli.rb
   #$LOAD_PATH << EmbeddedScripting::findFirstFileByName('openstudio-standards.rb').gsub('/openstudio-standards.rb', '')
   #$LOAD_PATH << EmbeddedScripting::findFirstFileByName('openstudio-workflow.rb').gsub('/openstudio-workflow.rb', '')
@@ -223,11 +265,11 @@ def load_resource_relative(path, mode='r')
     end
 
     result = ""
-    if File.exists?(absolute_path)
+    if File.exist?(absolute_path)
       File.open(absolute_path, mode) do |file|
         result = file.read
       end
-    elsif File.exists?(path)
+    elsif File.exist?(path)
       File.open(path, mode) do |file|
         result = file.read
       end
@@ -782,7 +824,7 @@ def self.find(*paths, ignore_error: true)
             fs.reverse_each {|f|
               next if f == "." or f == ".."
               f = File.join(file, f)
-              ps.unshift f.untaint
+              ps.unshift f
             }
           end
         end
diff --git a/ruby/engine/measure_manager.rb b/ruby/engine/measure_manager.rb
index 45972cd29bd..3bddd28c085 100644
--- a/ruby/engine/measure_manager.rb
+++ b/ruby/engine/measure_manager.rb
@@ -264,7 +264,7 @@ def get_measure(measure_dir, force_reload)
       readme_out_path = File.join(measure_dir, "README.md")
 
       readme_out_of_date = false
-      if File.exists?(readme_in_path) && !File.exists?(readme_out_path)
+      if File.exist?(readme_in_path) && !File.exist?(readme_out_path)
         readme_out_of_date = true
       end
 
@@ -285,11 +285,11 @@ def get_measure(measure_dir, force_reload)
         info.update(result)
 
         # update README.md.erb
-        if File.exists?(readme_in_path)
+        if File.exist?(readme_in_path)
 
           begin
             # delete README.md if it exists
-            File.delete(readme_out_path) if File.exists?(readme_out_path)
+            File.delete(readme_out_path) if File.exist?(readme_out_path)
 
             readme_in = nil
             File.open(readme_in_path, 'r') do |file|
diff --git a/ruby/engine/openstudio_cli.rb b/ruby/engine/openstudio_cli.rb
index 08245346167..3093f531541 100644
--- a/ruby/engine/openstudio_cli.rb
+++ b/ruby/engine/openstudio_cli.rb
@@ -111,7 +111,7 @@ def self.add_spec spec
     _all << spec
     stubs << spec
     (@@stubs_by_name[spec.name] ||= []) << spec
-    sort_by!(@@stubs_by_name[spec.name]) { |s| s.version }
+    @@stubs_by_name[spec.name].sort_by! { |s| s.version }
     _resort!(_all)
     _resort!(stubs)
   end
@@ -152,16 +152,16 @@ def full_gem_path
       test = /bundler\/gems/.match(tmp_loaded_from)
       if test
         @full_gem_path = ':' + (File.dirname tmp_loaded_from)
-        @full_gem_path.untaint
+        # @full_gem_path.untaint
         return @full_gem_path
       else
         @full_gem_path = joined
-        @full_gem_path.untaint
+        # @full_gem_path.untaint
         return @full_gem_path
       end
     else
       @full_gem_path = File.expand_path joined
-      @full_gem_path.untaint
+      # @full_gem_path.untaint
     end
     return @full_gem_path if File.directory? @full_gem_path
 
@@ -363,7 +363,7 @@ def parse_main_args(main_args)
       if dir.nil?
         $logger.error "#{main_args[i]} requires second argument DIR"
         return false
-      elsif !File.exists?(dir) || !File.directory?(dir)
+      elsif !File.exist?(dir) || !File.directory?(dir)
         # DLM: Ruby doesn't warn for this
         #$logger.warn "'#{dir}' passed to #{main_args[i]} is not a directory"
       end
@@ -401,7 +401,7 @@ def parse_main_args(main_args)
       if dir.nil?
         $logger.error "#{main_args[i]} requires second argument DIR"
         return false
-      elsif !File.exists?(dir) || !File.directory?(dir)
+      elsif !File.exist?(dir) || !File.directory?(dir)
         # DLM: Ruby doesn't warn for this
         #$logger.warn "'#{dir}' passed to #{main_args[i]} is not a directory"
       end
@@ -459,8 +459,8 @@ def parse_main_args(main_args)
     # bundle was requested but bundle_path was not provided
     $logger.warn "Bundle activated but ENV['BUNDLE_PATH'] is not set"
 
-    $logger.info "Setting BUNDLE_PATH to ':/ruby/2.7.0/'"
-    ENV['BUNDLE_PATH'] = ':/ruby/2.7.0/'
+    $logger.info "Setting BUNDLE_PATH to ':/ruby/3.2.0/'"
+    ENV['BUNDLE_PATH'] = ':/ruby/3.2.0/'
 
   end
 
@@ -489,8 +489,8 @@ def parse_main_args(main_args)
 
   end
 
-  Gem.paths.path << ':/ruby/2.7.0/gems/'
-  Gem.paths.path << ':/ruby/2.7.0/bundler/gems/'
+  Gem.paths.path << ':/ruby/3.2.0/gems/'
+  Gem.paths.path << ':/ruby/3.2.0/bundler/gems/'
   Gem::Deprecate.skip = true
 
   # find all the embedded gems
@@ -561,7 +561,7 @@ class << s
       if original_embedded_gems[spec.name]
         # check if gem can be loaded from RUBYLIB, this supports developer use case
         original_load_path.each do |lp|
-          if File.exists?(File.join(lp, spec.name)) || File.exists?(File.join(lp, spec.name + '.rb')) || File.exists?(File.join(lp, spec.name + '.so'))
+          if File.exist?(File.join(lp, spec.name)) || File.exist?(File.join(lp, spec.name + '.rb')) || File.exist?(File.join(lp, spec.name + '.so'))
             $logger.debug "Found #{spec.name} in '#{lp}', overrides gem #{spec.spec_file}"
             do_activate = false
             break
@@ -1475,7 +1475,7 @@ def execute(sub_argv)
       # loop over all directories
       result = []
       Dir.glob("#{directory}/*/").each do |measure_dir|
-        if File.directory?(measure_dir) && File.exists?(File.join(measure_dir, "measure.xml"))
+        if File.directory?(measure_dir) && File.exist?(File.join(measure_dir, "measure.xml"))
           measure = measure_manager.get_measure(measure_dir, true)
           if measure.nil?
             $logger.debug("Directory #{measure_dir} is not a measure")
@@ -1742,7 +1742,7 @@ def execute(sub_argv)
 
     $logger.debug "ARGV: #{ARGV}"
 
-    unless File.exists? file_path
+    unless File.exist? file_path
       $logger.error "Unable to find the file #{file_path} on the filesystem"
       return 1
     end
diff --git a/ruby/interpreter/CMakeLists.txt b/ruby/interpreter/CMakeLists.txt
index 0216a323a41..92e76a8300d 100644
--- a/ruby/interpreter/CMakeLists.txt
+++ b/ruby/interpreter/CMakeLists.txt
@@ -1,16 +1,15 @@
 # "Link" to this when you need to include ruby.h,
 # but don't want to link to libruby.
 add_library(rubyinterpreter-declarations INTERFACE)
-get_target_property(RUBY_INCLUDE_DIRS CONAN_PKG::openstudio_ruby INTERFACE_INCLUDE_DIRECTORIES)
 target_include_directories(rubyinterpreter-declarations INTERFACE
-  ${RUBY_INCLUDE_DIRS}
+  ${Ruby_INCLUDE_DIRS}
   ${CMAKE_CURRENT_SOURCE_DIR}
 )
 
-# Must call CMake itself in order to set the SWIG_LIB env var for add_custom_command
+# Must call CMake itself in order to set the SWIG_DIR env var for add_custom_command
 add_custom_command(
   OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SWIGRubyRuntime.hxx"
-  COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+  COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
           "${SWIG_EXECUTABLE}"
           "-ruby"
           -external-runtime "${CMAKE_CURRENT_BINARY_DIR}/SWIGRubyRuntime.hxx"
@@ -35,4 +34,4 @@ else()
 endif()
 
 target_include_directories(rubyinterpreter INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
-target_link_libraries(rubyinterpreter INTERFACE CONAN_PKG::openstudio_ruby)
+target_link_libraries(rubyinterpreter INTERFACE Ruby::Ruby)
diff --git a/ruby/interpreter/InitDeclarations.hpp b/ruby/interpreter/InitDeclarations.hpp
deleted file mode 100644
index 93765f5fa29..00000000000
--- a/ruby/interpreter/InitDeclarations.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/***********************************************************************************************************************
-*  OpenStudio(R), Copyright (c) Alliance for Sustainable Energy, LLC.
-*  See also https://openstudio.net/license
-***********************************************************************************************************************/
-
-//VALUE init_rest_of_openstudio(...) {
-//  init_openstudio_internal_extended();
-//  return Qtrue;
-//}
-
-extern "C"
-{
-  void Init_encdb();
-  void Init_big5();
-  void Init_cesu_8();
-  void Init_cp949();
-  void Init_emacs_mule();
-  void Init_euc_jp();
-  void Init_euc_kr();
-  void Init_euc_tw();
-  void Init_gb18030();
-  void Init_gb2312();
-  void Init_gbk();
-  void Init_iso_8859_1();
-  void Init_iso_8859_10();
-  void Init_iso_8859_11();
-  void Init_iso_8859_13();
-  void Init_iso_8859_14();
-  void Init_iso_8859_15();
-  void Init_iso_8859_16();
-  void Init_iso_8859_2();
-  void Init_iso_8859_3();
-  void Init_iso_8859_4();
-  void Init_iso_8859_5();
-  void Init_iso_8859_6();
-  void Init_iso_8859_7();
-  void Init_iso_8859_8();
-  void Init_iso_8859_9();
-  void Init_koi8_r();
-  void Init_koi8_u();
-  void Init_shift_jis();
-  void Init_utf_16be();
-  void Init_utf_16le();
-  void Init_utf_32be();
-  void Init_utf_32le();
-  void Init_windows_1250();
-  void Init_windows_1251();
-  void Init_windows_1252();
-  void Init_windows_1253();
-  void Init_windows_1254();
-  void Init_windows_1257();
-  void Init_windows_31j();
-
-  void Init_transdb();
-  void Init_trans_big5();
-  void Init_trans_cesu_8();
-  void Init_trans_chinese();
-  void Init_trans_ebcdic();
-  void Init_trans_emoji();
-  void Init_trans_emoji_iso2022_kddi();
-  void Init_trans_emoji_sjis_docomo();
-  void Init_trans_emoji_sjis_kddi();
-  void Init_trans_emoji_sjis_softbank();
-  void Init_trans_escape();
-  void Init_trans_gb18030();
-  void Init_trans_gbk();
-  void Init_trans_iso2022();
-  void Init_trans_japanese();
-  void Init_trans_japanese_euc();
-  void Init_trans_japanese_sjis();
-  void Init_trans_korean();
-  void Init_trans_single_byte();
-  void Init_trans_utf8_mac();
-  void Init_trans_utf_16_32();
-
-  void Init_bigdecimal();
-  void Init_bigdecimal(void);
-  void Init_continuation(void);
-  void Init_coverage(void);
-  void Init_cparse(void);
-  void Init_date_core(void);
-  void Init_digest(void);
-  void Init_escape(void);
-  void Init_etc(void);
-  void Init_fcntl(void);
-  void Init_fiber(void);
-  void Init_fiddle(void);
-  void Init_generator(void);
-  void Init_md5(void);
-  void Init_monitor(void);
-  void Init_nkf(void);
-  void Init_nonblock(void);
-  void Init_objspace(void);
-  void Init_parser(void);
-  void Init_pathname(void);
-  void Init_psych(void);
-  void Init_ripper(void);
-  void Init_rmd160(void);
-  void Init_sdbm(void);
-  void Init_sha1(void);
-  void Init_sha2(void);
-  void Init_sizeof(void);
-  void Init_socket(void);
-  void Init_stringio(void);
-  void Init_strscan(void);
-  void Init_wait(void);
-  void Init_zlib(void);
-
-  void Init_openssl(void);
-  void Init_ruby_description(void);
-
-#ifndef _WIN32
-  void Init_console(void);
-  void Init_dbm(void);
-  void Init_gdbm(void);
-  void Init_pty(void);
-  void Init_readline(void);
-  void Init_syslog(void);
-#endif
-}
diff --git a/ruby/module/CMakeLists.txt b/ruby/module/CMakeLists.txt
index 540de9b7a82..658f0ba0d6a 100644
--- a/ruby/module/CMakeLists.txt
+++ b/ruby/module/CMakeLists.txt
@@ -19,7 +19,7 @@ add_library(
 )
 set_target_properties(openstudio_rb PROPERTIES PREFIX "")
 set_target_properties(openstudio_rb PROPERTIES OUTPUT_NAME openstudio)
-target_include_directories(openstudio_rb SYSTEM PRIVATE ${RUBY_INCLUDE_DIRS})
+target_include_directories(openstudio_rb SYSTEM PRIVATE ${Ruby_INCLUDE_DIRS})
 
 # change output directory so the openstudio.pdb file does not conflict between this target and the CLI
 set_target_properties(openstudio_rb PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/ruby/")
diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt
index 6a0315f1247..ecff9578a34 100644
--- a/src/cli/CMakeLists.txt
+++ b/src/cli/CMakeLists.txt
@@ -37,7 +37,7 @@ target_link_libraries(openstudio
   PRIVATE
   openstudiolib
   openstudio_workflow
-  CONAN_PKG::cli11
+  CLI11::CLI11
 )
 
 if(BUILD_RUBY_BINDINGS)
diff --git a/src/cli/UpdateCommand.cpp b/src/cli/UpdateCommand.cpp
index d63c9d2334a..6037ee60031 100644
--- a/src/cli/UpdateCommand.cpp
+++ b/src/cli/UpdateCommand.cpp
@@ -154,5 +154,135 @@ end
     rubyEngine->exec(cmd);
   }
 
+  void executeRubyRepl(ScriptEngineInstance& rubyEngine) {
+
+    rubyEngine->exec("ARGV.clear");
+
+    const std::string cmd = R"ruby(
+require 'irb'
+require 'irb/lc/error'
+
+# ENV["IRB_LANG"] = "C"
+# puts "Reline encoding_system_needs: #{Reline.encoding_system_needs.name}"
+# puts "Reline::IOGate.encoding: #{Reline::IOGate.encoding}"
+
+# Workaround issue in line_editor.rb where it fails to read a full block
+# unicode character. Probably because of the way we embbed it in C++
+# The full block is \xe2\x96\x88
+ENV['RELINE_ALT_SCROLLBAR'] = "1"
+
+class Reline::LineEditor
+  def reset(prompt = '', encoding:)
+    @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y
+    @screen_size = Reline::IOGate.get_screen_size
+    @screen_height = @screen_size.first
+    reset_variables(prompt, encoding: encoding)
+    Reline::IOGate.set_winch_handler do
+      @resized = true
+    end
+    if ENV.key?('RELINE_ALT_SCROLLBAR')
+      @full_block = '::'
+      @upper_half_block = "''"
+      @lower_half_block = '..'
+      @block_elem_width = 2
+    elsif Reline::IOGate.win?
+      @full_block = '█'
+      @upper_half_block = '▀'
+      @lower_half_block = '▄'
+      @block_elem_width = 1
+    elsif @encoding == Encoding::UTF_8
+      @full_block = '█'
+      @upper_half_block = '▀'
+      @lower_half_block = '▄'
+      @block_elem_width = Reline::Unicode.calculate_width('█')
+    else
+      @full_block = '::'
+      @upper_half_block = "''"
+      @lower_half_block = '..'
+      @block_elem_width = 2
+    end
+  end
+end
+
+module IRB # :nodoc:
+  class Locale
+
+    alias :original_load :load
+    alias :original_require :require
+
+    def require(file, priv = nil)
+      # puts "require: #{file}"
+      original_require(file, priv)
+    end
+
+    # Some shenanigans being done to detect localized files, and that relies ton File.readable? and co...
+    def load(file, priv=nil)
+      # puts "file=#{file}"
+      if file == 'irb/error.rb'
+        $".push file
+        @@loaded << 'irb/lc/error.rb'
+        return
+      end
+      original_load(file, priv)
+    end
+
+  end
+
+
+  def self.start_session(binding)
+    unless @__initialized
+      args = ARGV
+      ARGV.replace(ARGV.dup)
+      IRB.setup(nil)
+      # locale = @CONF[:LC_MESSAGES]
+      # p locale
+
+      ARGV.replace(args)
+      @__initialized = true
+    end
+
+    @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
+    # puts @CONF[:PROMPT_MODE]
+    os_version = "3.7.0" # OpenStudio::openStudioVersion
+    @CONF[:PROMPT][:OPENSTUDIO] = {
+      :PROMPT_I=>"(os #{os_version}) :%03n > ",
+      :PROMPT_S=>"(os #{os_version}) :%03n%l> ",
+      :PROMPT_C=>"(os #{os_version}) :%03n > ",
+      :PROMPT_N=>"(os #{os_version}) :%03n?> ",
+      :RETURN=>" => %s \n",
+      :AUTO_INDENT=>true
+    }
+    @CONF[:PROMPT_MODE] = :OPENSTUDIO
+    workspace = WorkSpace.new(binding)
+    input_method = IRB::RelineInputMethod.new
+    irb = Irb.new(workspace, input_method)
+
+
+    @CONF[:MAIN_CONTEXT] = irb.context
+
+    catch(:IRB_EXIT) do
+      irb.eval_input
+    end
+  end
+end
+
+IRB.start_session(binding)
+    )ruby";
+
+    rubyEngine->exec(cmd);
+  }
+
+  void executePythonRepl(ScriptEngineInstance& pythonEngine) {
+    const std::string cmd = R"python(
+import readline # optional, will allow Up/Down/History in the console
+import code
+variables = globals().copy()
+variables.update(locals())
+shell = code.InteractiveConsole(variables)
+shell.interact()
+    )python";
+    pythonEngine->exec(cmd);
+  }
+
 }  // namespace cli
 }  // namespace openstudio
diff --git a/src/cli/UpdateCommand.hpp b/src/cli/UpdateCommand.hpp
index 7cb1ceb3d95..ef9eed1958e 100644
--- a/src/cli/UpdateCommand.hpp
+++ b/src/cli/UpdateCommand.hpp
@@ -22,6 +22,9 @@ namespace cli {
 
   void executeGemListCommand(ScriptEngineInstance& rubyEngine);
 
+  void executeRubyRepl(ScriptEngineInstance& rubyEngine);
+  void executePythonRepl(ScriptEngineInstance& pythonEngine);
+
 }  // namespace cli
 }  // namespace openstudio
 
diff --git a/src/cli/main.cpp b/src/cli/main.cpp
index 0763eaf614a..920510f5c12 100644
--- a/src/cli/main.cpp
+++ b/src/cli/main.cpp
@@ -265,6 +265,16 @@ int main(int argc, char* argv[]) {
     });
     // }
 
+    // {
+    auto* ruby_repl_command = app.add_subcommand("interactive_ruby", "Executes a ruby REPL");
+    ruby_repl_command->callback([&rubyEngine] { openstudio::cli::executeRubyRepl(rubyEngine); });
+    // }
+
+    // {
+    auto* python_repl_command = app.add_subcommand("interactive_python", "Executes a python REPL");
+    python_repl_command->callback([&pythonEngine] { openstudio::cli::executePythonRepl(pythonEngine); });
+    // }
+
     [[maybe_unused]] auto* gem_listCommand = app.add_subcommand("gem_list", "Lists the set gems available to openstudio")->callback([&rubyEngine]() {
       openstudio::cli::executeGemListCommand(rubyEngine);
     });
diff --git a/src/energyplus/CMakeLists.txt b/src/energyplus/CMakeLists.txt
index 36434c2bdf6..111f254b1f0 100644
--- a/src/energyplus/CMakeLists.txt
+++ b/src/energyplus/CMakeLists.txt
@@ -925,7 +925,7 @@ if(BUILD_BENCHMARK)
     message("bench_name=${bench_name}")
     add_executable( ${bench_name} ${bench_file} )
     target_link_libraries(${bench_name}
-      CONAN_PKG::benchmark
+      benchmark::benchmark_main
       openstudiolib
     )
     set_target_properties(${bench_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/benchmark")
diff --git a/src/epjson/CMakeLists.txt b/src/epjson/CMakeLists.txt
index 555def77af1..7518b44780b 100644
--- a/src/epjson/CMakeLists.txt
+++ b/src/epjson/CMakeLists.txt
@@ -44,7 +44,7 @@ CREATE_SRC_GROUPS("${${target_name}_swig_src}")
 if (BUILD_TESTING)
 
   CREATE_TEST_TARGETS(${target_name} "${${target_name}_test_src}" "${${target_name}_test_depends}")
-  target_link_libraries(${target_name}_tests CONAN_PKG::fmt)
+  target_link_libraries(${target_name}_tests fmt::fmt)
 
   # Glob all OSM files in test/ folder
 #  file(GLOB_RECURSE epjson_source_models "${CMAKE_CURRENT_SOURCE_DIR}/test/**/*.osm")
diff --git a/src/generateiddfactory/CMakeLists.txt b/src/generateiddfactory/CMakeLists.txt
index 005f1fe51f0..2534ec76972 100644
--- a/src/generateiddfactory/CMakeLists.txt
+++ b/src/generateiddfactory/CMakeLists.txt
@@ -25,12 +25,12 @@ add_executable(${target_name}
 set_target_properties(${target_name} PROPERTIES COMPILE_DEFINITIONS OPENSTUDIO_DIRECT_INCLUDE)
 
 target_link_libraries(${target_name}
-  CONAN_PKG::boost
-  CONAN_PKG::fmt
-  #CONAN_PKG::boost_filesystem
-  #CONAN_PKG::boost_regex
-  #CONAN_PKG::boost_program_options
-  #CONAN_PKG::boost_crc
+  boost::boost
+  fmt::fmt
+  #Boost::filesystem
+  #Boost::regex
+  #Boost::program_options
+  #boost::boost_crc - not sure where that went
 )
 
 # generate the IddFactory files
diff --git a/src/gltf/CMakeLists.txt b/src/gltf/CMakeLists.txt
index 2f9caae0464..1aa5c36b71c 100644
--- a/src/gltf/CMakeLists.txt
+++ b/src/gltf/CMakeLists.txt
@@ -41,7 +41,7 @@ set(${target_name}_depends ${${target_name}_depends} PARENT_SCOPE)
 
 target_compile_definitions(${target_name} PRIVATE openstudio_gltf_EXPORTS SHARED_OS_LIBS)
 target_link_libraries(${target_name} PUBLIC ${${target_name}_depends})
-target_link_libraries(${target_name} PRIVATE CONAN_PKG::tinygltf)
+target_link_libraries(${target_name} PRIVATE TinyGLTF::TinyGLTF)
 
 add_dependencies(${target_name} GenerateIddFactoryRun)
 
diff --git a/src/install_utility/CMakeLists.txt b/src/install_utility/CMakeLists.txt
index 9d3e605d8db..b9772f06e7e 100644
--- a/src/install_utility/CMakeLists.txt
+++ b/src/install_utility/CMakeLists.txt
@@ -1,8 +1,8 @@
 add_executable(install_utility main.cpp)
 
 target_link_libraries(install_utility
-  CONAN_PKG::boost
-  # CONAN_PKG::boost_filesystem
+  boost::boost
+  # boost::boost_filesystem
 )
 
 if( WIN32 )
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index de88139fd52..83ba28a16a8 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -24,13 +24,13 @@ target_link_libraries(
 target_link_libraries(
  openstudiolib
  INTERFACE
- CONAN_PKG::boost
- CONAN_PKG::jsoncpp
- CONAN_PKG::cpprestsdk
- CONAN_PKG::openssl
- CONAN_PKG::pugixml
- CONAN_PKG::libxml2
- CONAN_PKG::fmt
+ boost::boost
+ JsonCpp::JsonCpp
+ cpprestsdk::cpprestsdk
+ openssl::openssl
+ pugixml::pugixml
+ LibXml2::LibXml2
+ fmt::fmt
 )
 
 target_compile_definitions(openstudiolib INTERFACE "-DSHARED_OS_LIBS")
diff --git a/src/measure/CMakeLists.txt b/src/measure/CMakeLists.txt
index 9a3150b5547..1e4517addfe 100644
--- a/src/measure/CMakeLists.txt
+++ b/src/measure/CMakeLists.txt
@@ -58,7 +58,7 @@ add_dependencies(${target_name} GenerateIddFactoryRun)
 set(${target_name}_test_depends
   ${COREFOUNDATION_LIBRARY}
   openstudiolib
-  CONAN_PKG::fmt
+  fmt::fmt
 )
 
 if( MSVC )
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
index ace62d0374c..9a26b0c54c5 100644
--- a/src/model/CMakeLists.txt
+++ b/src/model/CMakeLists.txt
@@ -2417,8 +2417,8 @@ if(BUILD_BENCHMARK)
     message("bench_name=${bench_name}")
     add_executable( ${bench_name} ${bench_file} )
     target_link_libraries(${bench_name}
-      CONAN_PKG::benchmark
-      CONAN_PKG::fmt
+      benchmark::benchmark_main
+      fmt::fmt
       openstudiolib
     )
     set_target_properties(${bench_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/benchmark")
diff --git a/src/osversion/CMakeLists.txt b/src/osversion/CMakeLists.txt
index 63e6565108b..3259dfb81e0 100644
--- a/src/osversion/CMakeLists.txt
+++ b/src/osversion/CMakeLists.txt
@@ -87,7 +87,7 @@ if(BUILD_BENCHMARK)
     message("bench_name=${bench_name}")
     add_executable( ${bench_name} ${bench_file} )
     target_link_libraries(${bench_name}
-      CONAN_PKG::benchmark
+      benchmark::benchmark_main
       openstudiolib
     )
     set_target_properties(${bench_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/benchmark")
diff --git a/src/utilities/CMakeLists.txt b/src/utilities/CMakeLists.txt
index 6ea99c08af9..8761a741be5 100644
--- a/src/utilities/CMakeLists.txt
+++ b/src/utilities/CMakeLists.txt
@@ -263,10 +263,10 @@ source_group(units FILES ${units_src})
 source_group(documentation FILES ${documentation_src})
 source_group(embedded FILES ${EMBEDDED_OUTPUT})
 
-# Must call CMake itself in order to set the SWIG_LIB env var for add_custom_command
+# Must call CMake itself in order to set the SWIG_DIR env var for add_custom_command
 add_custom_command(
   OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SWIGRubyRuntime.hxx"
-  COMMAND ${CMAKE_COMMAND} -E env SWIG_LIB="${SWIG_LIB}"
+  COMMAND ${CMAKE_COMMAND} -E env SWIG_DIR="${SWIG_DIR}"
           "${SWIG_EXECUTABLE}"
           "-v"
           "-ruby"
@@ -436,18 +436,18 @@ set(${target_name}_swig_src
 
 
 set(${target_name}_depends
-  CONAN_PKG::sqlite3
-  CONAN_PKG::jsoncpp
-  CONAN_PKG::minizip
-  CONAN_PKG::zlib
-  CONAN_PKG::fmt
-  CONAN_PKG::pugixml
-  CONAN_PKG::boost
-  CONAN_PKG::cpprestsdk
-  CONAN_PKG::openssl
-  CONAN_PKG::geographiclib
-  CONAN_PKG::libxml2
-  CONAN_PKG::libxslt
+  SQLite::SQLite3
+  JsonCpp::JsonCpp
+  minizip::minizip
+  ZLIB::ZLIB
+  fmt::fmt
+  pugixml::pugixml
+  boost::boost
+  cpprestsdk::cpprestsdk
+  openssl::openssl
+  GeographicLib::GeographicLib
+  LibXml2::LibXml2
+  libxslt::libxslt
 )
 
 if(WIN32)
@@ -519,7 +519,7 @@ if(HAVE_UNISTD_H)
 endif()
 
 if(BUILD_TESTING)
-  CREATE_TEST_TARGETS(${target_name} "${${target_name}_test_src}" openstudiolib openstudio_model_resources openstudio_energyplus_resources CONAN_PKG::fmt)
+  CREATE_TEST_TARGETS(${target_name} "${${target_name}_test_src}" openstudiolib openstudio_model_resources openstudio_energyplus_resources fmt::fmt)
 endif()
 
 if(BUILD_BENCHMARK)
@@ -541,14 +541,14 @@ if(BUILD_BENCHMARK)
     if (${bench_name} STREQUAL Checksum_Benchmark)
       target_link_libraries(${bench_name}
         PUBLIC
-          CONAN_PKG::benchmark
-          CONAN_PKG::fmt
-          CONAN_PKG::boost
+          benchmark::benchmark_main
+          fmt::fmt
+          boost::boost
       )
     else()
       target_link_libraries(${bench_name}
         PUBLIC
-          CONAN_PKG::benchmark
+          benchmark::benchmark_main
           openstudiolib
           ${${target_name}_depends}
       )
diff --git a/src/workflow/CMakeLists.txt b/src/workflow/CMakeLists.txt
index 23e406f23ec..20017fa2a0d 100644
--- a/src/workflow/CMakeLists.txt
+++ b/src/workflow/CMakeLists.txt
@@ -30,8 +30,8 @@ target_link_libraries(openstudio_workflow PRIVATE openstudiolib)
 if(BUILD_TESTING)
   set(openstudio_workflow_test_depends
     openstudio_workflow
-    CONAN_PKG::boost # Maybe at some point replace with openstudiolib more simply
-    CONAN_PKG::fmt
+    boost::boost # Maybe at some point replace with openstudiolib more simply
+    fmt::fmt
   )
 
   set(openstudio_workflow_test_src


Test patch:
diff --git a/ruby/test/ApplicationPathHelpers_Test.rb b/ruby/test/ApplicationPathHelpers_Test.rb
index 7d7e6ad796c..0bf34e4c8c1 100644
--- a/ruby/test/ApplicationPathHelpers_Test.rb
+++ b/ruby/test/ApplicationPathHelpers_Test.rb
@@ -17,11 +17,11 @@ class ApplicationPathHelpers_Test < MiniTest::Unit::TestCase
 
   def test_energyplus
     ep_dir = OpenStudio::getEnergyPlusDirectory
-    assert(File.exists?(ep_dir.to_s))
+    assert(File.exist?(ep_dir.to_s))
     assert(File.directory?(ep_dir.to_s))
 
     ep = OpenStudio::getEnergyPlusExecutable
-    assert(File.exists?(ep.to_s))
+    assert(File.exist?(ep.to_s))
     assert(!File.directory?(ep.to_s))
     assert(File.executable?(ep.to_s))
   end