# **********************************************************
# Copyright (c) 2012-2014 Google, Inc.    All rights reserved.
# **********************************************************

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
#
# * Neither the name of Google, Inc. nor the names of its contributors may be
#   used to endorse or promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.

# Custom commands and source file properties are per-subdir so we must
# include this in each instead of just placing in top-level CMakeLists.txt.

if (WIN32)
  # i#894: Win8 WDK ntdll.lib does not list Ki routines so we make our own .lib.
  # i#938: We expand our .lib to include everything so we don't need DDK/WDK.
  # We could build a full dll (not through cmake target though b/c then have
  # ntdll.lib name conflicts) but the lib.exe tool seems cleaner.
  # Note that we need not only stub routines but to also list the stdcall
  # (un-mangled) names in a .def file for it to work.
  # XXX: we should make sure we don't rely on ntdll routines not in older systems!
  find_program(LIB_EXECUTABLE lib.exe DOC "path to lib.exe")
  if (NOT LIB_EXECUTABLE)
    message(FATAL_ERROR "Cannot find lib.exe")
  endif (NOT LIB_EXECUTABLE)
  set(ntimp_base "ntdll_imports")
  set(ntimp_src "${PROJECT_SOURCE_DIR}/core/win32/${ntimp_base}.c")
  if (X64)
    configure_file("${PROJECT_SOURCE_DIR}/core/win32/${ntimp_base}_x64.def"
      "${PROJECT_BINARY_DIR}/core/win32/${ntimp_base}.def" COPYONLY)
  else (X64)
    configure_file("${PROJECT_SOURCE_DIR}/core/win32/${ntimp_base}.def"
      "${PROJECT_BINARY_DIR}/core/win32/${ntimp_base}.def" COPYONLY)
  endif (X64)
  set(ntimp_def "${PROJECT_BINARY_DIR}/core/win32/${ntimp_base}.def")
  # We can't call it ntdll.lib b/c then link.exe will ignore the one from
  # the WDK/DDK.  Update i#938: we have now replaced the regular ntdll.lib
  # but we stick with our unique name.
  set(ntimp_lib "${PROJECT_BINARY_DIR}/core/${ntimp_base}.lib")
  set_property(SOURCE "${ntimp_lib}" PROPERTY GENERATED true)
  # Because the Ki are stdcall we can't just use a .def file: we need
  # an .obj file built from stubs w/ the same signatures.
  # We don't need a stamp file b/c the .lib is not a source; plus a stamp
  # file causes Ninja to fail to build.
  add_custom_command(OUTPUT "${ntimp_lib}"
    DEPENDS "${ntimp_src}" "${ntimp_def}"
    COMMAND "${CMAKE_C_COMPILER}" ARGS /nologo /c /Ob0 ${ntimp_src}
    COMMAND "${LIB_EXECUTABLE}" ARGS
      /nologo /name:ntdll.dll /def:${ntimp_def}
      ${PROJECT_BINARY_DIR}/core/${ntimp_base}.obj
    WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/core
    VERBATIM # recommended: p260 of cmake book
    )
  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
    # We can't add a custom target here b/c that's shared and we'd get dup targets
    # so we do that at one include point, in core/
    set(ntimp_dep "")
  else ()
    set(ntimp_dep "${ntimp_lib}")
  endif ()
  set(ntimp_flags "\"${ntimp_lib}\"")
endif (WIN32)
