mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 19:02:53 +00:00
90 lines
3.4 KiB
CMake
90 lines
3.4 KiB
CMake
find_package(Eigen2 2.0.3)
|
|
macro_log_feature(EIGEN2_FOUND "Eigen2" "Eigen2 enables the Mandelbrot wallpaper plugin." "http://eigen.tuxfamily.org" FALSE "2.0.3")
|
|
|
|
if(EIGEN2_FOUND)
|
|
|
|
|
|
project(plasma-wallpaper-mandelbrot)
|
|
|
|
include_directories(${EIGEN2_INCLUDE_DIR})
|
|
|
|
set(mandelbrot_SRCS
|
|
mandelbrot.cpp
|
|
tile.cpp
|
|
renderthread.cpp
|
|
render_with_arch_defaults.cpp
|
|
detectSSE2.cpp
|
|
mix.cpp
|
|
)
|
|
kde4_add_ui_files(mandelbrot_SRCS config.ui)
|
|
|
|
# The x86-specific stuff below does not mean that this code is non-portable!
|
|
# The idea is that x86 (32bit) is the ONLY major architecture on which vectorization (SSE2) may or may not be available.
|
|
# Other platforms have either ALWAYS vectorization (x86-64, PPC...) or NEVER in which case Eigen takes care of the details.
|
|
# Only on x86 do we have to take special care to compile 2 paths, one with SSE and one without, and choose the right one
|
|
# at runtime.
|
|
|
|
# MANDELBROT_ON_X86 will be non-empty if the CPU name contains "86" which we only use to make sure we may ask the
|
|
# compiler to enable SSE. At this stage we don't tell the difference between x86 and X86-64, and for 64bit CPUs,
|
|
# we don't know if we're in 32bit or 64bit mode. That will be done in the source code using preprocessor symbols.
|
|
string(REGEX MATCH "86" MANDELBROT_ON_X86 "${CMAKE_SYSTEM_PROCESSOR}")
|
|
if(MANDELBROT_ON_X86)
|
|
set(mandelbrot_SRCS
|
|
${mandelbrot_SRCS}
|
|
render_with_SSE2_explicitly_enabled.cpp
|
|
)
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(SSE2_CXX_FLAG "-msse2")
|
|
elseif(MSVC)
|
|
set(SSE2_CXX_FLAG "/arch:SSE2")
|
|
else(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(SSE2_CXX_FLAG "")
|
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
|
endif(MANDELBROT_ON_X86)
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(NODEBUGINFO_CXX_FLAG "-g0")
|
|
else(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(NODEBUGINFO_CXX_FLAG "")
|
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
# for code using Eigen, function inlining is important. Normally one doesn't need to pass -finline explicitly
|
|
# as -O2 is enough, but here there may already be a -fno-inline option passed beforehand, so we use -finline
|
|
# to cancel it. Another, separate issue, is that -fno-inline seems breaks the rendering, giving a blank result.
|
|
# I'm not sure why, my best guess is an incompatibility between -fno-inline and SSE intrinsics.
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(INLINING_CXX_FLAG "-finline")
|
|
else(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(INLINING_CXX_FLAG "")
|
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
if(MANDELBROT_ON_X86)
|
|
set_source_files_properties(
|
|
render_with_SSE2_explicitly_enabled.cpp
|
|
PROPERTIES COMPILE_FLAGS "-O2 -DEIGEN_NO_DEBUG ${INLINING_CXX_FLAG} ${NODEBUGINFO_CXX_FLAG} ${SSE2_CXX_FLAG}"
|
|
)
|
|
endif(MANDELBROT_ON_X86)
|
|
|
|
set_source_files_properties(
|
|
render_with_arch_defaults.cpp
|
|
PROPERTIES COMPILE_FLAGS "-O2 -DEIGEN_NO_DEBUG ${INLINING_CXX_FLAG} ${NODEBUGINFO_CXX_FLAG}"
|
|
)
|
|
|
|
set_source_files_properties(
|
|
mix.cpp
|
|
PROPERTIES COMPILE_FLAGS "-O2 -DEIGEN_NO_DEBUG ${INLINING_CXX_FLAG} ${NODEBUGINFO_CXX_FLAG}"
|
|
)
|
|
|
|
set_source_files_properties(
|
|
renderthread.cpp
|
|
PROPERTIES COMPILE_FLAGS "-O2 -DEIGEN_NO_DEBUG ${INLINING_CXX_FLAG} "
|
|
)
|
|
|
|
kde4_add_plugin(plasma_wallpaper_mandelbrot ${mandelbrot_SRCS})
|
|
target_link_libraries(plasma_wallpaper_mandelbrot ${KDE4_PLASMA_LIBS} ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS})
|
|
|
|
install(TARGETS plasma_wallpaper_mandelbrot DESTINATION ${PLUGIN_INSTALL_DIR})
|
|
install(FILES plasma-wallpaper-mandelbrot.desktop DESTINATION ${SERVICES_INSTALL_DIR})
|
|
|
|
endif(EIGEN2_FOUND)
|