Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mRemoteNG/PuTTYNG.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/platforms/windows.cmake')
-rw-r--r--cmake/platforms/windows.cmake202
1 files changed, 202 insertions, 0 deletions
diff --git a/cmake/platforms/windows.cmake b/cmake/platforms/windows.cmake
new file mode 100644
index 00000000..a7ed7c7c
--- /dev/null
+++ b/cmake/platforms/windows.cmake
@@ -0,0 +1,202 @@
+set(PUTTY_MINEFIELD OFF
+ CACHE BOOL "Build PuTTY with its built-in memory debugger 'Minefield'")
+set(PUTTY_GSSAPI ON
+ CACHE BOOL "Build PuTTY with GSSAPI support")
+set(PUTTY_LINK_MAPS OFF
+ CACHE BOOL "Attempt to generate link maps")
+set(PUTTY_EMBEDDED_CHM_FILE ""
+ CACHE FILEPATH "Path to a .chm help file to embed in the binaries")
+
+if(PUTTY_SUBSYSTEM_VERSION)
+ string(REPLACE
+ "subsystem:windows" "subsystem:windows,${PUTTY_SUBSYSTEM_VERSION}"
+ CMAKE_C_CREATE_WIN32_EXE ${CMAKE_C_CREATE_WIN32_EXE})
+ string(REPLACE
+ "subsystem:console" "subsystem:console,${PUTTY_SUBSYSTEM_VERSION}"
+ CMAKE_C_CREATE_CONSOLE_EXE ${CMAKE_C_CREATE_CONSOLE_EXE})
+endif()
+
+function(define_negation newvar oldvar)
+ if(${oldvar})
+ set(${newvar} OFF PARENT_SCOPE)
+ else()
+ set(${newvar} ON PARENT_SCOPE)
+ endif()
+endfunction()
+
+include(CheckIncludeFiles)
+include(CheckSymbolExists)
+include(CheckCSourceCompiles)
+
+# Still needed for AArch32 Windows builds
+set(CMAKE_REQUIRED_DEFINITIONS -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
+
+check_include_files("windows.h;winresrc.h" HAVE_WINRESRC_H)
+if(NOT HAVE_WINRESRC_H)
+ # A couple of fallback names for the header file you can include in
+ # .rc files. We conditionalise even these checks, to save effort at
+ # cmake time.
+ check_include_files("windows.h;winres.h" HAVE_WINRES_H)
+ if(NOT HAVE_WINRES_H)
+ check_include_files("windows.h;win.h" HAVE_WIN_H)
+ endif()
+endif()
+check_include_files("stdint.h" HAVE_STDINT_H)
+define_negation(HAVE_NO_STDINT_H HAVE_STDINT_H)
+
+check_include_files("windows.h;multimon.h" HAVE_MULTIMON_H)
+define_negation(NO_MULTIMON HAVE_MULTIMON_H)
+
+check_include_files("windows.h;htmlhelp.h" HAVE_HTMLHELP_H)
+define_negation(NO_HTMLHELP HAVE_HTMLHELP_H)
+
+check_include_files("winsock2.h;afunix.h" HAVE_AFUNIX_H)
+
+check_symbol_exists(strtoumax "inttypes.h" HAVE_STRTOUMAX)
+check_symbol_exists(AddDllDirectory "windows.h" HAVE_ADDDLLDIRECTORY)
+check_symbol_exists(SetDefaultDllDirectories "windows.h"
+ HAVE_SETDEFAULTDLLDIRECTORIES)
+check_symbol_exists(GetNamedPipeClientProcessId "windows.h"
+ HAVE_GETNAMEDPIPECLIENTPROCESSID)
+check_symbol_exists(CreatePseudoConsole "windows.h" HAVE_CONPTY)
+
+check_c_source_compiles("
+#include <windows.h>
+GCP_RESULTSW gcpw;
+int main(void) { return 0; }
+" HAVE_GCP_RESULTSW)
+
+function(dwmapi_test_wrapper)
+ set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dwmapi.lib)
+ check_c_source_compiles("
+#include <windows.h>
+#include <dwmapi.h>
+volatile HWND hwnd;
+int main(void) {
+ RECT r;
+ DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &r, sizeof(r));
+}
+" HAVE_DWMAPI_H)
+ set(HAVE_DWMAPI_H ${HAVE_DWMAPI_H} PARENT_SCOPE)
+endfunction()
+dwmapi_test_wrapper()
+
+set(NO_SECURITY ${PUTTY_NO_SECURITY})
+
+add_compile_definitions(
+ _WINDOWS
+ _CRT_SECURE_NO_WARNINGS
+ _WINSOCK_DEPRECATED_NO_WARNINGS
+ _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
+
+if(PUTTY_MINEFIELD)
+ add_compile_definitions(MINEFIELD)
+endif()
+if(NOT PUTTY_GSSAPI)
+ add_compile_definitions(NO_GSSAPI)
+endif()
+if(PUTTY_EMBEDDED_CHM_FILE)
+ add_compile_definitions("EMBEDDED_CHM_FILE=\"${PUTTY_EMBEDDED_CHM_FILE}\"")
+endif()
+
+if(WINELIB)
+ enable_language(RC)
+ set(LFLAG_MANIFEST_NO "")
+elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC" OR
+ CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "MSVC")
+ set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} /nologo /C1252")
+ set(LFLAG_MANIFEST_NO "/manifest:no")
+else()
+ set(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -c1252")
+ set(LFLAG_MANIFEST_NO "")
+endif()
+
+if(STRICT)
+ if(CMAKE_C_COMPILER_ID MATCHES "GNU")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -Wpointer-arith -Wvla")
+ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Wpointer-arith -Wvla")
+ endif()
+endif()
+
+if(CMAKE_C_COMPILER_ID MATCHES "Clang")
+ # Switch back from MSVC-style error message format
+ # "file.c(line,col)" to clang's native style "file.c:line:col:". I
+ # find the latter more convenient because it matches other Unixy
+ # tools like grep, and I have tooling to parse that format and jump
+ # to the sites of error messages.
+ set(CMAKE_C_FLAGS
+ "${CMAKE_C_FLAGS} -Xclang -fdiagnostics-format -Xclang clang")
+endif()
+
+if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
+ # Turn off some warnings that I've just found too noisy.
+ #
+ # - 4244, 4267: "possible loss of data" when narrowing an integer
+ # type (separate warning numbers for initialisers and
+ # assignments). Every time I spot-check instances of this, they
+ # turn out to be sensible (e.g. something was already checked, or
+ # was assigned from a previous variable that must have been in
+ # range). I don't think putting a warning-suppression idiom at
+ # every one of these sites would improve code legibility.
+ #
+ # - 4018: "signed/unsigned mismatch" in integer comparison. Again,
+ # comes up a lot, and generally my spot checks make it look as if
+ # it's OK.
+ #
+ # - 4146: applying unary '-' to an unsigned type. We do that all
+ # the time in deliberate bit-twiddling code like mpint.c or
+ # crypto implementations.
+ #
+ # - 4293: warning about undefined behaviour if a shift count is too
+ # big. We often do this inside a ?: clause which doesn't evaluate
+ # the overlong shift unless the shift count _isn't_ too big. When
+ # the shift count is constant, MSVC spots the potential problem
+ # in one branch of the ?:, but doesn't also spot that that branch
+ # isn't ever taken, so it complains about a thing that's already
+ # guarded.
+ #
+ # - 4090: different 'const' qualifiers. It's a shame to suppress
+ # this one, because const mismatches really are a thing I'd
+ # normally like to be warned about. But MSVC (as of 2017 at
+ # least) seems to have a bug in which assigning a 'void *' into a
+ # 'const char **' thinks there's a const-qualifier mismatch.
+ # There isn't! Both are pointers to modifiable objects. The fact
+ # that in one case, the modifiable object is a pointer to
+ # something _else_ const should make no difference.
+
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
+/wd4244 /wd4267 /wd4018 /wd4146 /wd4293 /wd4090")
+endif()
+
+if(CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "MSVC")
+ set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} /dynamicbase /nxcompat")
+endif()
+
+set(platform_libraries
+ advapi32.lib comdlg32.lib gdi32.lib imm32.lib
+ ole32.lib shell32.lib user32.lib ws2_32.lib kernel32.lib)
+
+# Generate link maps
+if(PUTTY_LINK_MAPS)
+ if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND
+ "x${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
+ set(CMAKE_C_LINK_EXECUTABLE
+ "${CMAKE_C_LINK_EXECUTABLE} /lldmap:<TARGET>.map")
+ elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
+ set(CMAKE_C_LINK_EXECUTABLE
+ "${CMAKE_C_LINK_EXECUTABLE} /map:<TARGET>.map")
+ else()
+ message(WARNING
+ "Don't know how to generate link maps on this toolchain")
+ endif()
+endif()
+
+# Write out a file in the cmake output directory listing the
+# executables that are 'official' enough to want to code-sign and
+# ship.
+file(WRITE ${CMAKE_BINARY_DIR}/shipped.txt "")
+function(installed_program target)
+ file(APPEND ${CMAKE_BINARY_DIR}/shipped.txt
+ "${target}${CMAKE_EXECUTABLE_SUFFIX}\n")
+endfunction()