cmake update

This commit is contained in:
Markus F.X.J. Oberhumer 2024-03-26 15:38:20 +01:00
parent a27a9e6000
commit 3ba91b8072
8 changed files with 57 additions and 36 deletions

View File

@ -523,15 +523,9 @@ endif()
# extra sanity checks to detect incompatible C vs CXX settings # extra sanity checks to detect incompatible C vs CXX settings
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK) if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
if(NOT ",${CMAKE_C_PLATFORM_ID}," STREQUAL ",${CMAKE_CXX_PLATFORM_ID},") upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
message(FATAL_ERROR "ERROR: CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID mismatch") upx_platform_check_mismatch(CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI)
endif() upx_platform_check_mismatch(CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
if(NOT ",${CMAKE_C_COMPILER_ABI}," STREQUAL ",${CMAKE_CXX_COMPILER_ABI},")
message(FATAL_ERROR "ERROR: CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI mismatch")
endif()
if(NOT ",${CMAKE_C_COMPILER_FRONTEND_VARIANT}," STREQUAL ",${CMAKE_CXX_COMPILER_FRONTEND_VARIANT},")
message(FATAL_ERROR "ERROR: CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT mismatch")
endif()
endif() # UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK endif() # UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
upx_cmake_include_hook(9_finish) upx_cmake_include_hook(9_finish)

View File

@ -171,6 +171,18 @@ function(upx_cache_bool_vars) # ARGV
endforeach() endforeach()
endfunction() endfunction()
function(upx_platform_check_mismatch var_name_1 var_name_2)
if(DEFINED ${var_name_1} OR DEFINED ${var_name_2})
if(NOT ",${${var_name_1}}," STREQUAL ",${${var_name_2}},")
if(UPX_CONFIG_DISABLE_WERROR)
message(WARNING "WARNING: '${var_name_1}' '${var_name_2}' mismatch")
else()
message(FATAL_ERROR "FATAL ERROR: '${var_name_1}' '${var_name_2}' mismatch")
endif()
endif()
endif()
endfunction()
#*********************************************************************** #***********************************************************************
# compilation flags # compilation flags
#*********************************************************************** #***********************************************************************

View File

@ -4,36 +4,37 @@ set -e; set -o pipefail
# Copyright (C) Markus Franz Xaver Johannes Oberhumer # Copyright (C) Markus Franz Xaver Johannes Oberhumer
# assemble cmake config flags; useful for CI jobs # assemble cmake config flags; useful for CI jobs
# also see misc/make/Makefile-extra.mk
cmake_config_flags=() cmake_config_flags=()
add_flag() { __add_cmake_config() {
[[ -z "${!1}" ]] || cmake_config_flags+=( -D$1="${!1}" ) [[ -z "${!1}" ]] || cmake_config_flags+=( -D$1="${!1}" )
} }
# pass common CMake settings from environment to cmake # pass common CMake settings from environment to cmake
for v in CMAKE_VERBOSE_MAKEFILE; do for v in CMAKE_VERBOSE_MAKEFILE; do
add_flag $v __add_cmake_config $v
done done
# pass common CMake toolchain settings from environment to cmake # pass common CMake toolchain settings from environment to cmake
for v in CMAKE_ADDR2LINE CMAKE_AR CMAKE_DLLTOOL CMAKE_LINKER CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP CMAKE_RANLIB CMAKE_READELF CMAKE_STRIP CMAKE_TAPI; do for v in CMAKE_ADDR2LINE CMAKE_AR CMAKE_DLLTOOL CMAKE_LINKER CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP CMAKE_RANLIB CMAKE_READELF CMAKE_STRIP CMAKE_TAPI; do
add_flag $v __add_cmake_config $v
done done
# pass common CMake LTO toolchain settings from environment to cmake (for use with "-flto") # pass common CMake LTO toolchain settings from environment to cmake (for use with "-flto")
for v in CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB; do for v in CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB; do
add_flag $v __add_cmake_config $v
done done
# pass common CMake cross compilation settings from environment to cmake # pass common CMake cross compilation settings from environment to cmake
for v in CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PROCESSOR CMAKE_CROSSCOMPILING_EMULATOR; do for v in CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PROCESSOR CMAKE_CROSSCOMPILING_EMULATOR; do
add_flag $v __add_cmake_config $v
done done
# pass UPX config options from environment to cmake; see CMakeLists.txt # pass UPX config options from environment to cmake; see CMakeLists.txt
for v in UPX_CONFIG_DISABLE_GITREV UPX_CONFIG_DISABLE_SANITIZE UPX_CONFIG_DISABLE_WSTRICT UPX_CONFIG_DISABLE_WERROR UPX_CONFIG_DISABLE_SELF_PACK_TEST; do for v in UPX_CONFIG_DISABLE_GITREV UPX_CONFIG_DISABLE_SANITIZE UPX_CONFIG_DISABLE_WSTRICT UPX_CONFIG_DISABLE_WERROR UPX_CONFIG_DISABLE_SELF_PACK_TEST; do
add_flag $v __add_cmake_config $v
done done
# pass UPX extra compile options from environment to cmake; see CMakeLists.txt # pass UPX extra compile options from environment to cmake; see CMakeLists.txt
for v in UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2 UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD; do for v in UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2 UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD; do
add_flag $v __add_cmake_config $v
done done
exec "${CMAKE:-cmake}" $UPX_CMAKE_CONFIG_FLAGS "${cmake_config_flags[@]}" "$@" exec "${CMAKE:-cmake}" $UPX_CMAKE_CONFIG_FLAGS "${cmake_config_flags[@]}" "$@"

View File

@ -741,12 +741,14 @@ TEST_CASE("libc snprintf") {
CHECK_EQ(strcmp(buf, "-6.0.0.0.0.0.0.0.6.ffffffffffffffff"), 0); CHECK_EQ(strcmp(buf, "-6.0.0.0.0.0.0.0.6.ffffffffffffffff"), 0);
snprintf(buf, sizeof(buf), "%d.%d.%d.%d.%d.%d.%d.%d.%d.%#jx", -7, 0, 0, 0, 0, 0, 0, 0, 7, um); snprintf(buf, sizeof(buf), "%d.%d.%d.%d.%d.%d.%d.%d.%d.%#jx", -7, 0, 0, 0, 0, 0, 0, 0, 7, um);
CHECK_EQ(strcmp(buf, "-7.0.0.0.0.0.0.0.7.0xffffffffffffffff"), 0); CHECK_EQ(strcmp(buf, "-7.0.0.0.0.0.0.0.7.0xffffffffffffffff"), 0);
snprintf(buf, sizeof(buf), "%#x %#lx %#llx", 17u, 18ul, 19ull); snprintf(buf, sizeof(buf), "%#X %#lx %#llx", 26u, 27ul, 28ull);
CHECK_EQ(strcmp(buf, "0x11 0x12 0x13"), 0); CHECK_EQ(strcmp(buf, "0X1A 0x1b 0x1c"), 0);
snprintf(buf, sizeof(buf), "%#X %#lX %#llX", 20u, 21ul, 22ull); snprintf(buf, sizeof(buf), "%#06x %#06lX %#06llx", 26u, 27ul, 28ull);
CHECK_EQ(strcmp(buf, "0X14 0X15 0X16"), 0); CHECK_EQ(strcmp(buf, "0x001a 0X001B 0x001c"), 0);
snprintf(buf, sizeof(buf), "%#06x %#06lx %#06llx", 23u, 24ul, 25ull); snprintf(buf, sizeof(buf), "%#6x %#6lx %#6llX", 26u, 27ul, 28ull);
CHECK_EQ(strcmp(buf, "0x0017 0x0018 0x0019"), 0); CHECK_EQ(strcmp(buf, " 0x1a 0x1b 0X1C"), 0);
snprintf(buf, sizeof(buf), "%#-6X %#-6lx %#-6llx", 26u, 27ul, 28ull);
CHECK_EQ(strcmp(buf, "0X1A 0x1b 0x1c "), 0);
} }
#if 0 #if 0

