diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5054cd361d0980bb963bdf173831a02649b9eded..6d444fec2cdd41d95728af6e37117ddd9ac16b91 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,6 @@ set(CMAKE_C_STANDARD 11)
 include(CTest)
 include(CheckIncludeFile)
 
-
 # Finding libraries
 ### -------------- Pthread ---------------------------
 
@@ -17,6 +16,7 @@ if(${CDI_PTHREAD})
   find_package(Threads REQUIRED)
   set_target_properties(Threads::Threads PROPERTIES THREADS_PREFER_PTHREAD_FLAG TRUE)
   list(APPEND cdi_compile_defs HAVE_PTHREAD=1)
+  list(APPEND cdi_linked_libs pthread)
 endif()
 
 # enable default internal libs
@@ -45,7 +45,6 @@ if(${CDI_SERVICE})
   list(APPEND cdi_compile_defs HAVE_LIBSERVICE=1)
 endif()
 
-
 # ecCodes
 option(CDI_ECCODES "Use the eccodes library [default=ON]" ON)
 if(${CDI_ECCODES} OR eccodes_ROOT)
@@ -53,6 +52,7 @@ if(${CDI_ECCODES} OR eccodes_ROOT)
   if (${eccodes_FOUND})
     list(APPEND cdi_compile_defs HAVE_LIBGRIB_API=${eccodes_FOUND})
     message(VERBOSE "added compile definition HAVE_LIBGRIB_API=${eccodes_FOUND}")
+    list(APPEND cdi_linked_libs eccodes)
   else()
     message(WARNING "eccodes not found, compiling without eccodes")
   endif ()
@@ -70,6 +70,7 @@ if(${CDI_NETCDF} OR netCDF_ROOT )
       HAVE_LIBGRIB_API=${netCDF_FOUND}
       HAVE_LIBGRIB=${netCDF_FOUND}
     )
+    list(APPEND cdi_linked_libs netCDF::netcdf)
   else()
     message(WARNING "netcdf target not found, compiling without netcdf")
   endif ()
@@ -82,8 +83,13 @@ message(VERBOSE "looking for config.h in: ${PROJECT_BINARY_DIR}/src")
 list(APPEND cdi_compile_defs CDI=1 CDI_SIZE_TYPE=size_t PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}")
 add_subdirectory(src)
 
-#tests
-add_subdirectory(app)
-add_subdirectory(tests)
-
+#app
+option(CDI_BUILD_APP "Build the app" ON)
+if (CDI_BUILD_APP)
+  add_subdirectory(app)
+endif ()
 
+#tests
+if (BUILD_TESTING)
+  add_subdirectory(tests)
+endif ()
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index ff3047c998e1452196ce33d84efc7db3088ef98b..4264972e74952dfc37e3368f88c30b0ced8ecc6e 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -7,6 +7,6 @@ target_include_directories(cdi PRIVATE
   $<INSTALL_INTERFACE:include
 )
 
-target_link_libraries(cdi PRIVATE cdilib netCDF::netcdf pthread)
+target_link_libraries(cdi PRIVATE cdilib ${cdi_linked_libs})
 target_include_directories(cdi PRIVATE "${PROJECT_BINARY_DIR}/src/config.h")
 target_compile_definitions(cdi PRIVATE  ${cdi_netcdf_definitions})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8328f34e5016f9d80817a13c45f0a907e2c33801..26ea963f1b0e27f9204c6cf8a2473d665a556bda 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -190,17 +190,44 @@ list( APPEND cdi_unknown
   resource_unpack.h
 )
 
+option(CDI_BUILD_UNKNOWN "Build unknown sources in libcdi" ON)
+mark_as_advanced(CDI_BUILD_UNKNOWN)
+if (CDI_BUILD_UNKNOWN)
+  list(APPEND cdi_src_files ${cdi_unknown})
+endif ()
+
 # Support exporting all symbolds on Windows
 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
 
 add_library(cdilib
-  ${cdi_src_files} ${cdi_unknown}
+  ${cdi_src_files}
 #  INSTALL_HEADERS_LIST  cdi.h
 )
 
 target_include_directories(cdilib PRIVATE "${PROJECT_BINARY_DIR}/src/config.h")
-target_link_libraries(cdilib eccodes netCDF::netcdf)
+target_link_libraries(cdilib ${cdi_linked_libs})
 target_compile_definitions(cdilib PRIVATE PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}" ${cdi_compile_defs})
 
 add_library(cdilib::cdilib ALIAS cdilib)
 
+include(GNUInstallDirs)
+install(FILES cdi.h calendar.h cdi_datetime.h julian_date.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+install(TARGETS cdilib
+  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cdi/cdi-config.cmake.in" "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
+  INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
+write_basic_package_version_file(
+  "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
+  VERSION "${PACKAGE_VERSION}"
+  COMPATIBILITY SameMajorVersion)
+install(
+  FILES
+    "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
+    "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
+  DESTINATION
+    "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
diff --git a/src/cmake/cdi/cdi-config.cmake.in b/src/cmake/cdi/cdi-config.cmake.in
index e34cb86e5e2ca978fc9b156b5277ba1b2eaa8502..f2f972547906a2212567d9e37c5b8461363df4b6 100644
--- a/src/cmake/cdi/cdi-config.cmake.in
+++ b/src/cmake/cdi/cdi-config.cmake.in
@@ -1,9 +1,9 @@
 # Config file for lib CDI project
 # run cmake with CDI_DIR pointing to the directory containing this file.
 
-# set(CDI_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
+set(CDI_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..")
 # use following line instead of previous if this file can be configured 
-set(CDI_ROOT_DIR "@prefix@")
+# set(CDI_ROOT_DIR "@prefix@")
 
 find_path(CDI_INCLUDE_DIRECTORY
   cdi.h
@@ -15,7 +15,7 @@ find_path(CDI_INCLUDE_DIRECTORY
 mark_as_advanced(CDI_INCLUDE_DIRECTORY)
 
 find_library(CDI_LIBRARY
-  NAMES cdi
+  NAMES cdilib
   PATHS "${CDI_ROOT_DIR}/lib"
   # use following line instead of previous if this file can be configured 
   # PATHS "@libdir@"
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index cf18bbac6f3fe2a57236f2f68722ee26ea97c9a2..2e02cf49b4dee098c5d3cc809d18159f47944de3 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -31,11 +31,11 @@ list(APPEND test_lib_src
 
 add_library(test_lib ${test_lib_src})
 target_include_directories(test_lib PRIVATE ../src/)
-target_link_libraries(test_lib PRIVATE cdilib eccodes)
+target_link_libraries(test_lib PRIVATE cdilib ${cdi_linked_libs})
 
 foreach(target ${current_targets})
   target_include_directories(${target} PRIVATE ../src/)
-  target_link_libraries(${target} PRIVATE cdilib test_lib ${netCDF_LIBRARIES} )
+  target_link_libraries(${target} PRIVATE cdilib test_lib ${cdi_linked_libs})
   add_test(NAME ${target} COMMAND ${target})
   if(labels_${target})
     set_property(TEST ${target} PROPERTY LABELS labels_${target})