1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 09:58:01 +00:00
putty-source/cmake/setup.cmake
Simon Tatham 5eee8ca648 Compatibility with older versions of cmake.
After this change, the cmake setup now works even on Debian stretch
(oldoldstable), which runs cmake 3.7.

In order to support a version that early I had to:

 - write a fallback implementation of 'add_compile_definitions' for
   older cmakes, which is easy, because add_compile_definitions(FOO)
   is basically just add_compile_options(-DFOO)

 - stop using list(TRANSFORM) and string(JOIN), of which I had one
   case each, and they were easily replaced with simple foreach loops

 - stop putting OBJECT libraries in the target_link_libraries command
   for executable targets, in favour of adding $<TARGET_OBJECTS:foo>
   to the main sources list for the same target. That matches what I
   do with library targets, so it's probably more sensible anyway.

I tried going back by another Debian release and getting this cmake
setup to work on jessie, but that runs CMake 3.0.1, and in _that_
version of cmake the target_sources command is missing, and I didn't
find any alternative way to add extra sources to a target after having
first declared it. Reorganising to cope with _that_ omission would be
too much upheaval without a very good reason.
2021-10-29 18:08:18 +01:00

98 lines
3.2 KiB
CMake

# Forcibly re-enable assertions, even if we're building in release
# mode. This is a security project - assertions may be enforcing
# security-critical constraints. A backstop #ifdef in defs.h should
# give a #error if this manoeuvre doesn't do what it needs to.
string(REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set(PUTTY_IPV6 ON
CACHE BOOL "Build PuTTY with IPv6 support if possible")
set(PUTTY_DEBUG OFF
CACHE BOOL "Build PuTTY with debug() statements enabled")
set(PUTTY_FUZZING OFF
CACHE BOOL "Build PuTTY binaries suitable for fuzzing, NOT FOR REAL USE")
set(PUTTY_COVERAGE OFF
CACHE BOOL "Build PuTTY binaries suitable for code coverage analysis")
set(STRICT OFF
CACHE BOOL "Enable extra compiler warnings and make them errors")
include(FindGit)
set(GENERATED_SOURCES_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
set(GENERATED_LICENCE_H ${GENERATED_SOURCES_DIR}/licence.h)
set(INTERMEDIATE_LICENCE_H ${GENERATED_LICENCE_H}.tmp)
add_custom_command(OUTPUT ${INTERMEDIATE_LICENCE_H}
COMMAND ${CMAKE_COMMAND}
-DLICENCE_FILE=${CMAKE_SOURCE_DIR}/LICENCE
-DOUTPUT_FILE=${INTERMEDIATE_LICENCE_H}
-P ${CMAKE_SOURCE_DIR}/cmake/licence.cmake
DEPENDS ${CMAKE_SOURCE_DIR}/cmake/licence.cmake ${CMAKE_SOURCE_DIR}/LICENCE)
add_custom_target(generated_licence_h
BYPRODUCTS ${GENERATED_LICENCE_H}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${INTERMEDIATE_LICENCE_H} ${GENERATED_LICENCE_H}
DEPENDS ${INTERMEDIATE_LICENCE_H}
COMMENT "Updating licence.h")
set(GENERATED_COMMIT_C ${GENERATED_SOURCES_DIR}/cmake_commit.c)
set(INTERMEDIATE_COMMIT_C ${GENERATED_COMMIT_C}.tmp)
add_custom_target(check_git_commit
BYPRODUCTS ${INTERMEDIATE_COMMIT_C}
COMMAND ${CMAKE_COMMAND}
-DGIT_EXECUTABLE=${GIT_EXECUTABLE}
-DOUTPUT_FILE=${INTERMEDIATE_COMMIT_C}
-DOUTPUT_TYPE=header
-P ${CMAKE_SOURCE_DIR}/cmake/gitcommit.cmake
DEPENDS ${CMAKE_SOURCE_DIR}/cmake/gitcommit.cmake
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Checking current git commit")
add_custom_target(cmake_commit_c
BYPRODUCTS ${GENERATED_COMMIT_C}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${INTERMEDIATE_COMMIT_C} ${GENERATED_COMMIT_C}
DEPENDS check_git_commit ${INTERMEDIATE_COMMIT_C}
COMMENT "Updating cmake_commit.c")
if(CMAKE_VERSION VERSION_LESS 3.12)
function(add_compile_definitions)
foreach(i ${ARGN})
add_compile_options(-D${i})
endforeach()
endfunction()
endif()
function(add_sources_from_current_dir target)
set(sources)
foreach(i ${ARGN})
set(sources ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/${i})
endforeach()
target_sources(${target} PRIVATE ${sources})
endfunction()
set(extra_dirs)
if(CMAKE_SYSTEM_NAME MATCHES "Windows" OR WINELIB)
set(platform windows)
else()
set(platform unix)
endif()
include(cmake/platforms/${platform}.cmake)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${GENERATED_SOURCES_DIR}
${platform}
${extra_dirs})
if(PUTTY_DEBUG)
add_compile_definitions(DEBUG)
endif()
if(PUTTY_FUZZING)
add_compile_definitions(FUZZING)
endif()
if(PUTTY_COVERAGE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g ")
endif()