Make sure add_subdirectory and find_package behave identically

Add a BUILD_INTERFACE and a pybind11::pybind11 alias for the interface
library to match the installed target.

Add new cmake tests for add_subdirectory and consolidates the
.cpp and .py files needed for the cmake build tests:

Before:
tests
|-- test_installed_module
|   |-- CMakeLists.txt
|   |-- main.cpp
|   \-- test.py
\-- test_installed_target
    |-- CMakeLists.txt
    |-- main.cpp
    \-- test.py

After:
tests
\-- test_cmake_build
    |-- installed_module/CMakeLists.txt
    |-- installed_target/CMakeLists.txt
    |-- subdirectory_module/CMakeLists.txt
    |-- subdirectory_target/CMakeLists.txt
    |-- main.cpp
    \-- test.py
diff --git a/.appveyor.yml b/.appveyor.yml
index 740bd5c..15a7933 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -30,4 +30,5 @@
 - cmake -A "%CMAKE_ARCH%" -DPYBIND11_WERROR=ON
 - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
 - cmake --build . --config Release --target pytest -- /v:m /logger:%MSBuildLogger%
-- cmake --build . --config Release --target test_install -- /v:m /logger:%MSBuildLogger%
+- cmake --build . --config Release --target test_cmake_build -- /v:m /logger:%MSBuildLogger%
+on_failure: type tests\test_cmake_build\*.log
diff --git a/.travis.yml b/.travis.yml
index d4bdafd..ccaa6b4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -135,6 +135,7 @@
     -DPYBIND11_CPP_STANDARD=$CPP
     -DPYBIND11_WERROR=ON
 - $SCRIPT_RUN_PREFIX make pytest -j 2
