diff --git a/CMakeLists.txt b/CMakeLists.txt index a37e7a1b92..554e507d90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,9 @@ option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1) option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1) option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and integration tests" 0) option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) +option(SLIC3R_MSAN "Enable MemorySanitizer on Clang for Linux" 0) +option(SLIC3R_MSAN_RECOVERY "Enable recovery from an error after an initialized value is found" 1) # It is enabled by default until all reports are investigated. +option(SLIC3R_MSAN_ORIGIN_TRACKING "Enable tracking origins of uninitialized values" 0) # It causes another slows down of program execution by a factor of 1.5x-2x. # If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable. CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0) @@ -249,6 +252,44 @@ if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMP endif() +if (SLIC3R_MSAN) + if (NOT CMAKE_CXX_COMPILER_ID STREQUAL Clang) + message(FATAL_ERROR "MemorySanitizer is available only in Clang.") + endif () + + if (SLIC3R_ASAN) + message(FATAL_ERROR "MemorySanitizer cannot be used at the same time as AddressSanitizer.") + endif () + + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 12) + message(WARNING "MemorySanitizer builds are tested only with CLANG 12, other versions are untested but could be working.") + endif() + + add_compile_options(-nostdinc++) + add_compile_options(-stdlib=libc++) + add_compile_options(-fsanitize=memory) + add_compile_options(-fno-omit-frame-pointer) + + include_directories(${CMAKE_PREFIX_PATH}/include) + include_directories(${CMAKE_PREFIX_PATH}/include/c++/v1) + link_directories(${CMAKE_PREFIX_PATH}/lib) + + # Some libraries aren't correctly found without -Wl,--disable-new-dtags. https://stackoverflow.com/a/47243544 + set(_msan_linker_flags "-fsanitize=memory -stdlib=libc++ -L${CMAKE_PREFIX_PATH}/lib -Wl,--disable-new-dtags -Wl,--rpath='$ORIGIN/../lib'") + if (SLIC3R_MSAN_RECOVERY) + add_compile_options(-fsanitize-recover=memory) + set(_msan_linker_flags "${_msan_linker_flags} -fsanitize-recover=memory") + endif () + if (SLIC3R_MSAN_ORIGIN_TRACKING) + add_compile_options(-fsanitize-memory-track-origins=2) + set(_msan_linker_flags "${_msan_linker_flags} -fsanitize-memory-track-origins=2") + endif () + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_msan_linker_flags}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_msan_linker_flags}") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${_msan_linker_flags}") +endif () + if (SLIC3R_ASAN) # ASAN should be available on MSVC starting with Visual Studio 2019 16.9 # https://devblogs.microsoft.com/cppblog/address-sanitizer-for-msvc-now-generally-available/ @@ -634,6 +675,14 @@ else () install(FILES src/platform/unix/PrusaSlicer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") + + if (SLIC3R_MSAN) + install(CODE "set(_MSAN_COPY_FROM \"${CMAKE_PREFIX_PATH}/../lib\")") + install(CODE "set(_MSAN_COPY_TO \"${CMAKE_INSTALL_PREFIX}/lib\")") + install(SCRIPT deps/MSan_Deps/Chromium_prebuilt_libraries/copy_chromium_prebuilt_libraries.cmake) + install(CODE "set(_MSAN_COPY_FROM \"${CMAKE_PREFIX_PATH}/lib\")") + install(SCRIPT deps/MSan_Deps/install_msan_shared_libraries.cmake) + endif () endif () configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp) diff --git a/deps/Blosc/Blosc.cmake b/deps/Blosc/Blosc.cmake index 45c45c7c9e..8d0937bb5e 100644 --- a/deps/Blosc/Blosc.cmake +++ b/deps/Blosc/Blosc.cmake @@ -11,7 +11,7 @@ prusaslicer_add_cmake_project(Blosc #URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip URL_HASH SHA256=dcb48bf43a672fa3de6a4b1de2c4c238709dad5893d1e097b8374ad84b1fc3b3 - DEPENDS ${ZLIB_PKG} + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} # Patching upstream does not work this way with git version 2.28 installed on mac worker # PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/blosc-mods.patch CMAKE_ARGS @@ -21,6 +21,7 @@ prusaslicer_add_cmake_project(Blosc -DBUILD_TESTS=OFF -DBUILD_BENCHMARKS=OFF -DPREFER_EXTERNAL_ZLIB=ON + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/Boost/Boost.cmake b/deps/Boost/Boost.cmake index ae2bd96466..96d8ecabc3 100644 --- a/deps/Boost/Boost.cmake +++ b/deps/Boost/Boost.cmake @@ -35,7 +35,13 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if (WIN32) set(_boost_toolset "clang-win") else() - set(_boost_toolset "clang") + if (DEP_MSAN) + configure_file(${CMAKE_CURRENT_LIST_DIR}/msan-user-config.jam boost-user-config.jam) + set(_boost_toolset clang) + set(_patch_command ${_patch_command} && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) + else () + set(_boost_toolset "clang") + endif() endif() elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(_boost_toolset "intel") @@ -68,8 +74,15 @@ ProcessorCount(NPROC) file(TO_NATIVE_PATH ${DESTDIR}/usr/local/ _prefix) set(_boost_flags "") -if (UNIX) - set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC") +if (UNIX) + if (DEP_MSAN) + set(_boost_flags + "cflags=-fPIC ${MSAN_CMAKE_C_FLAGS};" + "cxxflags=-fPIC ${MSAN_CMAKE_CXX_FLAGS};" + "linkflags=-fPIC ${MSAN_CMAKE_LD_FLAGS}") + else() + set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC") + endif() elseif(APPLE) set(_boost_flags "cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};" @@ -121,6 +134,7 @@ ExternalProject_Add( dep_Boost URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz" URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a + DEPENDS ${LIBCXX_PKG} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost CONFIGURE_COMMAND "${_bootstrap_cmd}" PATCH_COMMAND ${_patch_command} diff --git a/deps/Boost/msan-user-config.jam b/deps/Boost/msan-user-config.jam new file mode 100644 index 0000000000..f7107135ac --- /dev/null +++ b/deps/Boost/msan-user-config.jam @@ -0,0 +1 @@ +using clang : : @CMAKE_CXX_COMPILER@ ; \ No newline at end of file diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index b43467b539..f5905e40cb 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -5,7 +5,9 @@ prusaslicer_add_cmake_project( # For whatever reason, this keeps downloading forever (repeats downloads if finished) URL https://github.com/CGAL/cgal/archive/releases/CGAL-5.0.zip URL_HASH SHA256=c2b035bd078687b6d8c0fb6371a7443adcdb647856af9969532c4050cd5f48e5 - DEPENDS dep_Boost dep_GMP dep_MPFR + DEPENDS ${LIBCXX_PKG} dep_Boost dep_GMP dep_MPFR + CMAKE_ARGS + ${MSAN_CMAKE_ARGS} ) include(GNUInstallDirs) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index bc98e0b836..57f3ce783f 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -40,6 +40,12 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF) endif() +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + option(DEP_MSAN "Enable MemorySanitizer on Clang for Linux" OFF) + option(DEP_MSAN_RECOVERY "Enable recovery from an error after an initialized value is found" ON) # It is enabled by default until all reports are investigated. + option(DEP_MSAN_ORIGIN_TRACKING "Enable tracking origins of uninitialized values" OFF) # It causes another slows down of program execution by a factor of 1.5x-2x. +endif() + # On developer machines, it can be enabled to speed up compilation and suppress warnings coming from IGL. # FIXME: # Enabling this option is not safe. IGL will compile itself with its own version of Eigen while @@ -141,18 +147,64 @@ else() include("deps-linux.cmake") endif() +if (DEP_MSAN) + if (NOT CMAKE_CXX_COMPILER_ID STREQUAL Clang) + message(FATAL_ERROR "MemorySanitizer is available only in Clang.") + endif () + + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 12) + message(WARNING "MemorySanitizer builds are tested only with CLANG 12, other versions are untested but could be working.") + endif() + + file(MAKE_DIRECTORY ${DESTDIR}/usr/lib) + + include(MSan_Deps/Libcxx/Libcxx.cmake) + include(MSan_Deps/Chromium_prebuilt_libraries/Chromium.cmake) + include(MSan_Deps/LLVM/LLVM.cmake) + include(MSan_Deps/Mesa3D/Mesa3D.cmake) + include(MSan_Deps/fontconfig/fontconfig.cmake) + + set(_msan_linker_flags "-fsanitize=memory") + if (DEP_MSAN_RECOVERY) + set(_msan_linker_flags "${_msan_linker_flags} -fsanitize-recover=memory") + endif () + if (DEP_MSAN_ORIGIN_TRACKING) + set(_msan_linker_flags "${_msan_linker_flags} -fsanitize-memory-track-origins=2") + endif () + set(_msan_common_flags "${_msan_linker_flags} -fno-omit-frame-pointer") + set(_msan_only_cxx_flags "-nostdinc++ -stdlib=libc++ -isystem ${DESTDIR}/usr/local/include -isystem ${DESTDIR}/usr/local/include/c++/v1") + set(_msan_only_ld_flags "-nostdinc++ -stdlib=libc++ -L${DESTDIR}/usr/local/lib -Wl,--rpath=${DESTDIR}/usr/local/lib") + + # For dependencies that are configure using CFLAGS, CXXFLAGS and LDFLAGS instead of CMAKE_*_FLAGS. + set(MSAN_CMAKE_C_FLAGS "${_msan_common_flags}") + set(MSAN_CMAKE_CXX_FLAGS "${_msan_common_flags} ${_msan_only_cxx_flags}") + set(MSAN_CMAKE_LD_FLAGS "${_msan_common_flags} ${_msan_only_ld_flags}") + + set(_msan_all_flags "${_msan_common_flags} ${_msan_only_cxx_flags} ${_msan_only_ld_flags}") + set(MSAN_CMAKE_ARGS ${_MSAN_CMAKE_ARGS} + -DCMAKE_C_FLAGS:STRING=${MSAN_CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS:STRING=${_msan_all_flags}) + + set(LIBCXX_PKG dep_Libcxx) + set(FONTCONFIG_PKG dep_fontconfig) +else () + set(MSAN_CMAKE_ARGS "") + set(LIBCXX_PKG "") + set(FONTCONFIG_PKG "") +endif () + set(ZLIB_PKG "") -if (NOT ZLIB_FOUND) +if (NOT ZLIB_FOUND OR DEP_MSAN) include(ZLIB/ZLIB.cmake) set(ZLIB_PKG dep_ZLIB) endif () set(PNG_PKG "") -if (NOT PNG_FOUND) +if (NOT PNG_FOUND OR DEP_MSAN) include(PNG/PNG.cmake) set(PNG_PKG dep_PNG) endif () set(EXPAT_PKG "") -if (NOT EXPAT_FOUND) +if (NOT EXPAT_FOUND OR DEP_MSAN) include(EXPAT/EXPAT.cmake) set(EXPAT_PKG dep_EXPAT) endif () @@ -209,6 +261,10 @@ else() #list(APPEND _dep_list "dep_libigl") endif() +if (DEP_MSAN) + list(APPEND _dep_list "dep_LLVM;dep_Mesa3D;dep_fontconfig;dep_Chromium_Libs") +endif () + add_custom_target(deps ALL DEPENDS ${_dep_list}) # Note: I'm not using any of the LOG_xxx options in ExternalProject_Add() commands diff --git a/deps/CURL/CURL.cmake b/deps/CURL/CURL.cmake index a05a4e97e9..e0d93fd9a8 100644 --- a/deps/CURL/CURL.cmake +++ b/deps/CURL/CURL.cmake @@ -59,7 +59,7 @@ prusaslicer_add_cmake_project(CURL # GIT_TAG curl-7_75_0 URL https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip URL_HASH SHA256=a63ae025bb0a14f119e73250f2c923f4bf89aa93b8d4fafa4a9f5353a96a765a - DEPENDS ${ZLIB_PKG} + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} # PATCH_COMMAND ${GIT_EXECUTABLE} checkout -f -- . && git clean -df && # ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/curl-mods.patch CMAKE_ARGS @@ -67,6 +67,7 @@ prusaslicer_add_cmake_project(CURL -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCURL_STATICLIB=${_curl_static} ${_curl_platform_flags} + ${MSAN_CMAKE_ARGS} ) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") diff --git a/deps/Cereal/Cereal.cmake b/deps/Cereal/Cereal.cmake index 28912ff4ff..2378c9e588 100644 --- a/deps/Cereal/Cereal.cmake +++ b/deps/Cereal/Cereal.cmake @@ -1,6 +1,8 @@ prusaslicer_add_cmake_project(Cereal URL "https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz" URL_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4 + DEPENDS ${LIBCXX_PKG} CMAKE_ARGS -DJUST_INSTALL_CEREAL=on + ${MSAN_CMAKE_ARGS} ) \ No newline at end of file diff --git a/deps/EXPAT/EXPAT.cmake b/deps/EXPAT/EXPAT.cmake index ed5eb220f4..1aac605dd2 100644 --- a/deps/EXPAT/EXPAT.cmake +++ b/deps/EXPAT/EXPAT.cmake @@ -2,6 +2,9 @@ prusaslicer_add_cmake_project(EXPAT # GIT_REPOSITORY https://github.com/nigels-com/glew.git # GIT_TAG 3a8eff7 # 2.1.0 SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat + DEPENDS ${LIBCXX_PKG} + CMAKE_ARGS + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake index 5916ce7eb7..98b6f5dddb 100644 --- a/deps/GLEW/GLEW.cmake +++ b/deps/GLEW/GLEW.cmake @@ -5,6 +5,9 @@ find_package(OpenGL QUIET REQUIRED) prusaslicer_add_cmake_project( GLEW SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew + DEPENDS ${LIBCXX_PKG} + CMAKE_ARGS + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/GMP/GMP.cmake b/deps/GMP/GMP.cmake index 6b0f970852..4a80159a1b 100644 --- a/deps/GMP/GMP.cmake +++ b/deps/GMP/GMP.cmake @@ -17,9 +17,15 @@ if (MSVC) add_custom_target(dep_GMP SOURCES ${_output}) else () - set(_gmp_ccflags "-O2 -DNDEBUG -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common") + set(_gmp_ccflags "-O2 -DNDEBUG -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common") + set(_gmp_cxxflags "${_gmp_ccflags}") set(_gmp_build_tgt "${CMAKE_SYSTEM_PROCESSOR}") + if (DEP_MSAN) + set(_gmp_ccflags "${_gmp_ccflags} ${MSAN_CMAKE_C_FLAGS}") + set(_gmp_cxxflags "${_gmp_cxxflags} ${MSAN_CMAKE_CXX_FLAGS} ${MSAN_CMAKE_LD_FLAGS} ${MSAN_CMAKE_RPATH}") + endif () + if (APPLE) if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") set(_gmp_build_tgt aarch64) @@ -45,9 +51,10 @@ else () ExternalProject_Add(dep_GMP URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.bz2 URL_HASH SHA256=eae9326beb4158c386e39a356818031bd28f3124cf915f8c5b1dc4c7a36b4d7c + DEPENDS ${LIBCXX_PKG} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/GMP - BUILD_IN_SOURCE ON - CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" ${_gmp_build_tgt} + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_cxxflags}" ./configure ${_cross_compile_arg} --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" ${_gmp_build_tgt} BUILD_COMMAND make -j INSTALL_COMMAND make install ) diff --git a/deps/JPEG/JPEG.cmake b/deps/JPEG/JPEG.cmake index 4c8c0307e5..36d66d55cc 100644 --- a/deps/JPEG/JPEG.cmake +++ b/deps/JPEG/JPEG.cmake @@ -1,8 +1,9 @@ prusaslicer_add_cmake_project(JPEG URL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/2.0.6.zip URL_HASH SHA256=017bdc33ff3a72e11301c0feb4657cb27719d7f97fa67a78ed506c594218bbf1 - DEPENDS ${ZLIB_PKG} + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} CMAKE_ARGS -DENABLE_SHARED=OFF -DENABLE_STATIC=ON + ${MSAN_CMAKE_ARGS} ) diff --git a/deps/MPFR/MPFR.cmake b/deps/MPFR/MPFR.cmake index c29bb39ad0..c4ab18d799 100644 --- a/deps/MPFR/MPFR.cmake +++ b/deps/MPFR/MPFR.cmake @@ -28,9 +28,10 @@ else () ExternalProject_Add(dep_MPFR URL http://ftp.vim.org/ftp/gnu/mpfr/mpfr-3.1.6.tar.bz2 https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.tar.bz2 # mirrors are allowed URL_HASH SHA256=cf4f4b2d80abb79e820e78c8077b6725bbbb4e8f41896783c899087be0e94068 + DEPENDS ${LIBCXX_PKG} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/MPFR BUILD_IN_SOURCE ON - CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --prefix=${DESTDIR}/usr/local --enable-shared=no --enable-static=yes --with-gmp=${DESTDIR}/usr/local ${_gmp_build_tgt} + CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_cxxflags}" ./configure ${_cross_compile_arg} --prefix=${DESTDIR}/usr/local --enable-shared=no --enable-static=yes --with-gmp=${DESTDIR}/usr/local ${_gmp_build_tgt} BUILD_COMMAND make -j INSTALL_COMMAND make install DEPENDS dep_GMP diff --git a/deps/MSan_Deps/Chromium_prebuilt_libraries/Chromium.cmake b/deps/MSan_Deps/Chromium_prebuilt_libraries/Chromium.cmake new file mode 100644 index 0000000000..53ce81f766 --- /dev/null +++ b/deps/MSan_Deps/Chromium_prebuilt_libraries/Chromium.cmake @@ -0,0 +1,17 @@ +if (DEP_MSAN_ORIGIN_TRACKING) + set(chromium_url https://www.googleapis.com/download/storage/v1/b/chromium-browser-msan/o/linux-release%2Fmsan-chained-origins-linux-release-812431.zip?alt=media) + set(chromium_url_hash b99c3e50ab936e44f6e5b4e28b7f8bab0b01912bcb068af258f366fe1e18a6f6) +else () + set(chromium_url https://www.googleapis.com/download/storage/v1/b/chromium-browser-msan/o/linux-release%2Fmsan-no-origins-linux-release-812433.zip?alt=media) + set(chromium_url_hash cfacfe4c2c3ee284015b74ada493cb992d4f7ac82e6325d27384d18437738c4c) +endif () + +ExternalProject_Add(dep_Chromium_Libs + URL ${chromium_url} + URL_HASH SHA256=${chromium_url_hash} + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Chromium_Libs + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND ${CMAKE_COMMAND} "-D_MSAN_COPY_FROM=./instrumented_libraries_prebuilt/msan/lib" "-D_MSAN_COPY_TO=${DESTDIR}/usr/lib" -P ${CMAKE_CURRENT_LIST_DIR}/copy_chromium_prebuilt_libraries.cmake + ) diff --git a/deps/MSan_Deps/Chromium_prebuilt_libraries/copy_chromium_prebuilt_libraries.cmake b/deps/MSan_Deps/Chromium_prebuilt_libraries/copy_chromium_prebuilt_libraries.cmake new file mode 100644 index 0000000000..927ef72c8b --- /dev/null +++ b/deps/MSan_Deps/Chromium_prebuilt_libraries/copy_chromium_prebuilt_libraries.cmake @@ -0,0 +1,86 @@ +function(copy_chromium_prebuilt_libraries path_from path_to) + if (NOT ${ARGC} EQUAL 2) + message(FATAL_ERROR "Invalid argument count.") + endif() + + set(chromium_libs_list + libatk-1.0 + libatk-bridge-2.0 + libatspi + libcairo + libcairo-gobject + libcairo-script-interpreter + libdbus-1 + libdbus-glib-1 + libdbusmenu-glib + libdbusmenu-gtk + libdbusmenu-gtk3 + libdbusmenu-jsonloader + libffi + libfreetype + libgdk-3 + libgdk_pixbuf-2.0 + libgdk_pixbuf_xlib-2.0 + libgio-2.0 + libglib-2.0 + libgobject-2.0 + libgtk-3 + libharfbuzz + libharfbuzz-gobject + libharfbuzz-icu + libjasper + libpango-1.0 + libpangocairo-1.0 + libpangoft2-1.0 + libpangoxft-1.0 + libpixman-1 + libpng12 + libsecret-1 + libudev + libX11 + libX11-xcb + libXau + libxcb + libXcomposite + libXcursor + libXdamage + libXdmcp + libXext + libXfixes + libXinerama + libXi + libXrandr + libXrender + libXss + libXtst) + + set(chromium_libs_dirs_list + cairo + dbus-1.0 + glib-2.0 + gtk-2.0 + gtk-3.0 + udev) + + foreach(chromium_lib ${chromium_libs_list}) + file(GLOB chromium_lib_files "${path_from}/${chromium_lib}*") + if (NOT chromium_lib_files) + message(FATAL_ERROR "Library \"${chromium_lib}\" was not found.") + endif() + foreach(chromium_lib_file ${chromium_lib_files}) + file(COPY ${chromium_lib_file} DESTINATION ${path_to}) + message("Copying file: ${chromium_lib_file}.") + endforeach() + endforeach() + + foreach(chromium_lib_dir ${chromium_libs_dirs_list}) + file(GLOB lib_directory "${path_from}/${chromium_lib_dir}") + if (NOT lib_directory) + message(FATAL_ERROR "Library directory \"${chromium_lib_dir}\" was not found.") + endif() + file(COPY ${lib_directory} DESTINATION ${path_to}) + message("Copying directory: ${lib_directory}.") + endforeach() +endfunction() + +copy_chromium_prebuilt_libraries(${_MSAN_COPY_FROM} ${_MSAN_COPY_TO}) diff --git a/deps/MSan_Deps/LLVM/LLVM.cmake b/deps/MSan_Deps/LLVM/LLVM.cmake new file mode 100644 index 0000000000..79576e5850 --- /dev/null +++ b/deps/MSan_Deps/LLVM/LLVM.cmake @@ -0,0 +1,54 @@ +set(projectname LLVM) + +set(_llvm_cmake_c_flags "-fPIC") +set(_llvm_cmake_cxx_flags "-nostdinc++ -isystem ${DESTDIR}/usr/local/include -isystem ${DESTDIR}/usr/local/include/c++/v1 -fPIC") +set(_llvm_cmake_exe_linker_flags "-stdlib=libc++ -Wl,--rpath=${DESTDIR}/usr/local/lib -L${DESTDIR}/usr/local/lib -fsanitize=memory -fPIC") +set(_llvm_cmake_shared_linker_flags "-stdlib=libc++ -Wl,--rpath=${DESTDIR}/usr/local/lib -L${DESTDIR}/usr/local/lib -fsanitize=memory -fPIC") +set(_llvm_cmake_module_linker_flags "-stdlib=libc++ -Wl,--rpath=${DESTDIR}/usr/local/lib -L${DESTDIR}/usr/local/lib -fsanitize=memory -fPIC") + +# TODO: Build LLVM statically and link with Mesa 3D. + +ExternalProject_Add(dep_LLVM + URL https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.1/llvm-project-12.0.1.src.tar.xz + URL_HASH SHA256=129cb25cd13677aad951ce5c2deb0fe4afc1e9d98950f53b51bdcfb5a73afa0e + DEPENDS dep_Libcxx + EXCLUDE_FROM_ALL ON + INSTALL_DIR ${DESTDIR}/usr/local + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/LLVM + LIST_SEPARATOR | # Use the alternate list separator because by default all ; are replaced by space + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}/usr/local + -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules + -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}/usr/local + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE} + + -DCMAKE_BUILD_TYPE=Release + -DLLVM_USE_SANITIZER=MemoryWithOrigins + # -DLLVM_ENABLE_PROJECTS=clang|lld|llvm-config + -DLLVM_ENABLE_PROJECTS=LLVM|llvm-config + -DLLVM_ENABLE_LIBCXX=ON + + # This forces to make shared library. + -DLLVM_BUILD_LLVM_DYLIB=ON + -DLLVM_LINK_LLVM_DYLIB=ON + -DLLVM_DYLIB_COMPONENTS=all + + # -DLLVM_TARGETS_TO_BUILD=X86 + -DLLVM_ENABLE_PIC=ON + + + -DCMAKE_C_FLAGS:STRING=${_llvm_cmake_c_flags} + -DCMAKE_CXX_FLAGS:STRING=${_llvm_cmake_cxx_flags} + -DCMAKE_EXE_LINKER_FLAGS:STRING=${_llvm_cmake_exe_linker_flags} + -DCMAKE_SHARED_LINKER_FLAGS:STRING=${_llvm_cmake_shared_linker_flags} + -DCMAKE_MODULE_LINKER_FLAGS:STRING=${_llvm_cmake_module_linker_flags} + + SOURCE_SUBDIR llvm + BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release --target LLVM llvm-config -- ${_build_j} + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --config Release --target install-LLVM install-llvm-config install-llvm-headers + COMMAND ln -sfn "../local/lib/libLLVM.so" "${DESTDIR}/usr/lib/libLLVM.so" + COMMAND ln -sfn "../local/lib/libLLVM-12.so" "${DESTDIR}/usr/lib/libLLVM-12.so" + COMMAND ln -sfn "../local/lib/libLLVM-12.0.1.so" "${DESTDIR}/usr/lib/libLLVM-12.0.1.so" + ) diff --git a/deps/MSan_Deps/Libcxx/Libcxx.cmake b/deps/MSan_Deps/Libcxx/Libcxx.cmake new file mode 100644 index 0000000000..a00720a7ef --- /dev/null +++ b/deps/MSan_Deps/Libcxx/Libcxx.cmake @@ -0,0 +1,28 @@ +set(_build_j "-j${NPROC}") +ExternalProject_Add(dep_Libcxx + URL https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.1/llvm-project-12.0.1.src.tar.xz + URL_HASH SHA256=129cb25cd13677aad951ce5c2deb0fe4afc1e9d98950f53b51bdcfb5a73afa0e + EXCLUDE_FROM_ALL ON + INSTALL_DIR ${DESTDIR}/usr/local + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Libcxx + LIST_SEPARATOR | # Use the alternate list separator because by default all ; are replaced by space + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}/usr/local + -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules + -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}/usr/local + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_BUILD_TYPE=Release + -DLLVM_ENABLE_PROJECTS=libcxx|libcxxabi + -DLLVM_USE_SANITIZER=MemoryWithOrigins + SOURCE_SUBDIR llvm + BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release --target cxx cxxabi -- ${_build_j} + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --config Release --target install-cxx install-cxxabi + COMMAND ln -sfn "../local/lib/libc++.so" "${DESTDIR}/usr/lib/libc++.so" + COMMAND ln -sfn "../local/lib/libc++.so.1" "${DESTDIR}/usr/lib/libc++.so.1" + COMMAND ln -sfn "../local/lib/libc++.so.1.0" "${DESTDIR}/usr/lib/libc++.so.1.0" + COMMAND ln -sfn "../local/lib/libc++abi.so" "${DESTDIR}/usr/lib/libc++abi.so" + COMMAND ln -sfn "../local/lib/libc++abi.so.1" "${DESTDIR}/usr/lib/libc++abi.so.1" + COMMAND ln -sfn "../local/lib/libc++abi.so.1.0" "${DESTDIR}/usr/lib/libc++abi.so.1.0" +) diff --git a/deps/MSan_Deps/Mesa3D/Mesa3D.cmake b/deps/MSan_Deps/Mesa3D/Mesa3D.cmake new file mode 100644 index 0000000000..9fa35acb43 --- /dev/null +++ b/deps/MSan_Deps/Mesa3D/Mesa3D.cmake @@ -0,0 +1,19 @@ +set(_mesa3d_cflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -fsanitize-blacklist=${CMAKE_CURRENT_LIST_DIR}/ignorelist.txt -I${DESTDIR}/usr/local/include -I${DESTDIR}/usr/local/include/c++/v1") +set(_mesa3d_cxxflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -fsanitize-blacklist=${CMAKE_CURRENT_LIST_DIR}/ignorelist.txt -I${DESTDIR}/usr/local/include -I${DESTDIR}/usr/local/include/c++/v1") +set(_mesa3d_ldflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -fsanitize-blacklist=${CMAKE_CURRENT_LIST_DIR}/ignorelist.txt -L${DESTDIR}/usr/local/lib -Wl,-rpath,${DESTDIR}/usr/local/lib") +set(_mesa3d_path "${DESTDIR}/usr/local/bin:$ENV{PATH}") + +# We need to override PATH variable to make Meson find our build llvm-config and not use system one. + +ExternalProject_Add(dep_Mesa3D + URL https://archive.mesa3d.org/mesa-21.3.3.tar.xz + URL_HASH SHA256=ad7f4613ea7c5d08d9fcb5025270199e6ceb9aa99fd72ee572b70342240a8121 + DEPENDS dep_Libcxx dep_LLVM dep_Chromium_Libs + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Mesa3D + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND env "PATH=${_mesa3d_path}" "CFLAGS=${_mesa3d_cflags}" "CXXFLAGS=${_mesa3d_cxxflags}" "LDFLAGS=${_mesa3d_ldflags}" meson build_mesa -Dglx=gallium-xlib -Dgallium-drivers=swrast -Dplatforms=x11 -Ddri3=disabled "-Ddri-drivers=" "-Dvulkan-drivers=" -Db_sanitize=memory -Db_lundef=false -Dgles1=disabled -Dgles2=disabled -Dshared-glapi=disabled "-Dprefix=${DESTDIR}/usr/local" "-Dlibdir=${DESTDIR}/usr/local/lib" + BUILD_COMMAND ninja -C build_mesa install + INSTALL_COMMAND ln -sfn "../local/lib/libGL.so" "${DESTDIR}/usr/lib/libGL.so" + COMMAND ln -sfn "../local/lib/libGL.so.1" "${DESTDIR}/usr/lib/libGL.so.1" + COMMAND ln -sfn "../local/lib/libGL.so.1.5.0" "${DESTDIR}/usr/lib/libGL.so.1.5.0" +) \ No newline at end of file diff --git a/deps/MSan_Deps/Mesa3D/ignorelist.txt b/deps/MSan_Deps/Mesa3D/ignorelist.txt new file mode 100644 index 0000000000..342b421199 --- /dev/null +++ b/deps/MSan_Deps/Mesa3D/ignorelist.txt @@ -0,0 +1,55 @@ +fun:single_output_color +fun:flush_spans +fun:subtriangle +fun:sp_setup_tri +fun:sp_vbuf_draw_arrays +fun:draw_pt_emit_linear +fun:emit +fun:fetch_pipeline_generic +fun:fetch_pipeline_linear_run +fun:vsplit_run_linear +fun:draw_pt_arrays +fun:draw_instances +fun:draw_vbo +fun:softpipe_draw_vbo +fun:_mesa_draw_arrays +fun:_mesa_DrawArrays +fun:setup_sort_vertices +fun:setup_tri_edges +fun:sp_setup_tri +fun:sp_vbuf_draw_arrays +fun:util_set_thread_affinity +fun:clamp_colors +fun:exec_run +fun:shade_quad +fun:shade_quads +fun:depth_test_quads_fallback +fun:blend_single_add_src_alpha_inv_src_alpha +fun:tgsi_exec_machine_setup_masks +fun:tgsi_exec_machine_run +fun:depth_test_quad +fun:util_format_r8g8b8a8_unorm_unpack_rgba_float +fun:sp_get_cached_tile_tex +fun:get_texel_2d +fun:sp_find_cached_tile_tex +fun:sp_get_cached_tile_tex +fun:compute_lambda_lod +fun:util_fast_log2 +fun:img_filter_2d_linear +fun:sp_get_cache +fun:util_copy_rect +fun:util_format_unpack_rgba_rect +fun:u_clip_tile +fun:img_filter_2d_linear_repeat_POT +fun:micro_div +fun:img_filter_2d_ewa +fun:convert_quad_depth +fun:calc_fixed_position +fun:try_setup_line +fun:setup_fragcoord_coef +fun:clip_tri +fun:do_clip_tri +fun:emit_vertex +fun:cull_tri +fun:clip_line +fun:do_clip_line \ No newline at end of file diff --git a/deps/MSan_Deps/fontconfig/fontconfig.cmake b/deps/MSan_Deps/fontconfig/fontconfig.cmake new file mode 100644 index 0000000000..73f2ccafa2 --- /dev/null +++ b/deps/MSan_Deps/fontconfig/fontconfig.cmake @@ -0,0 +1,16 @@ +set(_fontconfig_cflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -I${DESTDIR}/usr/local/include -I${DESTDIR}/usr/local/include/c++/v1") +set(_fontconfig_cxxflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -I${DESTDIR}/usr/local/include -I${DESTDIR}/usr/local/include/c++/v1") +set(_fontconfig_ldflags "-fsanitize=memory -stdlib=libc++ -fsanitize-recover=memory -L${DESTDIR}/usr/local/lib -Wl,-rpath,${DESTDIR}/usr/local/lib") + +ExternalProject_Add(dep_fontconfig + URL https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.13.1.tar.gz + URL_HASH SHA256=9f0d852b39d75fc655f9f53850eb32555394f36104a044bb2b2fc9e66dbbfa7f + DEPENDS dep_Libcxx + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/fontconfig + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND env "CFLAGS=${_fontconfig_cflags}" "CXXFLAGS=${_fontconfig_cxxflags}" "LDFLAGS=${_fontconfig_ldflags}" ./configure --disable-docs --disable-static "--sysconfdir=/etc" "--localstatedir=/var" "--prefix=${DESTDIR}/usr/local" + INSTALL_COMMAND make install-exec && cd fontconfig && make install-fontconfigincludeHEADERS + COMMAND ln -sfn "../local/lib/libfontconfig.so" "${DESTDIR}/usr/lib/libfontconfig.so" + COMMAND ln -sfn "../local/lib/libfontconfig.so.1" "${DESTDIR}/usr/lib/libfontconfig.so.1" + COMMAND ln -sfn "../local/lib/libfontconfig.so.1.12.0" "${DESTDIR}/usr/lib/libfontconfig.so.1.12.0" + ) diff --git a/deps/MSan_Deps/install_msan_shared_libraries.cmake b/deps/MSan_Deps/install_msan_shared_libraries.cmake new file mode 100644 index 0000000000..7b47a9a9d2 --- /dev/null +++ b/deps/MSan_Deps/install_msan_shared_libraries.cmake @@ -0,0 +1,34 @@ +function(install_msan_shared_libraries path_from path_to) + if (NOT ${ARGC} EQUAL 2) + message(FATAL_ERROR "Invalid argument count.") + endif() + + set(msan_libs_list + libc++ + libc++abi + libfontconfig + libGL + libLLVM) + + foreach(msan_lib ${msan_libs_list}) + file(GLOB msan_lib_files "${path_from}/${msan_lib}*") + if (NOT msan_lib_files) + message(FATAL_ERROR "Library \"${msan_lib}\" was not found.") + endif() + foreach(msan_lib_file ${msan_lib_files}) + file(COPY ${msan_lib_file} DESTINATION ${path_to}) + message("Copying file: ${msan_lib_file}.") + endforeach() + endforeach() + + foreach(msan_lib_dir ${msan_libs_dirs_list}) + file(GLOB lib_directory "${path_from}/${msan_lib_dir}") + if (NOT lib_directory) + message(FATAL_ERROR "Library directory \"${msan_lib_dir}\" was not found.") + endif() + file(COPY ${lib_directory} DESTINATION ${path_to}) + message("Copying directory: ${lib_directory}.") + endforeach() +endfunction() + +install_msan_shared_libraries(${_MSAN_COPY_FROM} ${_MSAN_COPY_TO}) diff --git a/deps/NLopt/NLopt.cmake b/deps/NLopt/NLopt.cmake index db638c8971..e2985a1208 100644 --- a/deps/NLopt/NLopt.cmake +++ b/deps/NLopt/NLopt.cmake @@ -1,6 +1,7 @@ prusaslicer_add_cmake_project(NLopt URL "https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz" URL_HASH SHA256=c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae + DEPENDS ${LIBCXX_PKG} CMAKE_ARGS -DNLOPT_PYTHON:BOOL=OFF -DNLOPT_OCTAVE:BOOL=OFF @@ -8,6 +9,7 @@ prusaslicer_add_cmake_project(NLopt -DNLOPT_GUILE:BOOL=OFF -DNLOPT_SWIG:BOOL=OFF -DNLOPT_TESTS:BOOL=OFF + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/OpenCSG/OpenCSG.cmake b/deps/OpenCSG/OpenCSG.cmake index 4d980fecd1..659889c533 100644 --- a/deps/OpenCSG/OpenCSG.cmake +++ b/deps/OpenCSG/OpenCSG.cmake @@ -5,7 +5,9 @@ prusaslicer_add_cmake_project(OpenCSG URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip URL_HASH SHA256=51afe0db79af8386e2027d56d685177135581e0ee82ade9d7f2caff8deab5ec5 PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in ./CMakeLists.txt - DEPENDS dep_GLEW + DEPENDS ${LIBCXX_PKG} dep_GLEW + CMAKE_ARGS + ${MSAN_CMAKE_ARGS} ) if (TARGET ${ZLIB_PKG}) diff --git a/deps/OpenEXR/OpenEXR.cmake b/deps/OpenEXR/OpenEXR.cmake index 046223fed9..74e93fa4c5 100644 --- a/deps/OpenEXR/OpenEXR.cmake +++ b/deps/OpenEXR/OpenEXR.cmake @@ -2,7 +2,7 @@ prusaslicer_add_cmake_project(OpenEXR # GIT_REPOSITORY https://github.com/openexr/openexr.git URL https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip URL_HASH SHA256=0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de - DEPENDS ${ZLIB_PKG} + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} GIT_TAG v2.5.5 CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON @@ -10,6 +10,7 @@ prusaslicer_add_cmake_project(OpenEXR -DPYILMBASE_ENABLE:BOOL=OFF -DOPENEXR_VIEWERS_ENABLE:BOOL=OFF -DOPENEXR_BUILD_UTILS:BOOL=OFF + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/OpenSSL/OpenSSL.cmake b/deps/OpenSSL/OpenSSL.cmake index 347b30d056..7543b91759 100644 --- a/deps/OpenSSL/OpenSSL.cmake +++ b/deps/OpenSSL/OpenSSL.cmake @@ -21,6 +21,7 @@ ExternalProject_Add(dep_OpenSSL EXCLUDE_FROM_ALL ON URL "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0l.tar.gz" URL_HASH SHA256=e2acf0cf58d9bff2b42f2dc0aee79340c8ffe2c5e45d3ca4533dd5d4f5775b1d + DEPENDS ${LIBCXX_PKG} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/OpenSSL BUILD_IN_SOURCE ON CONFIGURE_COMMAND ${_conf_cmd} ${_cross_arch} @@ -30,6 +31,8 @@ ExternalProject_Add(dep_OpenSSL no-ssl3-method no-dynamic-engine -Wa,--noexecstack + "${MSAN_CMAKE_C_FLAGS}" + "${MSAN_CMAKE_LD_FLAGS}" BUILD_COMMAND make depend && make "-j${NPROC}" INSTALL_COMMAND make install_sw ) \ No newline at end of file diff --git a/deps/OpenVDB/OpenVDB.cmake b/deps/OpenVDB/OpenVDB.cmake index 10dc2d916f..86149d07a6 100644 --- a/deps/OpenVDB/OpenVDB.cmake +++ b/deps/OpenVDB/OpenVDB.cmake @@ -8,8 +8,8 @@ endif() prusaslicer_add_cmake_project(OpenVDB URL https://github.com/tamasmeszaros/openvdb/archive/refs/tags/v6.2.1-prusa3d.zip #v6.2.1 patched - URL_HASH SHA256=caf9f0c91976722883ff9cb32420ef142af22f7e625fc643b91c23d6e4172f62 - DEPENDS dep_TBB dep_Blosc dep_OpenEXR dep_Boost + URL_HASH SHA256=caf9f0c91976722883ff9cb32420ef142af22f7e625fc643b91c23d6e4172f62 + DEPENDS ${LIBCXX_PKG} dep_TBB dep_Blosc dep_OpenEXR dep_Boost CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DOPENVDB_BUILD_PYTHON_MODULE=OFF @@ -20,6 +20,7 @@ prusaslicer_add_cmake_project(OpenVDB -DTBB_STATIC=${_build_static} -DOPENVDB_BUILD_VDB_PRINT=ON -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON # Centos6 has old zlib + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake index f97ebb4e08..3d5711bd89 100644 --- a/deps/PNG/PNG.cmake +++ b/deps/PNG/PNG.cmake @@ -10,19 +10,24 @@ if (APPLE) set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch) endif () +if (NOT DEP_MSAN) + set(_png_prefix -DPNG_PREFIX=prusaslicer_) +endif () + prusaslicer_add_cmake_project(PNG # GIT_REPOSITORY https://github.com/glennrp/libpng.git # GIT_TAG v1.6.35 URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip URL_HASH SHA256=3d22d46c566b1761a0e15ea397589b3a5f36ac09b7c785382e6470156c04247f - DEPENDS ${ZLIB_PKG} + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} "${_patch_step}" CMAKE_ARGS -DPNG_SHARED=OFF -DPNG_STATIC=ON - -DPNG_PREFIX=prusaslicer_ + ${_png_prefix} -DPNG_TESTS=OFF -DDISABLE_DEPENDENCY_TRACKING=OFF + ${MSAN_CMAKE_ARGS} ${_disable_neon_extension} ) diff --git a/deps/Qhull/Qhull.cmake b/deps/Qhull/Qhull.cmake index fedec550c1..77f437ed24 100644 --- a/deps/Qhull/Qhull.cmake +++ b/deps/Qhull/Qhull.cmake @@ -2,8 +2,10 @@ include(GNUInstallDirs) prusaslicer_add_cmake_project(Qhull URL "https://github.com/qhull/qhull/archive/v8.0.1.zip" URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b + DEPENDS ${LIBCXX_PKG} CMAKE_ARGS -DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR} + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/TBB/TBB.cmake b/deps/TBB/TBB.cmake index 7315716e0b..b730f5ff5a 100644 --- a/deps/TBB/TBB.cmake +++ b/deps/TBB/TBB.cmake @@ -2,12 +2,14 @@ prusaslicer_add_cmake_project( TBB URL "https://github.com/wjakob/tbb/archive/a0dc9bf76d0120f917b641ed095360448cabc85b.tar.gz" URL_HASH SHA256=0545cb6033bd1873fcae3ea304def720a380a88292726943ae3b9b207f322efe + DEPENDS ${LIBCXX_PKG} CMAKE_ARGS -DTBB_BUILD_SHARED=OFF -DTBB_BUILD_TESTS=OFF -DTBB_BUILD_TESTS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_DEBUG_POSTFIX=_debug + ${MSAN_CMAKE_ARGS} ) if (MSVC) diff --git a/deps/TIFF/TIFF.cmake b/deps/TIFF/TIFF.cmake index f92dd08110..c66f5a5464 100644 --- a/deps/TIFF/TIFF.cmake +++ b/deps/TIFF/TIFF.cmake @@ -3,11 +3,12 @@ find_package(OpenGL QUIET REQUIRED) prusaslicer_add_cmake_project(TIFF URL https://gitlab.com/libtiff/libtiff/-/archive/v4.1.0/libtiff-v4.1.0.zip URL_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32 - DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG + DEPENDS ${LIBCXX_PKG} ${ZLIB_PKG} ${PNG_PKG} dep_JPEG CMAKE_ARGS -Dlzma:BOOL=OFF -Dwebp:BOOL=OFF -Djbig:BOOL=OFF -Dzstd:BOOL=OFF -Dpixarlog:BOOL=OFF + ${MSAN_CMAKE_ARGS} ) diff --git a/deps/ZLIB/ZLIB.cmake b/deps/ZLIB/ZLIB.cmake index 916f3318ba..2bf8c5b9c1 100644 --- a/deps/ZLIB/ZLIB.cmake +++ b/deps/ZLIB/ZLIB.cmake @@ -3,9 +3,11 @@ prusaslicer_add_cmake_project(ZLIB # GIT_TAG v1.2.11 URL https://github.com/madler/zlib/archive/refs/tags/v1.2.11.zip URL_HASH SHA256=f5cc4ab910db99b2bdbba39ebbdc225ffc2aa04b4057bc2817f1b94b6978cfc3 + DEPENDS ${LIBCXX_PKG} PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-Respect-BUILD_SHARED_LIBS.patch CMAKE_ARGS -DSKIP_INSTALL_FILES=ON # Prevent installation of man pages et al. -DCMAKE_POSITION_INDEPENDENT_CODE=ON + ${MSAN_CMAKE_ARGS} ) diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index c8051e21f9..eb40a5bd3d 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -9,12 +9,48 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(_wx_toolkit "-DwxBUILD_TOOLKIT=gtk${_gtk_ver}") endif() +set(_wx_config_command "") +if (DEP_MSAN) + set(_wx_cmake_args + -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}/usr/local + -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules + -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}/usr/local + -DCMAKE_DEBUG_POSTFIX:STRING=d + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE} + -DBUILD_SHARED_LIBS:BOOL=OFF + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + ${DEP_CMAKE_OPTS} + -DwxBUILD_PRECOMP=ON + ${_wx_toolkit} + "-DCMAKE_DEBUG_POSTFIX:STRING=" + -DwxBUILD_DEBUG_LEVEL=0 + -DwxUSE_MEDIACTRL=OFF + -DwxUSE_DETECT_SM=OFF + -DwxUSE_UNICODE=ON + -DwxUSE_OPENGL=ON + -DwxUSE_LIBPNG=sys + -DwxUSE_ZLIB=sys + -DwxUSE_REGEX=builtin + -DwxUSE_LIBXPM=builtin + -DwxUSE_LIBJPEG=sys + -DwxUSE_LIBTIFF=sys + -DwxUSE_EXPAT=sys + -DwxUSE_LIBSDL=OFF + -DwxUSE_XTEST=OFF) + set(_wx_config_command CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "CFLAGS=${MSAN_CMAKE_C_FLAGS}" "CXXFLAGS=${MSAN_CMAKE_CXX_FLAGS}" "LDFLAGS=${MSAN_CMAKE_LD_FLAGS}" ${CMAKE_COMMAND} + ${_wx_cmake_args} + "${CMAKE_GENERATOR}" + ${DEP_DOWNLOAD_DIR}/dep_wxWidgets-prefix/src/dep_wxWidgets) +endif () + prusaslicer_add_cmake_project(wxWidgets # GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" # GIT_TAG tm_cross_compile #${_wx_git_tag} URL https://github.com/prusa3d/wxWidgets/archive/refs/heads/v3.1.4-patched.zip URL_HASH SHA256=69dec874981d2fc3d90345660c27f3450d8430c483e8446edcc87b6ed18bff8f - DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG + DEPENDS ${LIBCXX_PKG} ${FONTCONFIG_PKG} ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG CMAKE_ARGS -DwxBUILD_PRECOMP=ON ${_wx_toolkit} @@ -33,6 +69,7 @@ prusaslicer_add_cmake_project(wxWidgets -DwxUSE_EXPAT=sys -DwxUSE_LIBSDL=OFF -DwxUSE_XTEST=OFF + ${_wx_config_command} ) if (MSVC) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9e89e82f67..920aeee2f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -251,9 +251,15 @@ else () set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/../resources") endif () add_custom_command(TARGET PrusaSlicer POST_BUILD - COMMAND ln -sfn "${SLIC3R_RESOURCES_DIR}" "${BIN_RESOURCES_DIR}" - COMMENT "Symlinking the resources directory into the build tree" - VERBATIM) + COMMAND ln -sfn "${SLIC3R_RESOURCES_DIR}" "${BIN_RESOURCES_DIR}" + COMMENT "Symlinking the resources directory into the build tree" + VERBATIM) + if (SLIC3R_MSAN) + add_custom_command(TARGET PrusaSlicer POST_BUILD + COMMAND ln -sfn "${CMAKE_PREFIX_PATH}/../lib" "${CMAKE_CURRENT_BINARY_DIR}/../lib" + COMMENT "Symlinking the instrument library directory into the build tree" + VERBATIM) + endif () endif () # Slic3r binary install target