Browse Source

feat: adapt to msvc compiler

master
Dnomd343 7 months ago
parent
commit
76b2f783eb
  1. 22
      CMakeLists.txt
  2. 11
      src/impl/constexpr.inl
  3. 17
      src/impl/core.cc
  4. 8
      src/md5.h
  5. 7
      third_party/ThirdParty.cmake

22
CMakeLists.txt

@ -37,24 +37,38 @@ if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release) # using release build in default
endif()
if (MSVC)
add_compile_options(/W4) # TODO: add `/WX` after fix MSVC warnings
if (MD5_ENABLE_LTO)
add_compile_options(/GL)
add_link_options(/LTCG)
endif()
else()
add_compile_options(-Wall -Wextra -Werror)
if (MD5_ENABLE_LTO)
add_compile_options(-flto=auto)
endif()
endif()
# ------------------------------------------------------------------------------------ #
file(GLOB MD5_SRC src/impl/*.cc)
if (NOT MD5_SHARED_LIB)
add_library(md5sum STATIC ${MD5_SRC})
else()
add_library(md5sum SHARED ${MD5_SRC})
if (NOT MSVC)
target_compile_options(md5sum PRIVATE -fvisibility=hidden)
endif()
endif()
if (MSVC)
set(MD5_COMPILE_OPTIONS /GR-)
else()
set(MD5_COMPILE_OPTIONS
-fno-rtti
-fno-exceptions
-fno-unwind-tables
-fno-asynchronous-unwind-tables)
-fno-rtti -fno-exceptions
-fno-unwind-tables -fno-asynchronous-unwind-tables)
endif()
target_compile_options(md5sum PRIVATE ${MD5_COMPILE_OPTIONS})
target_include_directories(md5sum PUBLIC src/)

11
src/impl/constexpr.inl

@ -36,10 +36,13 @@ constexpr Block GetBlock(const md5_data &data, const uint64_t index) {
Block block {};
for (int i = 0; i < 16; ++i) {
const auto offset = index + i * 4;
(block[i] <<= 8) |= GetByte(data, offset + 3);
(block[i] <<= 8) |= GetByte(data, offset + 2);
(block[i] <<= 8) |= GetByte(data, offset + 1);
(block[i] <<= 8) |= GetByte(data, offset + 0);
block[i] |= GetByte(data, offset + 3);
block[i] <<= 8;
block[i] |= GetByte(data, offset + 2);
block[i] <<= 8;
block[i] |= GetByte(data, offset + 1);
block[i] <<= 8;
block[i] |= GetByte(data, offset + 0);
}
return block;
}

17
src/impl/core.cc

@ -16,17 +16,24 @@ using md5::value::T;
#define H(x, y, z) (x ^ y ^ z)
#define I(x, y, z) (y ^ (x | ~z))
#define STEP(i, f, a, b, c, d) \
#define MD5_ROUND(i, f, a, b, c, d) \
do { \
a += f(b, c, d) + block[K(i)] + T(i); \
a = a << S(i) | a >> (32 - S(i)); \
a += b; \
} while (0)
#define FF(i, ...) STEP((0x00 | i), F, __VA_ARGS__)
#define GG(i, ...) STEP((0x10 | i), G, __VA_ARGS__)
#define HH(i, ...) STEP((0x20 | i), H, __VA_ARGS__)
#define II(i, ...) STEP((0x30 | i), I, __VA_ARGS__)
#ifdef _MSC_VER
#define EXPAND(...) __VA_ARGS__
#define ROUND(...) EXPAND(MD5_ROUND(__VA_ARGS__))
#else
#define ROUND MD5_ROUND
#endif
#define FF(i, ...) ROUND(i | 0x00, F, __VA_ARGS__)
#define GG(i, ...) ROUND(i | 0x10, G, __VA_ARGS__)
#define HH(i, ...) ROUND(i | 0x20, H, __VA_ARGS__)
#define II(i, ...) ROUND(i | 0x30, I, __VA_ARGS__)
#define MD5_UPDATE(OP) \
OP(0x0, R1); OP(0x1, R2); OP(0x2, R3); OP(0x3, R4); \

8
src/md5.h

@ -7,10 +7,18 @@
static_assert(sizeof(uintptr_t) == 8,
"Project only works on 64-bits architecture.");
#ifdef _MSC_VER
static_assert('\x01\x02\x03\x04' == 0x04030201,
#else
static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
#endif
"Project only works on little-endian architecture.");
#if defined(__clang__) || defined(__GNUC__)
#define MD5_EXPORT __attribute__ ((visibility ("default")))
#else
#define MD5_EXPORT
#endif
#include "impl/value.inl"
#include "impl/constexpr.inl"

7
third_party/ThirdParty.cmake

@ -1,9 +1,14 @@
if (MD5_ENABLE_TESTING)
if (MSVC)
set(gtest_force_shared_crt ON)
endif()
add_subdirectory(third_party/googletest/ EXCLUDE_FROM_ALL)
endif()
if (MD5_ENABLE_BENCHMARK)
set(BENCHMARK_ENABLE_TESTING OFF)
if (NOT MSVC)
set(BENCHMARK_ENABLE_EXCEPTIONS OFF)
endif()
set(BENCHMARK_ENABLE_TESTING OFF)
add_subdirectory(third_party/benchmark/ EXCLUDE_FROM_ALL)
endif()

Loading…
Cancel
Save