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


# This module is shared by multiple languages; use include blocker.
if(__WINDOWS_COMPILER_PGI)
  return()
endif()
set(__WINDOWS_COMPILER_PGI 1)

# PGI on Windows doesn't support parallel compile processes
if(NOT DEFINED CMAKE_JOB_POOL_LINK OR NOT DEFINED CMAKE_JOB_POOL_COMPILE)
  set(CMAKE_JOB_POOL_LINK PGITaskPool)
  set(CMAKE_JOB_POOL_COMPILE PGITaskPool)
  get_property(_pgijp GLOBAL PROPERTY JOB_POOLS)
  if(NOT _pgijp MATCHES "PGITaskPool=")
      set_property(GLOBAL APPEND PROPERTY JOB_POOLS PGITaskPool=1)
  endif()
  unset(_pgijp)
endif()

set(CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1)
set(CMAKE_LINK_DEF_FILE_FLAG "-def:")
# The link flags for PGI are the raw filename to add a file
# and the UNIX -L syntax to link directories.
set(CMAKE_LINK_LIBRARY_FLAG "")
set(CMAKE_LINK_STARTFILE "pgimain[mx][xpt]+[.]obj")

# Default to Debug builds, mirroring Windows-MSVC behavior
set(CMAKE_BUILD_TYPE_INIT Debug)

if(CMAKE_VERBOSE_MAKEFILE)
  set(CMAKE_CL_NOLOGO)
else()
  set(CMAKE_CL_NOLOGO "/nologo")
endif()

macro(__windows_compiler_pgi lang)
  # Shared library compile and link rules.
  set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "lib ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
  set(CMAKE_${lang}_CREATE_SHARED_LIBRARY "<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} -Mmakedll -implib:<TARGET_IMPLIB> -Xlinker -pdb:<TARGET_PDB> -Xlinker -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
  set(CMAKE_${lang}_CREATE_SHARED_MODULE "${CMAKE_${lang}_CREATE_SHARED_LIBRARY}")
  set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} -implib:<TARGET_IMPLIB> -Xlinker -pdb:<TARGET_PDB> -Xlinker -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")

  if("${lang}" MATCHES "C|CXX")
    set(CMAKE_${lang}_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
  endif()
endmacro()
