From 8b122d5a4c4aefc1538e8c420cd18d6343b795a2 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sun, 29 Apr 2018 19:34:14 +0200 Subject: [PATCH] Fix libcds on MinGW --- CMakeLists.txt | 2 + cmake/modules/DetectMachine.cmake | 26 ++++++++++ .../toolchains/common/Ubuntu-MinGW-W64.cmake | 5 +- include/libcds.h | 7 +++ include/mingw-std-threads/mutex | 1 + include/mingw-std-threads/thread | 1 + plugins/CMakeLists.txt | 7 +++ src/3rdparty/CMakeLists.txt | 51 ++++++++++++++++++- src/CMakeLists.txt | 2 +- src/core/MemoryPool.cpp | 8 +-- 10 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 include/mingw-std-threads/mutex create mode 100644 include/mingw-std-threads/thread diff --git a/CMakeLists.txt b/CMakeLists.txt index 387b926d7..5773da891 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,8 @@ INCLUDE_DIRECTORIES( ${Qt5Xml_INCLUDE_DIRS} ) +INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src/3rdparty/mingw-std-threads") + SET(QT_LIBRARIES Qt5::Core Qt5::Gui diff --git a/cmake/modules/DetectMachine.cmake b/cmake/modules/DetectMachine.cmake index f3458165b..c4ab3e516 100644 --- a/cmake/modules/DetectMachine.cmake +++ b/cmake/modules/DetectMachine.cmake @@ -1,3 +1,5 @@ +INCLUDE(CheckCXXSourceCompiles) + IF(WIN32) SET(LMMS_BUILD_WIN32 1) ELSEIF(APPLE) @@ -86,3 +88,27 @@ IF(LMMS_BUILD_APPLE) STRING(REGEX REPLACE "\\.[0-9]*$" "" APPLE_OS_VER "${APPLE_OS_VER}") SET(CMAKE_MACOSX_RPATH 1) ENDIF() + +# Detect MinGW +IF(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + SET(MINGW TRUE) +ENDIF() + +# Detect MINGW thread support +IF(MINGW) + CHECK_CXX_SOURCE_COMPILES(" + #include + #include + int main(int argc, const char* argv[]) { + std::mutex m; + std::this_thread::yield(); + return 0; + } + " HAS_STD_THREADS) + IF(NOT HAS_STD_THREADS) + SET(NEED_MINGW_THREADS_REPLACEMENT TRUE) + ELSE() + SET(NEED_MINGW_THREADS_REPLACEMENT FALSE) + ENDIF() + MESSAGE(NEED_MINGW_THREADS_REPLACEMENT ${NEED_MINGW_THREADS_REPLACEMENT}) +ENDIF() diff --git a/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake b/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake index 2f78a441e..bd68a89be 100644 --- a/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake +++ b/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake @@ -5,13 +5,16 @@ set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) -set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) +set(MINGW_PREFIX /usr/${TOOLCHAIN_PREFIX}) + +set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) SET(ENV{PKG_CONFIG} /usr/bin/${TOOLCHAIN_PREFIX}-pkg-config) IF(WIN64) SET(TOOLCHAIN_PREFIX32 ${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32) SET(CMAKE_C_COMPILER32 ${TOOLCHAIN_PREFIX32}-gcc) SET(CMAKE_CXX_COMPILER32 ${TOOLCHAIN_PREFIX32}-g++) + set(MINGW_PREFIX32 /usr/${TOOLCHAIN_PREFIX32}) ENDIF() INCLUDE(${CMAKE_CURRENT_LIST_DIR}/WinCrossCompile.cmake) diff --git a/include/libcds.h b/include/libcds.h index 0d095d03c..7acbabea7 100644 --- a/include/libcds.h +++ b/include/libcds.h @@ -1,7 +1,14 @@ #pragma once +#include + #include "NiftyCounter.h" +#if defined(__MINGW32__) && !defined(_GLIBCXX_HAS_GTHREADS) +# include "mingw-std-threads/thread" +# include "mingw-std-threads/mutex" +#endif + namespace _cdslib { void init(); diff --git a/include/mingw-std-threads/mutex b/include/mingw-std-threads/mutex new file mode 100644 index 000000000..afeaf55b1 --- /dev/null +++ b/include/mingw-std-threads/mutex @@ -0,0 +1 @@ +#include "mingw.mutex.h" diff --git a/include/mingw-std-threads/thread b/include/mingw-std-threads/thread new file mode 100644 index 000000000..0108f8ad7 --- /dev/null +++ b/include/mingw-std-threads/thread @@ -0,0 +1 @@ +#include "mingw.thread.h" diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 4f139f8b3..fe8a5faa9 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -9,6 +9,13 @@ IF(LMMS_BUILD_APPLE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") ENDIF() +IF(MINGW_PREFIX) + # There's a bug in some CMake or MinGW versions that passes -std=c++11 when + # compiling C files (e.g. fmopl.c). Remove -Werror for plugins to work + # around this. + STRING(REPLACE "-Werror " "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) +ENDIF() + INCLUDE_DIRECTORIES( ${SAMPLERATE_INCLUDE_DIRS} "${CMAKE_BINARY_DIR}/src" diff --git a/src/3rdparty/CMakeLists.txt b/src/3rdparty/CMakeLists.txt index b2d73accc..5156cc4a1 100644 --- a/src/3rdparty/CMakeLists.txt +++ b/src/3rdparty/CMakeLists.txt @@ -11,4 +11,53 @@ ENDIF() ADD_SUBDIRECTORY(rpmalloc) ADD_SUBDIRECTORY(weakjack) -ADD_SUBDIRECTORY(libcds) +IF(WIN32 AND CMAKE_COMPILER_IS_GNUCXX) + SET(MINGW TRUE) +ENDIF() + +IF(MINGW) + # Work around linking errors with MinGW + SET(CDS_LIBRARY_TYPE SHARED) +ELSE() + SET(CDS_LIBRARY_TYPE STATIC) +ENDIF() + +ADD_LIBRARY(cds ${CDS_LIBRARY_TYPE} + libcds/src/init.cpp + libcds/src/hp.cpp + libcds/src/dhp.cpp + libcds/src/urcu_gp.cpp + libcds/src/urcu_sh.cpp + libcds/src/thread_data.cpp + libcds/src/topology_hpux.cpp + libcds/src/topology_linux.cpp + libcds/src/topology_osx.cpp + libcds/src/dllmain.cpp +) +SET_TARGET_PROPERTIES(cds PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON +) +TARGET_INCLUDE_DIRECTORIES(cds + PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/libcds" +) + +IF(NEED_MINGW_THREADS_REPLACEMENT) + # Provide win32 threads implementation + TARGET_INCLUDE_DIRECTORIES(cds BEFORE + PRIVATE "${CMAKE_SOURCE_DIR}/include/mingw-std-threads" + PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/mingw-std-threads" + ) +ENDIF() + +IF(CDS_LIBRARY_TYPE STREQUAL "STATIC") + TARGET_COMPILE_DEFINITIONS(cds + PRIVATE CDS_BUILD_STATIC_LIB + ) +ELSE() + TARGET_COMPILE_DEFINITIONS(cds + PRIVATE CDS_BUILD_LIB + ) + # Install DLL + install(TARGETS cds RUNTIME DESTINATION .) +ENDIF() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1cfe0e208..a49d3ed1e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -168,7 +168,7 @@ SET(LMMS_REQUIRED_LIBS ${LMMS_REQUIRED_LIBS} ${SNDFILE_LIBRARIES} ${EXTRA_LIBRARIES} rpmalloc - cds-s + cds ) # Expose required libs for tests binary diff --git a/src/core/MemoryPool.cpp b/src/core/MemoryPool.cpp index a9cde2701..62dfad078 100644 --- a/src/core/MemoryPool.cpp +++ b/src/core/MemoryPool.cpp @@ -14,8 +14,8 @@ #include -#include #include "libcds.h" +#include #include "Memory.h" @@ -24,9 +24,9 @@ class _MemoryPool_Private : MmAllocator using Alloc = MmAllocator; public: _MemoryPool_Private(size_t size, size_t nmemb) - : m_freelist(nmemb) - , m_elementSize(size) + : m_elementSize(size) , m_numElms(nmemb) + , m_freelist(nmemb) { m_buffer = new char[m_elementSize * m_numElms]; for (size_t i = 0; i < m_numElms; i++) { @@ -67,7 +67,7 @@ public: { if (is_from_pool(ptr)) { bool pushed = m_freelist.push(reinterpret_cast(ptr)); - assert(pushed); + assert(pushed); Q_UNUSED(pushed); } else { do_deallocate(ptr); }