# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindMFC
-------

Finds the native Microsoft Foundation Class Library (MFC) for developing MFC
applications on Windows:

.. code-block:: cmake

  find_package(MFC [...])

.. note::

  MFC is an optional component in Visual Studio and must be installed
  separately for this module to succeed.

Once the MFC libraries and headers are found, no additional manual linking is
needed, as they are part of the development environment.

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``MFC_FOUND``
  Boolean indicating whether MFC support is found.

Examples
^^^^^^^^

Using this module to check if the application can link to the MFC libraries:

.. code-block:: cmake

  find_package(MFC)

  if(MFC_FOUND)
    # Example logic when MFC is available...
    set(CMAKE_MFC_FLAG 2)
    add_executable(app WIN32 main.cpp)
    target_compile_definitions(app PRIVATE _AFXDLL)
  endif()

See Also
^^^^^^^^

* The :variable:`CMAKE_MFC_FLAG` variable.
#]=======================================================================]

# Assume no MFC support
set(MFC_FOUND "NO")

# Only attempt the try_compile call if it has a chance to succeed:
set(MFC_ATTEMPT_TRY_COMPILE 0)
if(WIN32 AND NOT UNIX AND NOT BORLAND AND NOT MINGW)
  set(MFC_ATTEMPT_TRY_COMPILE 1)
endif()

if(MFC_ATTEMPT_TRY_COMPILE)
  if(NOT DEFINED MFC_HAVE_MFC)
    set(CHECK_INCLUDE_FILE_VAR "afxwin.h")
    file(READ ${CMAKE_ROOT}/Modules/CheckIncludeFile.cxx.in _CIF_SOURCE_CONTENT)
    string(CONFIGURE "${_CIF_SOURCE_CONTENT}" _CIF_SOURCE_CONTENT)
    message(CHECK_START "Looking for MFC")
    # Try both shared and static as the root project may have set the /MT flag
    try_compile(MFC_HAVE_MFC
      SOURCE_FROM_VAR CheckIncludeFile.cxx _CIF_SOURCE_CONTENT
      CMAKE_FLAGS
      -DCMAKE_MFC_FLAG:STRING=2
      -DCOMPILE_DEFINITIONS:STRING=-D_AFXDLL
      OUTPUT_VARIABLE OUTPUT)
    if(NOT MFC_HAVE_MFC)
      try_compile(MFC_HAVE_MFC
        SOURCE_FROM_VAR CheckIncludeFile.cxx _CIF_SOURCE_CONTENT
        CMAKE_FLAGS
        -DCMAKE_MFC_FLAG:STRING=1
        OUTPUT_VARIABLE OUTPUT)
    endif()
    if(MFC_HAVE_MFC)
      message(CHECK_PASS "found")
      set(MFC_HAVE_MFC 1 CACHE INTERNAL "Have MFC?")
    else()
      message(CHECK_FAIL "not found")
      set(MFC_HAVE_MFC 0 CACHE INTERNAL "Have MFC?")
    endif()
  endif()

  if(MFC_HAVE_MFC)
    set(MFC_FOUND "YES")
  endif()
endif()
