simh-testsetgenerator/cmake/platform-quirks.cmake
B. Scott Michel a275c71170 SCP: Reduce compiler warnings on LP64 platforms
(Note: Reducing compiler warnings across all, but primarily LP64
platforms, is a long term objective.)

Reduce compiler warnings on LP64 platforms (macOS, Windows) and 32-bit
builds (Win32). Prefer 'size_t' for pointer arithmetic, array indexing
and extents; 'int' hasn't been used for these purposes for many years
and across many ANSI standards. N.B. that conversions from int or int32
to size_t cause the compiler to zero-extend the value, which is
inefficient.

Refactor printf() format modifiers into sim_printf_fmts.h. Add the
SIZE_T_FMT modifier for better portability, especially on LP64 platforms
where size_t is unsigned long and sizeof(size_t) > sizeof(int).

3B2: Fix known size_t printf() format.
2024-02-01 12:51:32 -05:00

266 lines
11 KiB
CMake

# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the names of The Authors shall not be
# used in advertising or otherwise to promote the sale, use or other dealings
# in this Software without prior written authorization from the Authors.
## platform_quirks.cmake
##
## This is the place where the CMake build handles various platform quirks,
## such as architecture-specific prefixes (Linux, Windows) and MacOS
## HomeBrew
##
## Author: B. Scott Michel
# "scooter me fecit"
set(EXTRA_TARGET_CFLAGS)
set(EXTRA_TARGET_CFLAGS)
# For 64-bit builds (and this is especially true for MSVC), set the library
# architecture.
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
## Strongly encourage (i.e., force) CMake to look in the x64 architecture
## directories:
if (MSVC OR MINGW)
# set(CMAKE_C_LIBRARY_ARCHITECTURE "x64")
# set(CMAKE_LIBRARY_ARCHITECTURE "x64")
elseif (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
## Linux has architecture-specific subdirectories where CMake needs to
## search for headers. Currently, we know about x64 and ARM architecture
## variants.
foreach (arch "x86_64-linux-gnu" "aarch64-linux-gnu" "arm-linux-gnueabihf")
if (EXISTS "/usr/lib/${arch}")
message(STATUS "CMAKE_LIBRARY_ARCHITECTURE set to ${arch}")
set(CMAKE_C_LIBRARY_ARCHITECTURE "${arch}")
set(CMAKE_LIBRARY_ARCHITECTURE "${arch}")
endif()
endforeach()
endif ()
endif()
if (WIN32)
## At some point, bring this back in to deal with MS ISO C99 deprecation.
## Right now, it's not in the code base and the warnings are squelched.
##
## (keep): if (MSVC_VERSION GREATER_EQUAL 1920)
## (keep): add_compile_definitions(USE_ISO_C99_NAMES)
## (keep): endif ()
if (MSVC)
## Flags enabled in the SIMH VS solution (diff redution):
##
## /EHsc: Standard C++ exception handling, extern "C" functions never
## throw exceptions.
## /FC: Output full path name of source in diagnostics
## /GF: String pooling
## /GL: Whole program optimization
## /Gy: Enable function-level linking
## /Oi: Emit intrinsic functions
## /Ot: Favor fast code
## /Oy: Suppress generating a stack frame (??? why?)
add_compile_options("$<$<CONFIG:Release>:/EHsc;/GF;/Gy;/Oi;/Ot;/Oy;/Zi>")
add_compile_options("$<$<CONFIG:Debug>:/EHsc;/FC>")
if (RELEASE_LTO)
## /LTCG: Link-Time Code Generation. Pair with /GL at compile time.
add_compile_options("$<$<CONFIG:Release>:/GL>")
add_link_options("$<$<CONFIG:Release>:/LTCG>")
message(STATUS "Adding LTO to Release compiler and linker flags")
endif ()
## Set the MSVC runtime. Note CMP0091 policy is set to new early on in
## the top-level CMakeLists.txt
if (BUILD_SHARED_DEPS)
set(use_rtdll "$<$<BOOL:${BUILD_SHARED_DEPS}:DLL>")
else ()
set(use_rtdll "")
endif ()
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>${use_rtll}")
## Disable automagic add for _MBCS:
add_definitions(-D_SBCS)
if (CMAKE_VERSION VERSION_LESS "3.23")
## -5 Evil hack to ensure that find_package() can match against an empty
## prefix and not trigger the "CMAKE_FIND_LIBRARY_PREFIXES not set" bug.
list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "lib" "|")
endif ()
list(APPEND EXTRA_TARGET_CFLAGS
"$<$<CONFIG:Debug>:$<$<BOOL:${DEBUG_WALL}>:/W4>>"
"$<$<CONFIG:Release>:/W3>"
)
## Uncomment this line if you end up with /NODEFAULTLIB warninigs. You will also
## need to build with the '--verbose' flag and check the values of "/M*" flags
## (typically you should see /MT or /MTd for the static runtime libraries.)
##
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /verbose:lib")
if (WARNINGS_FATAL)
message(STATUS "WARNINGS_FATAL: Compiler warnings are errors!! (/WX)")
list(APPEND EXTRA_TARGET_CFLAGS "/WX")
endif ()
endif ()
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# The MSVC solution builds as 32-bit, but none of the *nix platforms do.
#
# If 32-bit compiles have to be added back, uncomment the following 2 lines:
#
# add_compile_options("-m32")
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
endif ()
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID MATCHES ".*Clang")
# include(fpintrin)
# Turn on warnings about strict overflow/potential overflows.
## LIST(APPEND EXTRA_TARGET_CFLAGS "-Wall" "-fno-inline" "-fstrict-overflow" "-Wstrict-overflow=3")
LIST(APPEND EXTRA_TARGET_CFLAGS
"-U__STRICT_ANSI__"
"$<$<CONFIG:Debug>:$<$<BOOL:${DEBUG_WALL}>:-Wall>>"
## Only add if WARNINGS_FATAL set; has undesirable consequences with LTO.
"$<$<CONFIG:Release>:-Wall>"
)
# 07 NOV 2022: Apparently, -O3 is kosher now.
#
# 'O3' optimization and strict overflow cause all kinds of simulator issues, especially inside
# the VAX simulators. Reduce optimization and ensure strict overflow is turned off.
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(update_o2 TRUE)
if (NOT MINGW)
if (RELEASE_LTO AND (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "Release"))
check_c_compiler_flag("-flto" GCC_LTO_FLAG)
if (GCC_LTO_FLAG)
message(STATUS "Adding LTO to Release compiler and linker flags")
set(lto_flag "$<$<CONFIG:Release>:-flto>")
list(APPEND EXTRA_TARGET_CFLAGS "${lto_flag}")
list(APPEND EXTRA_TARGET_LFLAGS "${lto_flag}")
set(update_o2 FALSE)
else ()
message(STATUS "Compiler does not support Link Time Optimization.")
endif ()
else ()
message(STATUS "Link Time Optimization NOT ENABLED.")
endif ()
elseif (MINGW)
message(STATUS "MinGW: Link Time Optimization BROKEN, not added to Release flags")
endif ()
if (update_o2)
message(STATUS "Replacing '-O3' with '-O2'")
string(REGEX REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REGEX REPLACE "-O3" "-O2" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
endif ()
if (WARNINGS_FATAL` OR RELEASE_LTO)
check_c_compiler_flag("-Werror" GCC_W_ERROR_FLAG)
if (GCC_W_ERROR_FLAG)
if (WARNINGS_FATAL)
message(STATUS "WARNINGS_FATAL: Compiler warnings are errors!! (-Werror)")
list(APPEND EXTRA_TARGET_CFLAGS "-Werror")
endif ()
if (RELEASE_LTO)
message(STATUS "WARNINGS_FATAL: Link-time optimization warnings are errors!! (-Werror)")
list(APPEND EXTRA_TARGET_LFLAGS "-Werror")
endif ()
endif ()
endif ()
message(STATUS "Adding GNU-specific optimizations to CMAKE_C_FLAGS_RELEASE")
list(APPEND opt_flags "-finline-functions" "-fgcse-after-reload" "-fpredictive-commoning"
"-fipa-cp-clone" "-fno-unsafe-loop-optimizations" "-fno-strict-overflow")
elseif (CMAKE_C_COMPILER_ID MATCHES ".*Clang")
message(STATUS "Adding Clang-specific optimizations to CMAKE_C_FLAGS_RELEASE")
list(APPEND opt_flags "-fno-strict-overflow")
endif()
foreach (opt_flag ${opt_flags})
message(STATUS " ${opt_flag}")
string(REGEX REPLACE "${opt_flag}[ \t\r\n]*" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(APPEND CMAKE_C_FLAGS_RELEASE " ${opt_flag}")
string(REGEX REPLACE "${opt_flag}[ \t\r\n]*" "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
string(APPEND CMAKE_C_FLAGS_MINSIZEREL " ${opt_flag}")
endforeach ()
else ()
message(STATUS "Not changing CMAKE_C_FLAGS_RELEASE on ${CMAKE_C_COMPILER_ID}")
endif ()
if (CMAKE_HOST_APPLE)
## Look for app bundles and frameworks after looking for Unix-style packages:
set(CMAKE_FIND_FRAMEWORK "LAST")
set(CMAKE_FIND_APPBUNDLE "LAST")
if (EXISTS "/usr/local/Cellar" OR EXISTS "/opt/homebrew/Cellar")
## Smells like HomeBrew. Bulk add the includes and library subdirectories
message(STATUS "Adding HomeBrew paths to library and include search")
set(hb_topdir "/usr/local/Cellar")
if (EXISTS "/opt/homebrew/Cellar")
set(hb_topdir "/opt/homebrew/Cellar")
endif()
file(GLOB hb_lib_candidates LIST_DIRECTORIES TRUE "${hb_topdir}/*/*/lib")
file(GLOB hb_include_candidates LIST_DIRECTORIES TRUE "${hb_topdir}/*/*/include")
# message("@@ lib candidates ${hb_lib_candidates}")
# message("@@ inc candidates ${hb_include_candidates}")
set(hb_libs "")
foreach (hb_path ${hb_lib_candidates})
if (IS_DIRECTORY "${hb_path}")
# message("@@ consider ${hb_path}")
list(APPEND hb_libs "${hb_path}")
endif()
endforeach()
set(hb_includes "")
foreach (hb_path ${hb_include_candidates})
if (IS_DIRECTORY "${hb_path}")
# message("@@ consider ${hb_path}")
list(APPEND hb_includes "${hb_path}")
endif()
endforeach()
# message("hb_libs ${hb_libs}")
# message("hb_includes ${hb_includes}")
list(PREPEND CMAKE_LIBRARY_PATH ${hb_libs})
list(PREPEND CMAKE_INCLUDE_PATH ${hb_includes})
unset(hb_lib_candidates)
unset(hb_include_candidates)
unset(hb_includes)
unset(hb_libs)
unset(hb_path)
elseif(EXISTS /opt/local/bin/port)
# MacPorts
list(PREPEND CMAKE_LIBRARY_PATH /opt/local/lib)
list(PREPEND CMAKE_INCLUDE_PATH /opt/local/include)
endif()
## Universal binaries?
if (MAC_UNIVERSAL)
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
endif ()
endif()