-- $SCRIPT_RUN_PREFIX make test_install
+- $SCRIPT_RUN_PREFIX make test_cmake_build
+after_failure: cat tests/test_cmake_build/*.log
 after_script:
 - if [ -n "$DOCKER" ]; then docker stop "$containerid"; docker rm "$containerid"; fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 28012b8..4fd68ed 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -85,15 +85,22 @@
   endif()
 endforeach()
 set(${PROJECT_NAME}_VERSION ${PYBIND11_VERSION_MAJOR}.${PYBIND11_VERSION_MINOR}.${PYBIND11_VERSION_PATCH})
+message(STATUS "pybind11 v${${PROJECT_NAME}_VERSION}")
 
 if(NOT (CMAKE_VERSION VERSION_LESS 3.0))  # CMake >= 3.0
   # Build an interface library target:
   add_library(pybind11 INTERFACE)
   target_include_directories(pybind11 INTERFACE $<BUILD_INTERFACE:${PYBIND11_INCLUDE_DIR}>
+                                                $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>
                                                 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
-  if(APPLE)
-      target_link_libraries(pybind11 INTERFACE "-undefined dynamic_lookup")
+  if(WIN32 OR CYGWIN)
+    target_link_libraries(pybind11 INTERFACE $<BUILD_INTERFACE:${PYTHON_LIBRARIES}>)
+  elseif(APPLE)
+    target_link_libraries(pybind11 INTERFACE "-undefined dynamic_lookup")
   endif()
+  target_compile_options(pybind11 INTERFACE $<BUILD_INTERFACE:${PYBIND11_CPP_STANDARD}>)
+
+  add_library(pybind11::pybind11 ALIAS pybind11)  # to match exported target
 endif()
 
 if (PYBIND11_INSTALL)
@@ -120,6 +127,5 @@
     install(EXPORT "${PROJECT_NAME}Targets"
             NAMESPACE "${PROJECT_NAME}::"
             DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
-    message(STATUS "Exporting ${PROJECT_NAME}::pybind11 interface library target version ${${PROJECT_NAME}_VERSION}")
   endif()
 endif()
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 27cb652..1229acc 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -105,55 +105,57 @@
     COMMAND ${CMAKE_COMMAND} -E echo "Note: not all tests run: -DPYBIND11_TEST_OVERRIDE is in effect")
 endif()
 
-# test use of installation
-if(PYBIND11_INSTALL)
-  # 2.8.12 needed for test_installed_module
-  # 3.0 needed for interface library for test_installed_target
-  # 3.1 needed for cmake -E env for testing
-  if(NOT CMAKE_VERSION VERSION_LESS 3.1)
-    add_custom_target(test_installed_target
-      COMMAND ${CMAKE_COMMAND}
-              "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/test_install"
-              -P "${PROJECT_BINARY_DIR}/cmake_install.cmake"
-      COMMAND ${CMAKE_CTEST_COMMAND}
-              --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/test_installed_target"
-                               "${CMAKE_CURRENT_BINARY_DIR}/test_installed_target"
-              --build-noclean
-              --build-generator ${CMAKE_GENERATOR}
-              $<$<BOOL:${CMAKE_GENERATOR_PLATFORM}>:--build-generator-platform> ${CMAKE_GENERATOR_PLATFORM}
-              --build-makeprogram ${CMAKE_MAKE_PROGRAM}
-              --build-target check
-              --build-options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/test_install"
-                              "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
-                              "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}"
-                              "-DPYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}"
-    )
-    add_custom_target(test_installed_module
-      COMMAND ${CMAKE_COMMAND}
-              "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/test_install"
-              -P "${PROJECT_BINARY_DIR}/cmake_install.cmake"
-      COMMAND ${CMAKE_CTEST_COMMAND}
-              --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/test_installed_module"
-                               "${CMAKE_CURRENT_BINARY_DIR}/test_installed_module"
-              --build-noclean
-              --build-generator ${CMAKE_GENERATOR}
-              $<$<BOOL:${CMAKE_GENERATOR_PLATFORM}>:--build-generator-platform> ${CMAKE_GENERATOR_PLATFORM}
-              --build-makeprogram ${CMAKE_MAKE_PROGRAM}
-              --build-target check
-              --build-options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/test_install"
-                              "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
-                              "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}"
-                              "-DPYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}"
-    )
-  else()
-    add_custom_target(test_installed_target)
-    add_custom_target(test_installed_module)
-  endif()
-  add_custom_target(test_install)
-  add_dependencies(test_install test_installed_target test_installed_module)
-endif()
-
 # And another to show the .so size and, if a previous size, compare it:
 add_custom_command(TARGET pybind11_tests POST_BUILD
-    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/libsize.py
-        $<TARGET_FILE:pybind11_tests> ${CMAKE_CURRENT_BINARY_DIR}/sosize-$<TARGET_FILE_NAME:pybind11_tests>.txt)
+  COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/libsize.py
+  $<TARGET_FILE:pybind11_tests> ${CMAKE_CURRENT_BINARY_DIR}/sosize-$<TARGET_FILE_NAME:pybind11_tests>.txt)
+
+# Test CMake build using functions and targets from subdirectory or installed location
+add_custom_target(test_cmake_build)
+if(NOT CMAKE_VERSION VERSION_LESS 3.1)
+  # 3.0 needed for interface library for subdirectory_target/installed_target
+  # 3.1 needed for cmake -E env for testing
+
+  include(CMakeParseArguments)
+  function(pybind11_add_build_test name)
+    cmake_parse_arguments(ARG "INSTALL" "" "" ${ARGN})
+
+    set(build_options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/mock_install"
+                      "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
+                      "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}"
+                      "-DPYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}")
+    if(NOT ARG_INSTALL)
+      list(APPEND build_options "-DPYBIND11_PROJECT_DIR=${PROJECT_SOURCE_DIR}")
+    endif()
+
+    add_custom_target(test_${name} ${CMAKE_CTEST_COMMAND}
+      --quiet --output-log test_cmake_build/${name}.log
+      --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/test_cmake_build/${name}"
+                       "${CMAKE_CURRENT_BINARY_DIR}/test_cmake_build/${name}"
+      --build-config Release
+      --build-noclean
+      --build-generator ${CMAKE_GENERATOR}
+      $<$<BOOL:${CMAKE_GENERATOR_PLATFORM}>:--build-generator-platform> ${CMAKE_GENERATOR_PLATFORM}
+      --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+      --build-target check
+      --build-options ${build_options}
+    )
+    if(ARG_INSTALL)
+      add_dependencies(test_${name} mock_install)
+    endif()
+    add_dependencies(test_cmake_build test_${name})
+  endfunction()
+
+  pybind11_add_build_test(subdirectory_function)
+  pybind11_add_build_test(subdirectory_target)
+
+  if(PYBIND11_INSTALL)
+    add_custom_target(mock_install ${CMAKE_COMMAND}
+      "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/mock_install"
+      -P "${PROJECT_BINARY_DIR}/cmake_install.cmake"
+    )
+
+    pybind11_add_build_test(installed_function INSTALL)
+    pybind11_add_build_test(installed_target INSTALL)
+  endif()
+endif()
diff --git a/tests/test_cmake_build/installed_function/CMakeLists.txt b/tests/test_cmake_build/installed_function/CMakeLists.txt
new file mode 100644
index 0000000..ff0b32e
--- /dev/null
+++ b/tests/test_cmake_build/installed_function/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(test_installed_module CXX)
+
+set(CMAKE_MODULE_PATH "")
+
+find_package(pybind11 CONFIG REQUIRED)
+message(STATUS "Found pybind11 v${pybind11_VERSION}: ${pybind11_INCLUDE_DIRS}")
+
+pybind11_add_module(test_cmake_build SHARED ../main.cpp)
+
+add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_cmake_build>
+                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/../test.py ${PROJECT_NAME})
diff --git a/tests/test_cmake_build/installed_target/CMakeLists.txt b/tests/test_cmake_build/installed_target/CMakeLists.txt
new file mode 100644
index 0000000..e09a2fa
--- /dev/null
+++ b/tests/test_cmake_build/installed_target/CMakeLists.txt
@@ -0,0 +1,18 @@
+cmake_minimum_required(VERSION 3.0)
+project(test_installed_target CXX)
+
+set(CMAKE_MODULE_PATH "")
+
+find_package(pybind11 CONFIG REQUIRED)
+message(STATUS "Found pybind11 v${pybind11_VERSION}: ${pybind11_INCLUDE_DIRS}")
+
+add_library(test_cmake_build MODULE ../main.cpp)
+
+target_link_libraries(test_cmake_build PRIVATE pybind11::pybind11)
+
+# make sure result is, for example, test_installed_target.so, not libtest_installed_target.dylib
+set_target_properties(test_cmake_build PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
+                                                  SUFFIX "${PYTHON_MODULE_EXTENSION}")
+
+add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_cmake_build>
+                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/../test.py ${PROJECT_NAME})
diff --git a/tests/test_installed_target/main.cpp b/tests/test_cmake_build/main.cpp
similarity index 61%
rename from tests/test_installed_target/main.cpp
rename to tests/test_cmake_build/main.cpp
index 2a84c11..e0f5b69 100644
--- a/tests/test_installed_target/main.cpp
+++ b/tests/test_cmake_build/main.cpp
@@ -1,8 +1,8 @@
 #include <pybind11/pybind11.h>
 namespace py = pybind11;
 
-PYBIND11_PLUGIN(test_installed_target) {
-    py::module m("test_installed_target");
+PYBIND11_PLUGIN(test_cmake_build) {
+    py::module m("test_cmake_build");
 
     m.def("add", [](int i, int j) { return i + j; });
 
diff --git a/tests/test_cmake_build/subdirectory_function/CMakeLists.txt b/tests/test_cmake_build/subdirectory_function/CMakeLists.txt
new file mode 100644
index 0000000..71b7735
--- /dev/null
+++ b/tests/test_cmake_build/subdirectory_function/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(test_subdirectory_module CXX)
+
+add_subdirectory(${PYBIND11_PROJECT_DIR} pybind11)
+pybind11_add_module(test_cmake_build ../main.cpp)
+
+add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_cmake_build>
+                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/../test.py ${PROJECT_NAME})
diff --git a/tests/test_cmake_build/subdirectory_target/CMakeLists.txt b/tests/test_cmake_build/subdirectory_target/CMakeLists.txt
new file mode 100644
index 0000000..ee3f489
--- /dev/null
+++ b/tests/test_cmake_build/subdirectory_target/CMakeLists.txt
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.0)
+project(test_subdirectory_target CXX)
+
+add_subdirectory(${PYBIND11_PROJECT_DIR} pybind11)
+
+add_library(test_cmake_build MODULE ../main.cpp)
+
+target_link_libraries(test_cmake_build PRIVATE pybind11::pybind11)
+
+# make sure result is, for example, test_installed_target.so, not libtest_installed_target.dylib
+set_target_properties(test_cmake_build PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
+                                                  SUFFIX "${PYTHON_MODULE_EXTENSION}")
+
+add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_cmake_build>
+                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/../test.py ${PROJECT_NAME})
diff --git a/tests/test_cmake_build/test.py b/tests/test_cmake_build/test.py
new file mode 100644
index 0000000..1467a61
--- /dev/null
+++ b/tests/test_cmake_build/test.py
@@ -0,0 +1,5 @@
+import sys
+import test_cmake_build
+
+assert test_cmake_build.add(1, 2) == 3
+print("{} imports, runs, and adds: 1 + 2 = 3".format(sys.argv[1]))
diff --git a/tests/test_installed_module/CMakeLists.txt b/tests/test_installed_module/CMakeLists.txt
deleted file mode 100644
index 77fd49d..0000000
--- a/tests/test_installed_module/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-cmake_minimum_required(VERSION 2.8.12)
-project(test_installed_module CXX)
-
-set(CMAKE_MODULE_PATH "")
-
-find_package(pybind11 CONFIG REQUIRED)
-
-message(STATUS "Found pybind11: ${pybind11_INCLUDE_DIRS} (found version ${pybind11_VERSION})")
-message(STATUS "Found Python: ${PYTHON_INCLUDE_DIRS} (found version ${PYTHON_VERSION_STRING})")
-
-pybind11_add_module(test_installed_module SHARED main.cpp)
-
-add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_installed_module>
-                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/test.py)
diff --git a/tests/test_installed_module/main.cpp b/tests/test_installed_module/main.cpp
deleted file mode 100644
index a0bda45..0000000
--- a/tests/test_installed_module/main.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <pybind11/pybind11.h>
-namespace py = pybind11;
-
-PYBIND11_PLUGIN(test_installed_module) {
-    py::module m("test_installed_module");
-
-    m.def("add", [](int i, int j) { return i + j; });
-
-    return m.ptr();
-}
diff --git a/tests/test_installed_module/test.py b/tests/test_installed_module/test.py
deleted file mode 100644
index 2f06320..0000000
--- a/tests/test_installed_module/test.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import test_installed_module
-assert test_installed_module.add(11, 22) == 33
-print('test_installed_module imports, runs, and adds: 11 + 22 = 33')
diff --git a/tests/test_installed_target/CMakeLists.txt b/tests/test_installed_target/CMakeLists.txt
deleted file mode 100644
index 4333dc1..0000000
--- a/tests/test_installed_target/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-cmake_minimum_required(VERSION 3.0)
-project(test_installed_target CXX)
-
-set(CMAKE_MODULE_PATH "")
-
-find_package(pybind11 CONFIG REQUIRED)
-
-message(STATUS "Found pybind11: ${pybind11_INCLUDE_DIRS} (found version ${pybind11_VERSION})")
-message(STATUS "Found Python: ${PYTHON_INCLUDE_DIRS} (found version ${PYTHON_VERSION_STRING})")
-
-add_library(test_installed_target MODULE main.cpp)
-
-target_link_libraries(test_installed_target PRIVATE pybind11::pybind11)
-
-# make sure result is, for example, test_installed_target.so, not libtest_installed_target.dylib
-set_target_properties(test_installed_target PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
-                                                       SUFFIX "${PYTHON_MODULE_EXTENSION}")
-
-add_custom_target(check ${CMAKE_COMMAND} -E env PYTHONPATH=$<TARGET_FILE_DIR:test_installed_target>
-                  ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/test.py)
diff --git a/tests/test_installed_target/test.py b/tests/test_installed_target/test.py
deleted file mode 100644
index b2888a7..0000000
--- a/tests/test_installed_target/test.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import test_installed_target
-assert test_installed_target.add(1, 2) == 3
-print('test_installed_target imports, runs, and adds: 1 + 2 = 3')
diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake
index 4922982..d629a6f 100644
--- a/tools/pybind11Tools.cmake
+++ b/tools/pybind11Tools.cmake
@@ -85,6 +85,11 @@
     # import time.
 
     target_link_libraries(${target_name} PRIVATE "-undefined dynamic_lookup")
+
+    if(${lib_type} STREQUAL "SHARED")
+      # Suppress CMake >= 3.0 warning for shared libraries
+      set_target_properties(${target_name} PROPERTIES MACOSX_RPATH ON)
+    endif()
   endif()
 
   select_cxx_standard()