Update CMake build documentation
diff --git a/docs/compiling.rst b/docs/compiling.rst
index 5f4d098..5800694 100644
--- a/docs/compiling.rst
+++ b/docs/compiling.rst
@@ -26,146 +26,28 @@
 Building with CMake
 ===================
 
-For C++ codebases that already have an existing CMake-based build system, the
-following snippet should be a good starting point to create bindings across
-platforms. It assumes that the code is located in a file named
-:file:`example.cpp`, and that the pybind11 repository is located in a
-subdirectory named :file:`pybind11`.
+For C++ codebases that have an existing CMake-based build system, a Python 
+extension module can be created with just a few lines of code:
 
 .. code-block:: cmake
 
-    cmake_minimum_required(VERSION 2.8)
-
+    cmake_minimum_required(VERSION 2.8.12)
     project(example)
 
-    # Add a CMake parameter for choosing a desired Python version
-    set(EXAMPLE_PYTHON_VERSION "" CACHE STRING
-        "Python version to use for compiling the example library")
+    add_subdirectory(pybind11)
+    pybind11_add_module(example example.cpp)
 
-    include(CheckCXXCompilerFlag)
+This assumes that the pybind11 repository is located in a subdirectory named 
+:file:`pybind11` and that the code is located in a file named :file:`example.cpp`.
+The CMake command ``add_subdirectory`` will import a function with the signature
+``pybind11_add_module(<name> source1 [source2 ...])``. It will take care of all
+the details needed to build a Python extension module on any platform.
 
-    # Set a default build configuration if none is specified.
-    # 'MinSizeRel' produces the smallest binaries
-    if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
-      message(STATUS "Setting build type to 'MinSizeRel' as none was specified.")
-      set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING "Choose the type of build." FORCE)
-      set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
-        "MinSizeRel" "RelWithDebInfo")
-    endif()
-    string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
+The target Python version can be selected by setting the ``PYBIND11_PYTHON_VERSION`` 
+variable before adding the pybind11 subdirectory. Alternatively, an exact Python 
+installation can be specified by setting ``PYTHON_EXECUTABLE``.
 
-    # Try to autodetect Python (can be overridden manually if needed)
-    set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7)
-    if (NOT ${EXAMPLE_PYTHON_VERSION} STREQUAL "")
-      find_package(PythonLibs ${EXAMPLE_PYTHON_VERSION} EXACT)
-      if (NOT PYTHONLIBS_FOUND)
-        find_package(PythonLibs ${EXAMPLE_PYTHON_VERSION} REQUIRED)
-      endif()
-    else()
-      find_package(PythonLibs REQUIRED)
-    endif()
+A working sample project, including a way to invoke CMake from :file:`setup.py` for
+PyPI integration, can be found in the [cmake_example]_  repository.
 
-    # The above sometimes returns version numbers like "3.4.3+";
-    # the "+" must be removed for the next lines to work
-    string(REPLACE "+" "" PYTHONLIBS_VERSION_STRING "+${PYTHONLIBS_VERSION_STRING}")
-
-    # Uncomment the following line if you will also require a matching Python interpreter
-    # find_package(PythonInterp ${PYTHONLIBS_VERSION_STRING} EXACT REQUIRED)
-
-    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
-      CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG)
-      CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG)
-
-      if (HAS_CPP14_FLAG)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
-      elseif (HAS_CPP11_FLAG)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-      else()
-        message(FATAL_ERROR "Unsupported compiler -- at least C++11 support is needed!")
-      endif()
-
-      # Enable link time optimization and set the default symbol
-      # visibility to hidden (very important to obtain small binaries)
-      if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
-        # Default symbol visibility
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
-
-        # Check for Link Time Optimization support
-        CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG)
-        if (HAS_LTO_FLAG)
-          set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
-        endif()
-      endif()
-    endif()
-
-    # Include path for Python header files
-    include_directories(${PYTHON_INCLUDE_DIR})
-
-    # Include path for pybind11 header files -- this may need to be
-    # changed depending on your setup
-    include_directories(${PROJECT_SOURCE_DIR}/pybind11/include)
-
-    # Create the binding library
-    add_library(example SHARED
-      example.cpp
-      # ... extra files go here ...
-    )
-
-    # Don't add a 'lib' prefix to the shared library
-    set_target_properties(example PROPERTIES PREFIX "")
-
-    if (WIN32)
-      if (MSVC)
-        # /MP enables multithreaded builds (relevant when there are many files), /bigobj is
-        # needed for bigger binding projects due to the limit to 64k addressable sections
-        set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS /MP /bigobj)
-        # Enforce size-based optimization and link time code generation on MSVC
-        # (~30% smaller binaries in experiments); do nothing in debug mode.
-        set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS
-          "$<$<CONFIG:Release>:/Os>" "$<$<CONFIG:Release>:/GL>"
-          "$<$<CONFIG:MinSizeRel>:/Os>" "$<$<CONFIG:MinSizeRel>:/GL>"
-          "$<$<CONFIG:RelWithDebInfo>:/Os>" "$<$<CONFIG:RelWithDebInfo>:/GL>"
-        )
-        set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELEASE "/LTCG ")
-        set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL "/LTCG ")
-        set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO "/LTCG ")
-      endif()
-
-      # .PYD file extension on Windows
-      set_target_properties(example PROPERTIES SUFFIX ".pyd")
-
-      # Link against the Python shared library
-      target_link_libraries(example ${PYTHON_LIBRARY})
-    elseif (UNIX)
-      # It's quite common to have multiple copies of the same Python version
-      # installed on one's system. E.g.: one copy from the OS and another copy
-      # that's statically linked into an application like Blender or Maya.
-      # If we link our plugin library against the OS Python here and import it
-      # into Blender or Maya later on, this will cause segfaults when multiple
-      # conflicting Python instances are active at the same time (even when they
-      # are of the same version).
-
-      # Windows is not affected by this issue since it handles DLL imports
-      # differently. The solution for Linux and Mac OS is simple: we just don't
-      # link against the Python library. The resulting shared library will have
-      # missing symbols, but that's perfectly fine -- they will be resolved at
-      # import time.
-
-      # .SO file extension on Linux/Mac OS
-      set_target_properties(example PROPERTIES SUFFIX ".so")
-
-      # Strip unnecessary sections of the binary on Linux/Mac OS
-      if(APPLE)
-        set_target_properties(example PROPERTIES MACOSX_RPATH ".")
-        set_target_properties(example PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ")
-        if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
-          add_custom_command(TARGET example POST_BUILD
-                             COMMAND strip -u -r ${PROJECT_BINARY_DIR}/example.so)
-        endif()
-      else()
-        if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
-          add_custom_command(TARGET example POST_BUILD
-                             COMMAND strip ${PROJECT_BINARY_DIR}/example.so)
-        endif()
-      endif()
-    endif()
+.. [cmake_example] https://github.com/dean0x7d/pybind11_cmake_example