cpptrace/bundled/libdwarf/CMakeLists.txt
2023-11-06 12:12:07 -05:00

511 lines
13 KiB
CMake
Vendored

cmake_minimum_required(VERSION 3.5)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()
project(libdwarf C CXX)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include_directories( ${PROJECT_BINARY_DIR} )
# used to compile on MSVC upto 2013 where snprintf is not available
macro(msvc_posix target)
if(MSVC AND ("${MSVC_VERSION}" LESS 1900))
# under VS 2015
target_compile_definitions(${target} PUBLIC
snprintf=_snprintf)
endif()
endmacro()
set(LIBDWARF_CRT "MD" CACHE STRING "Either MT or MD, specifies whether to use the static or dynamic MSVCRT.")
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# Use CMAKE_MSVC_RUNTIME in versions 3.15 and up
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.15")
cmake_policy(SET CMP0091 NEW)
if (LIBDWARF_CRT STREQUAL "MT")
message(STATUS "Using MT runtime by CMAKE_MSVC_RUNTIME_LIBRARY")
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
elseif(LIBDWARF_CRT STREQUAL "MD")
message(STATUS "Using MD runtime by CMAKE_MSVC_RUNTIME_LIBRARY")
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
message(FATAL_ERROR "LIBDWARF_CRT must be MT or MD")
endif()
# Use regexes in versions before 3.15
else()
if (LIBDWARF_CRT STREQUAL "MT")
message(STATUS "Using MT runtime by compile flag replacement")
# taken from the CMake FAQ
foreach(flag_v
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if (${flag_v} MATCHES "([\\/\\-]M)D")
string(REGEX REPLACE "([\\/\\-]M)D" "\\1T"
${flag_v} "${${flag_v}}")
endif()
endforeach()
elseif(LIBDWARF_CRT STREQUAL "MD")
message(STATUS "Using MD runtime by cmake default")
else()
message(FATAL_ERROR "LIBDWARF_CRT must be MT or MD")
endif()
endif()
endif()
# message("CMake flags are:")
# message(" CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
# message(" CMAKE_C_FLAGS_DEBUG: ${CMAKE_C_FLAGS_DEBUG}")
# message(" CMAKE_C_FLAGS_RELEASE: ${CMAKE_C_FLAGS_RELEASE}")
# message(" CMAKE_C_FLAGS_MINSIZEREL: ${CMAKE_C_FLAGS_MINSIZEREL}")
# message(" CMAKE_C_FLAGS_RELWITHDEBINFO: ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
# message(" CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
# message(" CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
# message(" CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
# message(" CMAKE_CXX_FLAGS_MINSIZEREL: ${CMAKE_CXX_FLAGS_MINSIZEREL}")
# message(" CMAKE_CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
# set target folder on IDE
macro(set_folder target folder)
set_target_properties(${target} PROPERTIES FOLDER ${folder})
endmacro()
# set source groups on IDE
macro(set_source_group list_name group_name)
set(${list_name} ${ARGN})
source_group(${group_name} FILES ${ARGN})
endmacro()
# view folders on supported IDEs
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# tells cmake to look in 64bit first (cmake
# would probably do this anyway).
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE)
enable_testing()
# always include project's folder to includes
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
### begin what was configure.cmake
# cmake macros
include(TestBigEndian)
include(CheckIncludeFile)
include(CheckCSourceCompiles)
include(CheckCSourceRuns)
include(CheckSymbolExists)
### Version also appears in configure.ac
set(VERSION 0.7.1)
set(PACKAGE_VERSION "\"${VERSION}\"")
set(PACKAGE_NAME "libdwarf" )
set(PACKAGE_STRING "\"${PACKAGE_NAME} ${VERSION}\"")
string(REGEX REPLACE "[\"]" "" tarname1 "${PACKAGE_STRING}" )
string(REGEX REPLACE "[^a-zA-Z0-9_]" "-" tarname "${tarname1}" )
set(PACKAGE_TARNAME "\"${tarname}\"" )
test_big_endian(isBigEndian)
if (${isBigEndian})
set ( WORDS_BIGENDIAN 1 )
endif()
check_include_file( "sys/types.h" HAVE_SYS_TYPES_H)
check_include_file( "sys/stat.h" HAVE_SYS_STAT_H )
check_include_file( "inttypes.h" HAVE_INTTYPES_H )
check_include_file( "memory.h" HAVE_MEMORY_H )
check_include_file( "strings.h" HAVE_STRINGS_H )
check_include_file( "stdint.h" HAVE_STDINT_H )
check_include_file( "unistd.h" HAVE_UNISTD_H )
check_include_file( "sgidefs.h" HAVE_SGIDEFS_H )
check_include_file( "stdafx.h" HAVE_STDAFX_H )
check_include_file( "fcntl.h" HAVE_FCNTL_H )
### cmake provides no way to guarantee uint32_t present.
### configure does guarantee that.
if(HAVE_STDINT_H)
check_c_source_compiles("
#include <stdint.h>
int main()
{
uintptr_t i; i = 12;
return (int)i;
}" HAVE_UINTPTR_T)
check_c_source_compiles("
#include <stdint.h>
int main()
{
intptr_t i; i = 12;
return (int)i;
}" HAVE_INTPTR_T)
endif()
if (HAVE_UINTPTR_T)
if(NOT printed_stati)
message(STATUS "HAVE_UINTPTR_T 1: uintptr_t defined in stdint.h... YES")
endif()
else()
if(NOT printed_stati)
message(STATUS "uintptr_t defined in stdint.h... NO")
endif()
set(uintptr_t "unsigned long long int" )
if(NOT printed_stati)
message(STATUS "Setting #define uintptr_t " ${uintptr_t})
endif()
endif()
if (uintptr_t)
if(NOT printed_stati)
message(STATUS "uintptr_t value considered YES ")
endif()
else()
if(NOT printed_stati)
message(STATUS "uintptr_t value considered NO ")
endif()
endif()
if (HAVE_INTPTR_T)
if(NOT printed_stati)
message(STATUS "HAVE_INTPTR_T 1: intptr_t defined in stdint.h... YES")
endif()
else()
if(NOT printed_stati)
message(STATUS "intptr_t defined in stdint.h... NO")
endif()
set(uintptr_t "long long int" )
if(NOT printed_stati)
message(STATUS "Setting #define intptr_t " ${intptr_t})
endif()
endif()
if (intptr_t)
if(NOT printed_stati)
message(STATUS "intptr_t value considered YES ")
endif()
else()
if(NOT printed_stati)
message(STATUS "intptr_t value considered NO ")
endif()
endif()
check_c_source_compiles("
static unsigned foo( unsigned x,
__attribute__ ((unused)) int y)
{
unsigned x2 = x + 1;
return x2;
}
int main(void) {
unsigned y = 0;
y = foo(12,y);
return 0;
}" HAVE_UNUSED_ATTRIBUTE)
if(NOT printed_stati)
message(STATUS "Checking compiler supports __attribute__ unused... ${HAVE_UNUSED_ATTRIBUTE}")
endif()
check_c_source_compiles([=[
#include "stdafx.h"
int main()
{
int p; p = 27;
return 0;
}]=] HAVE_STDAFX_H)
#message(STATUS "Checking have windows stdafx.h... ${HAVE_STDAFX_H}")
option(CMAKE_DWARF_FINDPACKAGE_Z "" OFF)
mark_as_advanced(CMAKE_DWARF_FINDPACKAGE_Z)
if(NOT CMAKE_DWARF_FINDPACKAGE_Z)
set(CMAKE_REQUIRED_LIBRARIES z)
check_c_source_compiles( [=[
#include "zlib.h"
int main()
{
Bytef dest[100];
uLongf destlen = 100;
Bytef *src = 0;
uLong srclen = 3;
int res = uncompress(dest,&destlen,src,srclen);
if (res == Z_OK) {
/* ALL IS WELL */
}
return 0;
} ]=] HAVE_ZLIB )
check_c_source_compiles( [=[
#include "zlib.h"
int main()
{
Bytef dest[100];
uLongf destlen = 100;
Bytef *src = 0;
uLong srclen = 3;
int res = uncompress(dest,&destlen,src,srclen);
if (res == Z_OK) {
/* ALL IS WELL */
}
return 0;
} ]=] HAVE_ZLIB_H )
set(CMAKE_REQUIRED_LIBRARIES)
if (HAVE_ZLIB)
# For linking in libz
set(DW_FZLIB "z")
endif()
set(CMAKE_REQUIRED_LIBRARIES zstd )
check_c_source_compiles( [=[
#include "zstd.h"
int main()
{
char * dest[100];
size_t destlen = 100;
char *src = 0;
size_t srclen = 3;
size_t res = ZSTD_decompress(dest,destlen,src,srclen);
if (res == destlen) {
/* ALL IS WELL */
}
return 0;
} ]=] HAVE_ZSTD )
check_c_source_compiles( [=[
#include "zstd.h"
int main()
{
char * dest[100];
size_t destlen = 100;
char *src = 0;
size_t srclen = 3;
size_t res = ZSTD_decompress(dest,destlen,src,srclen);
if (res == destlen) {
/* ALL IS WELL */
}
return 0;
} ]=] HAVE_ZSTD_H )
set(CMAKE_REQUIRED_LIBRARIES)
if (HAVE_ZSTD)
# For linking in libzstd
set(DW_FZSTD "zstd")
endif()
else()
find_package(ZLIB REQUIRED)
set(DW_FZLIB "ZLIB")
set(HAVE_ZLIB TRUE)
set(HAVE_ZLIB_H TRUE)
endif()
check_c_source_compiles([=[
#include <stdint.h>
int main()
{
intptr_t p;
p = 27;
return 0;
}]=] HAVE_INTPTR_T)
if(NOT printed_stati)
message(STATUS "CMAKE_SIZEOF_VOID_P ... " ${CMAKE_SIZEOF_VOID_P} )
endif()
set(printed_stati On CACHE INTERNAL "")
configure_file(cmake/config.h.cmake config.h)
set(
libdwarf_sources
dwarf_abbrev.c
dwarf_alloc.c
dwarf_crc.c
dwarf_crc32.c
dwarf_arange.c
dwarf_debug_sup.c
dwarf_debugaddr.c
dwarf_debuglink.c
dwarf_die_deliv.c
dwarf_debugnames.c
dwarf_dsc.c
dwarf_elf_load_headers.c
dwarf_elfread.c
dwarf_elf_rel_detector.c
dwarf_error.c
dwarf_fill_in_attr_form.c
dwarf_find_sigref.c
dwarf_fission_to_cu.c
dwarf_form.c
dwarf_form_class_names.c
dwarf_frame.c
dwarf_frame2.c
dwarf_gdbindex.c
dwarf_global.c
dwarf_gnu_index.c
dwarf_groups.c
dwarf_harmless.c
dwarf_generic_init.c
dwarf_init_finish.c
dwarf_leb.c
dwarf_line.c
dwarf_loc.c
dwarf_loclists.c
dwarf_locationop_read.c
dwarf_machoread.c
dwarf_macro.c
dwarf_macro5.c
dwarf_memcpy_swap.c
dwarf_names.c
dwarf_object_read_common.c
dwarf_object_detector.c
dwarf_peread.c
dwarf_query.c
dwarf_ranges.c
dwarf_rnglists.c
dwarf_safe_arithmetic.c
dwarf_safe_strcpy.c
dwarf_secname_ck.c
dwarf_setup_sections.c
dwarf_string.h
dwarf_string.c
dwarf_stringsection.c
dwarf_tied.c
dwarf_str_offsets.c
dwarf_tsearchhash.c
dwarf_util.c
dwarf_xu_index.c
dwarf_print_lines.c
)
set(
libdwarf_headers
dwarf.h
dwarf_abbrev.h
dwarf_alloc.h
dwarf_arange.h
dwarf_base_types.h
dwarf_debugaddr.h
dwarf_debuglink.h
dwarf_debugnames.h
dwarf_die_deliv.h
dwarf_dsc.h
dwarf_elfread.h
dwarf_elfstructs.h
dwarf_elf_access.h
dwarf_elf_defines.h
dwarf_elf_rel_detector.h
dwarf_errmsg_list.h
dwarf_error.h
dwarf_frame.h
dwarf_gdbindex.h
dwarf_global.h
dwarf_gnu_index.h
dwarf_harmless.h
dwarf_line.h
dwarf_line_table_reader_common.h
dwarf_loc.h
dwarf_machoread.h
dwarf_macho_loader.h
dwarf_macro.h
dwarf_macro5.h
dwarf_memcpy_swap.h
dwarf_object_detector.h
dwarf_object_read_common.h
dwarf_opaque.h
dwarf_peread.h
dwarf_pe_descr.h
dwarf_reading.h
dwarf_rnglists.h
dwarf_safe_arithmetic.h
dwarf_safe_strcpy.h
dwarf_secname_ck.h
dwarf_setup_sections.h
dwarf_string.h
dwarf_str_offsets.h
dwarf_tied_decls.h
dwarf_tsearch.h
dwarf_util.h
dwarf_xu_index.h
libdwarf.h
libdwarf_private.h
)
set(
libdwarf_export_headers
dwarf.h
libdwarf.h
)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
include(GNUInstallDirs)
add_library(dwarf STATIC ${libdwarf_sources} ${libdwarf_headers})
set_property(TARGET dwarf PROPERTY POSITION_INDEPENDENT_CODE ON)
target_compile_definitions(dwarf PUBLIC LIBDWARF_BUILD)
target_include_directories(
dwarf
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
if(CMAKE_DWARF_FINDPACKAGE_Z)
target_link_libraries(dwarf PUBLIC ZLIB::ZLIB)
else()
target_link_libraries(dwarf PUBLIC ${DW_FZLIB} ${DW_FZSTD})
endif()
# TODO: Something will have to be figured out for dynamic linking, but for now there's nothing to install
if(NOT CMAKE_SKIP_INSTALL_RULES)
include(CMakePackageConfigHelpers)
install(
TARGETS dwarf
EXPORT libdwarf_targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(
FILES
${libdwarf_export_headers}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libdwarf
)
export(
EXPORT libdwarf_targets
FILE ${CMAKE_CURRENT_BINARY_DIR}/libdwarf/libdwarf_targets.cmake
NAMESPACE libdwarf::
)
configure_package_config_file(
cmake/libdwarf-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/libdwarf/libdwarf-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libdwarf
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/libdwarf/libdwarf-config-version.cmake
VERSION "${VERSION}"
COMPATIBILITY SameMajorVersion
)
install(
EXPORT libdwarf_targets
FILE libdwarf_targets.cmake
NAMESPACE libdwarf::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libdwarf
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/libdwarf/libdwarf-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/libdwarf/libdwarf-config-version.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libdwarf
)
endif()