Added install target and cmake package exports (#83)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f4bc002..fe605bf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,10 +4,14 @@
 project(inja LANGUAGES CXX VERSION 2.0.0)
 
 
+option(INJA_USE_EMBEDDED_JSON "Use the shipped json header if not available on the system" ON)
+option(INJA_INSTALL "Generate install targets for inja" ON)
+option(INJA_EXPORT "Export the current build tree to the package registry" ON)
 option(BUILD_TESTS "Build the inja unit tests" ON)
 option(BUILD_BENCHMARK "Build the inja benchmark" ON)
 option(COVERALLS "Generate coveralls data" OFF)
 
+set(INJA_INSTALL_INCLUDE_DIR "include")
 
 set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
@@ -25,8 +29,43 @@
 
 
 add_library(inja INTERFACE)
-target_include_directories(inja INTERFACE include)
+add_library(pantor::inja ALIAS inja)
 
+target_include_directories(inja INTERFACE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+  $<INSTALL_INTERFACE:${INJA_INSTALL_INCLUDE_DIR}>
+)
+
+target_compile_features(inja INTERFACE cxx_std_11)
+
+set(INJA_PACKAGE_USE_EMBEDDED_JSON OFF)
+
+if(INJA_USE_EMBEDDED_JSON)
+  find_package(nlohmann_json QUIET)
+  if (NOT nlohmann_json_FOUND)
+    set(INJA_PACKAGE_USE_EMBEDDED_JSON ON)
+    add_library(nlohmann_json INTERFACE)
+    add_library(pantor::nlohmann_json ALIAS nlohmann_json)
+
+    target_include_directories(nlohmann_json INTERFACE
+      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/third_party/include>
+      $<INSTALL_INTERFACE:${INJA_INSTALL_INCLUDE_DIR}/inja/json/include>
+    )
+
+    target_compile_features(nlohmann_json INTERFACE cxx_std_11)
+
+    install(TARGETS nlohmann_json EXPORT injaTargets)
+
+    set(INJA_SELECTED_JSON_LIBRARY "pantor::nlohmann_json")
+  else()
+    set(INJA_SELECTED_JSON_LIBRARY "nlohmann_json::nlohmann_json")
+  endif()
+else()
+  find_package(nlohmann_json REQUIRED)
+  set(INJA_SELECTED_JSON_LIBRARY "nlohmann_json::nlohmann_json")
+endif()
+
+target_link_libraries(inja INTERFACE ${INJA_SELECTED_JSON_LIBRARY})
 
 execute_process(COMMAND python3 amalgamate/amalgamate.py -c amalgamate/config.json -s include WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
 
@@ -57,7 +96,7 @@
 
 
   add_library(single_inja INTERFACE)
-  target_include_directories(single_inja INTERFACE single_include include)
+  target_include_directories(single_inja INTERFACE single_include include third_party/include)
 
   add_executable(single_inja_test
     test/unit.cpp
@@ -74,3 +113,69 @@
   add_executable(inja_benchmark test/benchmark.cpp)
   target_link_libraries(inja_benchmark PRIVATE inja)
 endif()
+
+include(CMakePackageConfigHelpers)
+
+write_basic_package_version_file(
+  "${CMAKE_CURRENT_BINARY_DIR}/injaConfigVersion.cmake"
+  VERSION ${PROJECT_VERSION}
+  COMPATIBILITY SameMajorVersion
+)
+
+# build tree package config
+configure_file(
+  cmake/config/injaBuildConfig.cmake.in
+  injaConfig.cmake
+  @ONLY
+)
+
+install(TARGETS inja EXPORT injaTargets)
+
+export(
+  EXPORT injaTargets
+  NAMESPACE pantor::
+  FILE "${CMAKE_CURRENT_BINARY_DIR}/injaTargets.cmake"
+)
+  
+# build tree package config
+configure_file(
+  cmake/config/injaBuildConfig.cmake.in
+  injaConfig.cmake
+  @ONLY
+)
+
+if (INJA_INSTALL)
+  set(INJA_CONFIG_PATH "lib/cmake/inja")
+
+  # install tree package config
+  configure_package_config_file(
+    cmake/config/injaConfig.cmake.in
+    ${INJA_CONFIG_PATH}/injaConfig.cmake
+    INSTALL_DESTINATION ${INJA_CONFIG_PATH}
+    NO_CHECK_REQUIRED_COMPONENTS_MACRO
+  )
+
+  install(DIRECTORY include/inja DESTINATION ${INJA_INSTALL_INCLUDE_DIR} FILES_MATCHING PATTERN "*.hpp")
+  install(FILES
+    "${CMAKE_CURRENT_SOURCE_DIR}/third_party/include/nlohmann/json.hpp"
+    "${CMAKE_CURRENT_SOURCE_DIR}/third_party/include/nlohmann/LICENSE.MIT"
+    DESTINATION "${INJA_INSTALL_INCLUDE_DIR}/inja/json/include/nlohmann"
+  )
+
+  install(
+    FILES 
+      "${CMAKE_CURRENT_BINARY_DIR}/${INJA_CONFIG_PATH}/injaConfig.cmake"
+      "${CMAKE_CURRENT_BINARY_DIR}/injaConfigVersion.cmake"
+    DESTINATION ${INJA_CONFIG_PATH}
+  )
+
+  install(
+    EXPORT injaTargets FILE injaTargets.cmake
+    NAMESPACE pantor::
+    DESTINATION ${INJA_CONFIG_PATH}
+  )
+endif()
+
+if (INJA_EXPORT)
+  export(PACKAGE inja)
+endif()
diff --git a/cmake/config/injaBuildConfig.cmake.in b/cmake/config/injaBuildConfig.cmake.in
new file mode 100644
index 0000000..ccbc2ae
--- /dev/null
+++ b/cmake/config/injaBuildConfig.cmake.in
@@ -0,0 +1,11 @@
+set(INJA_VERSION "@PROJECT_VERSION@")
+
+set(INJA_PACKAGE_USE_EMBEDDED_JSON "@INJA_PACKAGE_USE_EMBEDDED_JSON@")
+
+include(CMakeFindDependencyMacro)
+
+if(NOT INJA_PACKAGE_USE_EMBEDDED_JSON)
+    find_dependency(nlohmann_json REQUIRED)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/injaTargets.cmake")
diff --git a/cmake/config/injaConfig.cmake.in b/cmake/config/injaConfig.cmake.in
new file mode 100644
index 0000000..ea81ef6
--- /dev/null
+++ b/cmake/config/injaConfig.cmake.in
@@ -0,0 +1,12 @@
+@PACKAGE_INIT@
+set(INJA_VERSION "@PROJECT_VERSION@")
+
+set(INJA_PACKAGE_USE_EMBEDDED_JSON "@INJA_PACKAGE_USE_EMBEDDED_JSON@")
+
+include(CMakeFindDependencyMacro)
+
+if(NOT INJA_PACKAGE_USE_EMBEDDED_JSON)
+    find_dependency(nlohmann_json REQUIRED)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/injaTargets.cmake")
diff --git a/meson.build b/meson.build
index e823b7a..666e2d8 100644
--- a/meson.build
+++ b/meson.build
@@ -6,7 +6,7 @@
 
 
 inja_dep = declare_dependency(
-  include_directories: include_directories('include')
+  include_directories: include_directories('include', 'third_party/include')
 )
 
 
diff --git a/include/nlohmann/LICENSE.MIT b/third_party/include/nlohmann/LICENSE.MIT
similarity index 100%
rename from include/nlohmann/LICENSE.MIT
rename to third_party/include/nlohmann/LICENSE.MIT
diff --git a/include/nlohmann/json.hpp b/third_party/include/nlohmann/json.hpp
similarity index 100%
rename from include/nlohmann/json.hpp
rename to third_party/include/nlohmann/json.hpp