View File

@ -131,7 +131,7 @@ TEST_CASE("libc++") {
CHECK(v.end() - v.begin() == N); CHECK(v.end() - v.begin() == N);
CHECK(&v[0] == &(*(v.begin()))); CHECK(&v[0] == &(*(v.begin())));
// CHECK(&v[0] + N == &(*(v.end()))); // TODO later: is this legal?? // CHECK(&v[0] + N == &(*(v.end()))); // TODO later: is this legal??
// TODO later // TODO later: make sure that this throws
#if defined(_LIBCPP_HARDENING_MODE_DEBUG) && \ #if defined(_LIBCPP_HARDENING_MODE_DEBUG) && \
(_LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG) (_LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG)
CHECK_THROWS((void) &v[N]); CHECK_THROWS((void) &v[N]);
@ -176,7 +176,7 @@ struct MyVType2 {
UPX_CXX_DISABLE_ADDRESS(Self) UPX_CXX_DISABLE_ADDRESS(Self)
UPX_CXX_DISABLE_NEW_DELETE(Self) UPX_CXX_DISABLE_NEW_DELETE(Self)
}; };
TEST_CASE("upx_cxx_disable") { TEST_CASE("UPX_CXX_DISABLE_xxx") {
MyType1<char, int, 1> dummy1; MyType1<char, int, 1> dummy1;
MyType2<char, int, 2> dummy2; MyType2<char, int, 2> dummy2;
MyVType1<char, int, 1> vdummy1; MyVType1<char, int, 1> vdummy1;
@ -260,7 +260,7 @@ struct Z2_X2 : public X2 {
// util // util
**************************************************************************/ **************************************************************************/
TEST_CASE("Deleter") { TEST_CASE("upx::ObjectDeleter 1") {
LE16 *o = nullptr; // object LE16 *o = nullptr; // object
LE32 *a = nullptr; // array LE32 *a = nullptr; // array
{ {
@ -275,7 +275,7 @@ TEST_CASE("Deleter") {
assert(a == nullptr); assert(a == nullptr);
} }
TEST_CASE("Deleter") { TEST_CASE("upx::ObjectDeleter 2") {
constexpr size_t N = 2; constexpr size_t N = 2;
BE16 *o[N]; // multiple objects BE16 *o[N]; // multiple objects
BE32 *a[N]; // multiple arrays BE32 *a[N]; // multiple arrays
@ -284,8 +284,10 @@ TEST_CASE("Deleter") {
upx::ArrayDeleter<BE32 **> a_deleter{a, 0}; upx::ArrayDeleter<BE32 **> a_deleter{a, 0};
for (size_t i = 0; i < N; i++) { for (size_t i = 0; i < N; i++) {
o[i] = new BE16; o[i] = new BE16;
assert(o[i] != nullptr);
o_deleter.count += 1; o_deleter.count += 1;
a[i] = New(BE32, 1 + i); a[i] = New(BE32, 1 + i);
assert(a[i] != nullptr);
a_deleter.count += 1; a_deleter.count += 1;
} }
} }
@ -295,7 +297,7 @@ TEST_CASE("Deleter") {
} }
} }
TEST_CASE("ptr_static_cast") { TEST_CASE("upx::ptr_static_cast") {
// check that we don't trigger any -Wcast-align warnings // check that we don't trigger any -Wcast-align warnings
using upx::ptr_static_cast; using upx::ptr_static_cast;
void *vp = nullptr; void *vp = nullptr;
@ -335,7 +337,7 @@ TEST_CASE("ptr_static_cast") {
assert((ic == ptr_static_cast<const int *>(ic))); assert((ic == ptr_static_cast<const int *>(ic)));
} }
TEST_CASE("noncopyable") { TEST_CASE("upx::noncopyable") {
struct Test : private upx::noncopyable { struct Test : private upx::noncopyable {
int v = 1; int v = 1;
}; };
@ -458,7 +460,7 @@ struct TestTriBool {
}; };
} // namespace } // namespace
TEST_CASE("TriBool") { TEST_CASE("upx::TriBool") {
using upx::TriBool, upx::tribool; using upx::TriBool, upx::tribool;
static_assert(!tribool(false)); static_assert(!tribool(false));
static_assert(tribool(true)); static_assert(tribool(true));

View File

@ -96,16 +96,18 @@ void show_usage(void) {
namespace { namespace {
struct PackerNames { struct PackerNames {
PackerNames() noexcept = default;
~PackerNames() noexcept = default;
struct Entry { struct Entry {
const char *fname; const char *fname;
const char *sname; const char *sname;
}; };
Entry names[64]; static constexpr size_t MAX_NAMES = 64;
size_t names_count; Entry names[MAX_NAMES];
const Options *o; size_t names_count = 0;
PackerNames() : names_count(0), o(nullptr) {} const Options *o = nullptr;
void add(const PackerBase *pb) { void add(const PackerBase *pb) {
assert_noexcept(names_count < 64); assert_noexcept(names_count < MAX_NAMES);
names[names_count].fname = pb->getFullName(o); names[names_count].fname = pb->getFullName(o);
names[names_count].sname = pb->getName(); names[names_count].sname = pb->getName();
names_count++; names_count++;

View File

@ -320,12 +320,17 @@ TEST_CASE("MemBuffer global overloads") {
CHECK_THROWS(set_le64(mb4, 0)); CHECK_THROWS(set_le64(mb4, 0));
} }
TEST_CASE("MemBuffer unused") { TEST_CASE("MemBuffer unused 1") {
MemBuffer mb; MemBuffer mb;
CHECK(mb.raw_ptr() == nullptr); CHECK(mb.raw_ptr() == nullptr);
CHECK(mb.raw_size_in_bytes() == 0); CHECK(mb.raw_size_in_bytes() == 0);
} }
TEST_CASE("MemBuffer unused 2") {
MemBuffer mb;
(void) mb;
}
TEST_CASE("MemBuffer array access") { TEST_CASE("MemBuffer array access") {
constexpr size_t N = 16; constexpr size_t N = 16;
MemBuffer mb(N); MemBuffer mb(N);

View File

@ -29,6 +29,9 @@
// dispatch. PackMaster by itself will instantiate a concrete subclass // dispatch. PackMaster by itself will instantiate a concrete subclass
// of class PackerBase which then does the actual work. // of class PackerBase which then does the actual work.
// And see p_com.cpp for a simple executable format. // And see p_com.cpp for a simple executable format.
//
// This file also has the burden to deal with all those pesky low-level
// file handling issues.
#define WANT_WINDOWS_LEAN_H 1 // _get_osfhandle, GetFileTime, SetFileTime #define WANT_WINDOWS_LEAN_H 1 // _get_osfhandle, GetFileTime, SetFileTime
#include "util/system_headers.h" #include "util/system_headers.h"
@ -325,7 +328,7 @@ void do_one_file(const char *const iname, char *const oname) may_throw {
} }
} }
// handle command - actual work is here // handle command - actual work starts HERE
PackMaster pm(&fi, opt); PackMaster pm(&fi, opt);
if (opt->cmd == CMD_COMPRESS) if (opt->cmd == CMD_COMPRESS)
pm.pack(&fo); pm.pack(&fo);