set(wx_sdl_c_code " #include #if (wxUSE_LIBSDL == 0) #error cmake_WX_SDL #endif int main() { return 0; } ") set(gcc7_mmx_code " #include #include #include #include class alignas(16) GSVector4i { public: __m128i m; explicit GSVector4i(__m128i m) { this->m = m; } static void storel(void* p, const GSVector4i& v) { _mm_storel_epi64((__m128i*)p, v.m); } static GSVector4i loadl(const void* p) { return GSVector4i(_mm_loadl_epi64((__m128i*)p)); } bool eq(const GSVector4i& v) const { return _mm_movemask_epi8(_mm_cmpeq_epi32(m, v.m)) == 0xffff; } }; union GIFRegTRXPOS { unsigned long long u64; void operator = (const GSVector4i& v) {GSVector4i::storel(this, v);} bool operator != (const union GIFRegTRXPOS& r) const {return !((GSVector4i)r).eq(*this);} operator GSVector4i() const {return GSVector4i::loadl(this);} }; extern GIFRegTRXPOS TRXPOS; GIFRegTRXPOS TRXPOS = {}; void GIFRegHandlerTRXPOS(const GIFRegTRXPOS& p) { if(p != TRXPOS) { printf(\"foo\"); } TRXPOS = (GSVector4i)p; } int main() { GIFRegTRXPOS r = {}; GIFRegHandlerTRXPOS(r); uint16_t fpu[16] = {0}; __asm__ __volatile__(\"fstenv %0\" : \"=m\"(fpu)); bool ok = fpu[4] == 0xFFFF; if (!ok) { printf(\"Wrong MMX state !\"); exit(1); } return 0; } ") function(WX_vs_SDL) file(WRITE "${CMAKE_BINARY_DIR}/wx_sdl.c" "${wx_sdl_c_code}") enable_language(C) try_compile( wx_linked_to_sdl "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/wx_sdl.c" CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${wxWidgets_INCLUDE_DIRS}" LINK_LIBRARIES "${wxWidgets_LIBRARIES}" COPY_FILE "${CMAKE_BINARY_DIR}/wx_sdl" ) if (NOT wx_linked_to_sdl) return() endif() execute_process( COMMAND ldd "${CMAKE_BINARY_DIR}/wx_sdl" COMMAND grep -c SDL2 OUTPUT_VARIABLE sdl2_count ) if (SDL2_API AND sdl2_count STREQUAL "0") message(FATAL_ERROR "wxWidgets is linked to SDL1.2. Please use -DSDL2_API=FALSE.") elseif (NOT SDL2_API AND NOT sdl2_count STREQUAL "0") message(FATAL_ERROR "wxWidgets is linked to SDL2. Please use -DSDL2_API=TRUE") endif() endfunction() function(GCC7_BUG) # try_run doesn't work when cross-compiling is enabled. It is completely silly in our case # as i386 binaries are 100% fine on x64. set(OLD_CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) set(CMAKE_CROSSCOMPILING 0) set(IN "${CMAKE_BINARY_DIR}/gcc7_mmx.cpp") file(WRITE "${IN}" "${gcc7_mmx_code}") enable_language(CXX) try_run( run_result compile_result_unused "${CMAKE_BINARY_DIR}" "${IN}" CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=-msse -msse2 -O2 -m32 -march=i686" ) if (${run_result}) message(FATAL_ERROR "GCC 7.0/7.1 generates invalid code => https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80799\n" "You can either backport the fix or swith to another version of GCC.") endif() set(CMAKE_CROSSCOMPILING ${OLD_CMAKE_CROSSCOMPILING}) endfunction()