diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8508317cb319d80743e7b8ee9fc4724480b640bf..4eca70542a3fd8a016959fea5ae3fcceb0551b0b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,22 +15,25 @@ include(GNUInstallDirs)
 set(CMAKE_CXX_STANDARD 11)
 
 # Third Party Dependencies
-find_package(GSL    REQUIRED)
-find_package(Eigen3 3.3 REQUIRED NO_MODULE)
-find_package(Python REQUIRED COMPONENTS Development)
+find_package(GSL           REQUIRED)
+find_package(Eigen3 3.3    REQUIRED NO_MODULE)
+find_package(Python        REQUIRED COMPONENTS Development)
 find_package(nlohmann_json REQUIRED)
 
 # Library setup
 add_library(ale SHARED
             ${CMAKE_CURRENT_SOURCE_DIR}/src/ale.cpp)
+# Alias a scoped target for safer linking in downstream projects
+set(ALE_HEADERS "include/ale.h")
 set_target_properties(ale PROPERTIES
-    VERSION ${PROJECT_VERSION}
-    SOVERSION 1)
-set(ALE_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include/")
-
+                      VERSION       ${PROJECT_VERSION}
+                      SOVERSION     0
+                      PUBLIC_HEADER ${ALE_HEADERS})
+# Use generator expressions so that downstream projects can use this target
 target_include_directories(ale
                            PUBLIC
-                           ${ALE_INCLUDE_DIRS})
+                           $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+                           $<INSTALL_INTERFACE:include>)
 
 target_link_libraries(ale
                       PRIVATE
@@ -60,6 +63,22 @@ if(BUILD_TESTS)
     endif()
 endif()
 
-# Install commands
-install(TARGETS ale LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
-install(DIRECTORY ${ALE_INCLUDE_DIRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+# Generate the package config
+configure_file(cmake/config.cmake.in
+               ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
+               @ONLY)
+
+# Install the package config
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
+              DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
+
+# Install the library
+install(TARGETS ale
+        EXPORT aleTargets
+        LIBRARY       DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+# Install the target
+install(EXPORT aleTargets
+        NAMESPACE ale::
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..c223d95f1b1151f594611a979ae3b82b13f2560d
--- /dev/null
+++ b/cmake/config.cmake.in
@@ -0,0 +1,7 @@
+include(FindPackageHandleStandardArgs)
+set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE})
+find_package_handle_standard_args(@PROJECT_NAME@ CONFIG_MODE)
+
+if(NOT TARGET @PROJECT_NAME@::ale)
+    include("${CMAKE_CURRENT_LIST_DIR}/aleTargets.cmake")
+endif()