1
0
Fork 0
inkscape/CMakeScripts/DefineDependsandFlags.cmake
Daniel Baumann 02d935e272
Adding upstream version 1.4.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 23:40:13 +02:00

474 lines
16 KiB
CMake

set(INKSCAPE_LIBS "")
set(INKSCAPE_INCS "")
set(INKSCAPE_INCS_SYS "")
set(INKSCAPE_CXX_FLAGS "")
set(INKSCAPE_CXX_FLAGS_DEBUG "")
list(APPEND INKSCAPE_INCS ${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/src
# generated includes
${CMAKE_BINARY_DIR}/include
)
# NDEBUG implies G_DISABLE_ASSERT
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER)
if(CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER} MATCHES "-DNDEBUG")
list(APPEND INKSCAPE_CXX_FLAGS "-DG_DISABLE_ASSERT")
endif()
# AddressSanitizer
# Clang's AddressSanitizer can detect more memory errors and is more powerful
# than compiling with _FORTIFY_SOURCE but has a performance impact (approx. 2x
# slower), so it's not suitable for release builds.
if(WITH_ASAN)
list(APPEND INKSCAPE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer")
list(APPEND INKSCAPE_LIBS "-fsanitize=address")
else()
# Undefine first, to suppress 'warning: "_FORTIFY_SOURCE" redefined'
list(APPEND INKSCAPE_CXX_FLAGS "-U_FORTIFY_SOURCE")
list(APPEND INKSCAPE_CXX_FLAGS "-D_FORTIFY_SOURCE=2")
endif()
# Disable deprecated Gtk and friends
list(APPEND INKSCAPE_CXX_FLAGS "-DGLIBMM_DISABLE_DEPRECATED")
list(APPEND INKSCAPE_CXX_FLAGS "-DGTKMM_DISABLE_DEPRECATED")
list(APPEND INKSCAPE_CXX_FLAGS "-DGDKMM_DISABLE_DEPRECATED")
list(APPEND INKSCAPE_CXX_FLAGS "-DGTK_DISABLE_DEPRECATED")
list(APPEND INKSCAPE_CXX_FLAGS "-DGDK_DISABLE_DEPRECATED")
# Errors for common mistakes
list(APPEND INKSCAPE_CXX_FLAGS "-fstack-protector-strong")
list(APPEND INKSCAPE_CXX_FLAGS "-Werror=format") # e.g.: printf("%s", std::string("foo"))
list(APPEND INKSCAPE_CXX_FLAGS "-Werror=format-security") # e.g.: printf(variable);
list(APPEND INKSCAPE_CXX_FLAGS "-Werror=ignored-qualifiers") # e.g.: const int foo();
list(APPEND INKSCAPE_CXX_FLAGS "-Werror=return-type") # non-void functions that don't return a value
list(APPEND INKSCAPE_CXX_FLAGS "-Wno-switch") # See !849 for discussion
list(APPEND INKSCAPE_CXX_FLAGS "-Wmisleading-indentation")
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-Og") # -Og for _FORTIFY_SOURCE. One could add -Weffc++ here to see approx. 6000 warnings
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-Wcomment")
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-Wunused-function")
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-Wunused-variable")
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-D_GLIBCXX_ASSERTIONS")
if (CMAKE_COMPILER_IS_GNUCC)
list(APPEND INKSCAPE_CXX_FLAGS "-Wstrict-null-sentinel") # For NULL instead of nullptr
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-fexceptions -grecord-gcc-switches -fasynchronous-unwind-tables")
if(CXX_COMPILER_VERSION VERSION_GREATER 8.0)
list(APPEND INKSCAPE_CXX_FLAGS_DEBUG "-fstack-clash-protection -fcf-protection")
endif()
endif()
# Define the flags for profiling if desired:
if(WITH_PROFILING)
set(BUILD_SHARED_LIBS off)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
endif()
include(CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES("
#include <atomic>
#include <cstdint>
std::atomic<uint64_t> x (0);
int main() {
uint64_t i = x.load(std::memory_order_relaxed);
return 0;
}
"
LIBATOMIC_NOT_NEEDED)
IF (NOT LIBATOMIC_NOT_NEEDED)
message(STATUS " Adding -latomic to the libs.")
list(APPEND INKSCAPE_LIBS "-latomic")
ENDIF()
# ----------------------------------------------------------------------------
# Helper macros
# ----------------------------------------------------------------------------
# Turns linker arguments like "-framework Foo" into "-Wl,-framework,Foo" to
# make them safe for appending to INKSCAPE_LIBS
macro(sanitize_ldflags_for_libs ldflags_var)
# matches dash-argument followed by non-dash-argument
string(REGEX REPLACE "(^|;)(-[^;]*);([^-])" "\\1-Wl,\\2,\\3" ${ldflags_var} "${${ldflags_var}}")
endmacro()
# ----------------------------------------------------------------------------
# Files we include
# ----------------------------------------------------------------------------
if(WIN32)
# Set the link and include directories
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
list(APPEND INKSCAPE_LIBS "-lmscms")
list(APPEND INKSCAPE_CXX_FLAGS "-mms-bitfields")
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
list(APPEND INKSCAPE_CXX_FLAGS "-mwindows")
list(APPEND INKSCAPE_CXX_FLAGS "-mthreads")
endif()
list(APPEND INKSCAPE_LIBS "-lwinpthread")
if(HAVE_MINGW64)
list(APPEND INKSCAPE_CXX_FLAGS "-m64")
else()
list(APPEND INKSCAPE_CXX_FLAGS "-m32")
endif()
endif()
find_package(PkgConfig REQUIRED)
pkg_check_modules(INKSCAPE_DEP REQUIRED
harfbuzz
pangocairo>=1.44
pangoft2
fontconfig
gsl
gmodule-2.0
#double-conversion
bdw-gc #boehm-demers-weiser gc
lcms2)
# remove this line and uncomment the doiuble-conversion above when double-conversion.pc file gets shipped on all platforms we support
find_package(DoubleConversion REQUIRED) # lib2geom dependency
sanitize_ldflags_for_libs(INKSCAPE_DEP_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${INKSCAPE_DEP_LDFLAGS})
list(APPEND INKSCAPE_INCS_SYS ${INKSCAPE_DEP_INCLUDE_DIRS})
add_definitions(${INKSCAPE_DEP_CFLAGS_OTHER})
if(WITH_JEMALLOC)
find_package(JeMalloc)
if (JEMALLOC_FOUND)
list(APPEND INKSCAPE_LIBS ${JEMALLOC_LIBRARIES})
else()
set(WITH_JEMALLOC OFF)
endif()
endif()
find_package(Iconv REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${Iconv_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${Iconv_LIBRARIES})
find_package(Intl REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${Intl_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${Intl_LIBRARIES})
add_definitions(${Intl_DEFINITIONS})
# Check for system-wide version of 2geom and fallback to internal copy if not found
if(NOT WITH_INTERNAL_2GEOM)
pkg_check_modules(2Geom QUIET IMPORTED_TARGET GLOBAL 2geom>=1.4.0)
if(2Geom_FOUND)
add_library(2Geom::2geom ALIAS PkgConfig::2Geom)
else()
set(WITH_INTERNAL_2GEOM ON CACHE BOOL "Prefer internal copy of lib2geom" FORCE)
message(STATUS "lib2geom not found, using internal copy in src/3rdparty/2geom")
endif()
endif()
if(WITH_INTERNAL_2GEOM)
set(2Geom_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/2geom/include)
endif()
if(ENABLE_POPPLER)
find_package(PopplerCairo)
if(POPPLER_FOUND)
set(HAVE_POPPLER ON)
if(ENABLE_POPPLER_CAIRO)
if(POPPLER_CAIRO_FOUND AND POPPLER_GLIB_FOUND)
set(HAVE_POPPLER_CAIRO ON)
endif()
endif()
else()
set(ENABLE_POPPLER_CAIRO OFF)
endif()
else()
set(HAVE_POPPLER OFF)
set(ENABLE_POPPLER_CAIRO OFF)
endif()
list(APPEND INKSCAPE_INCS_SYS ${POPPLER_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${POPPLER_LIBRARIES})
add_definitions(${POPPLER_DEFINITIONS})
if(WITH_LIBWPG)
pkg_check_modules(LIBWPG libwpg-0.3 librevenge-0.0 librevenge-stream-0.0)
if(LIBWPG_FOUND)
sanitize_ldflags_for_libs(LIBWPG_LDFLAGS)
list(APPEND INKSCAPE_INCS_SYS ${LIBWPG_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${LIBWPG_LDFLAGS})
add_definitions(${LIBWPG_DEFINITIONS})
else()
set(WITH_LIBWPG OFF)
endif()
endif()
if(WITH_LIBVISIO)
pkg_check_modules(LIBVISIO libvisio-0.1 librevenge-0.0 librevenge-stream-0.0)
if(LIBVISIO_FOUND)
sanitize_ldflags_for_libs(LIBVISIO_LDFLAGS)
list(APPEND INKSCAPE_INCS_SYS ${LIBVISIO_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${LIBVISIO_LDFLAGS})
add_definitions(${LIBVISIO_DEFINITIONS})
else()
set(WITH_LIBVISIO OFF)
endif()
endif()
if(WITH_LIBCDR)
pkg_check_modules(LIBCDR libcdr-0.1 librevenge-0.0 librevenge-stream-0.0)
if(LIBCDR_FOUND)
sanitize_ldflags_for_libs(LIBCDR_LDFLAGS)
list(APPEND INKSCAPE_INCS_SYS ${LIBCDR_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${LIBCDR_LDFLAGS})
add_definitions(${LIBCDR_DEFINITIONS})
else()
set(WITH_LIBCDR OFF)
endif()
endif()
FIND_PACKAGE(JPEG)
IF(JPEG_FOUND)
list(APPEND INKSCAPE_INCS_SYS ${JPEG_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${JPEG_LIBRARIES})
set(HAVE_JPEG ON)
ENDIF()
find_package(PNG REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${PNG_PNG_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${PNG_LIBRARY})
find_package(Potrace REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${POTRACE_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${POTRACE_LIBRARIES})
if(WITH_SVG2)
add_definitions(-DWITH_MESH -DWITH_CSSBLEND -DWITH_SVG2)
else()
add_definitions(-UWITH_MESH -UWITH_CSSBLEND -UWITH_SVG2)
endif()
# ----------------------------------------------------------------------------
# CMake's builtin
# ----------------------------------------------------------------------------
# Include dependencies:
pkg_check_modules(
GTK3
REQUIRED
glibmm-2.4>=2.58
gtkmm-3.0>=3.24
gdkmm-3.0>=3.24
gtk+-3.0>=3.24
gdk-3.0>=3.24
)
list(APPEND INKSCAPE_CXX_FLAGS ${GTK3_CFLAGS_OTHER})
list(APPEND INKSCAPE_INCS_SYS ${GTK3_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${GTK3_LIBRARIES})
link_directories(${GTK3_LIBRARY_DIRS})
if(WITH_GSPELL)
pkg_check_modules(GSPELL gspell-1)
if("${GSPELL_FOUND}")
message(STATUS "Using gspell")
list(APPEND INKSCAPE_INCS_SYS ${GSPELL_INCLUDE_DIRS})
sanitize_ldflags_for_libs(GSPELL_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${GSPELL_LDFLAGS})
else()
set(WITH_GSPELL OFF)
endif()
endif()
if(WITH_GSOURCEVIEW)
pkg_check_modules(GSOURCEVIEW gtksourceview-4)
if("${GSOURCEVIEW_FOUND}")
message(STATUS "Using gtksourceview-4")
list(APPEND INKSCAPE_INCS_SYS ${GSOURCEVIEW_INCLUDE_DIRS})
sanitize_ldflags_for_libs(GSOURCEVIEW_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${GSOURCEVIEW_LDFLAGS})
else()
set(WITH_GSOURCEVIEW OFF)
endif()
endif()
# stacktrace print on crash
if(WIN32)
find_package(Boost 1.19.0 REQUIRED COMPONENTS filesystem stacktrace_windbg)
list(APPEND INKSCAPE_LIBS "-lole32")
list(APPEND INKSCAPE_LIBS "-ldbgeng")
add_definitions("-DBOOST_STACKTRACE_USE_WINDBG")
elseif(APPLE)
find_package(Boost 1.19.0 REQUIRED COMPONENTS filesystem stacktrace_basic)
list(APPEND INKSCAPE_CXX_FLAGS "-D_GNU_SOURCE")
else()
find_package(Boost 1.19.0 REQUIRED COMPONENTS filesystem)
# The package stacktrace_backtrace may not be available on all distros.
find_package(Boost 1.19.0 COMPONENTS stacktrace_backtrace)
if (BOOST_FOUND)
list(APPEND INKSCAPE_LIBS "-lbacktrace")
add_definitions("-DBOOST_STACKTRACE_USE_BACKTRACE")
else() # fall back to stacktrace_basic
find_package(Boost 1.19.0 REQUIRED COMPONENTS stacktrace_basic)
list(APPEND INKSCAPE_CXX_FLAGS "-D_GNU_SOURCE")
endif()
endif()
# enable explicit debug symbols
set(CMAKE_ENABLE_EXPORTS ON)
if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
list(APPEND INKSCAPE_LIBS "-lstdc++fs")
endif()
list(APPEND INKSCAPE_INCS_SYS ${Boost_INCLUDE_DIRS})
# list(APPEND INKSCAPE_LIBS ${Boost_LIBRARIES})
#find_package(OpenSSL)
#list(APPEND INKSCAPE_INCS_SYS ${OPENSSL_INCLUDE_DIR})
#list(APPEND INKSCAPE_LIBS ${OPENSSL_LIBRARIES})
find_package(LibXslt REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${LIBXSLT_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${LIBXSLT_LIBRARIES})
add_definitions(${LIBXSLT_DEFINITIONS})
find_package(LibXml2 REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${LIBXML2_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${LIBXML2_LIBRARIES})
add_definitions(${LIBXML2_DEFINITIONS})
if(WITH_OPENMP)
find_package(OpenMP)
if(OPENMP_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
list(APPEND INKSCAPE_CXX_FLAGS ${OpenMP_CXX_FLAGS})
if(APPLE OR (MINGW AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))
list(APPEND INKSCAPE_LIBS "-lomp")
endif()
mark_as_advanced(OpenMP_C_FLAGS)
mark_as_advanced(OpenMP_CXX_FLAGS)
# '-fopenmp' is in OpenMP_C_FLAGS, OpenMP_CXX_FLAGS and implies '-lgomp'
# uncomment explicit linking below if still needed:
set(HAVE_OPENMP ON)
#list(APPEND INKSCAPE_LIBS "-lgomp") # FIXME
else()
set(HAVE_OPENMP OFF)
set(WITH_OPENMP OFF)
endif()
endif()
find_package(ZLIB REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${ZLIB_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${ZLIB_LIBRARIES})
if(WITH_GNU_READLINE)
pkg_check_modules(Readline readline)
if(Readline_FOUND)
message(STATUS "Found GNU Readline: ${Readline_LIBRARY}")
list(APPEND INKSCAPE_INCS_SYS ${Readline_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${Readline_LDFLAGS})
else()
message(STATUS "Did not find GNU Readline")
set(WITH_GNU_READLINE OFF)
endif()
endif()
if(WITH_IMAGE_MAGICK)
# we want "<" but pkg_check_modules only offers "<=" for some reason; let's hope nobody actually has 7.0.0
pkg_check_modules(MAGICK ImageMagick++<=7)
if(MAGICK_FOUND)
set(WITH_GRAPHICS_MAGICK OFF) # prefer ImageMagick for now and disable GraphicsMagick if found
else()
set(WITH_IMAGE_MAGICK OFF)
endif()
endif()
if(WITH_GRAPHICS_MAGICK)
pkg_check_modules(MAGICK GraphicsMagick++)
if(NOT MAGICK_FOUND)
set(WITH_GRAPHICS_MAGICK OFF)
endif()
endif()
if(MAGICK_FOUND)
sanitize_ldflags_for_libs(MAGICK_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${MAGICK_LDFLAGS})
add_definitions(${MAGICK_CFLAGS_OTHER})
list(APPEND INKSCAPE_INCS_SYS ${MAGICK_INCLUDE_DIRS})
set(WITH_MAGICK ON) # enable 'Extensions > Raster'
endif()
set(ENABLE_NLS OFF)
if(WITH_NLS)
find_package(Gettext)
if(GETTEXT_FOUND)
message(STATUS "Found gettext + msgfmt to convert language files. Translation enabled")
set(ENABLE_NLS ON)
else(GETTEXT_FOUND)
message(STATUS "Cannot find gettext + msgfmt to convert language file. Translation won't be enabled")
set(WITH_NLS OFF)
endif(GETTEXT_FOUND)
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
if(GETTEXT_XGETTEXT_EXECUTABLE)
message(STATUS "Found xgettext. inkscape.pot will be re-created if missing.")
else()
message(STATUS "Did not find xgettext. inkscape.pot can't be re-created.")
endif()
endif(WITH_NLS)
pkg_check_modules(SIGC++ REQUIRED sigc++-2.0 )
sanitize_ldflags_for_libs(SIGC++_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${SIGC++_LDFLAGS})
list(APPEND INKSCAPE_CXX_FLAGS ${SIGC++_CFLAGS_OTHER} "-DSIGCXX_DISABLE_DEPRECATED")
pkg_check_modules(EPOXY REQUIRED epoxy )
sanitize_ldflags_for_libs(EPOXY_LDFLAGS)
list(APPEND INKSCAPE_LIBS ${EPOXY_LDFLAGS})
list(APPEND INKSCAPE_CXX_FLAGS ${EPOXY_CFLAGS_OTHER})
if(WITH_X11)
find_package(X11 REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${X11_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${X11_LIBRARIES})
add_definitions(-DHAVE_X11)
pkg_get_variable(GTK3_TARGETS gtk+-3.0 targets)
if(NOT("${GTK3_TARGETS}" MATCHES "x11"))
message(FATAL_ERROR "GTK+3 doesn't targets X11, this is required for WITH_X11")
endif()
endif(WITH_X11)
# end Dependencies
# Set include directories and CXX flags
# (INKSCAPE_LIBS are set as target_link_libraries for inkscape_base in src/CMakeLists.txt)
foreach(flag ${INKSCAPE_CXX_FLAGS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
endforeach()
foreach(flag ${INKSCAPE_CXX_FLAGS_DEBUG})
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${flag}")
endforeach()
# Add color output to ninja
if ("${CMAKE_GENERATOR}" MATCHES "Ninja")
add_compile_options (-fdiagnostics-color)
endif ()
list(REMOVE_DUPLICATES INKSCAPE_LIBS)
list(REMOVE_DUPLICATES INKSCAPE_INCS_SYS)
include_directories(${INKSCAPE_INCS})
include_directories(SYSTEM ${INKSCAPE_INCS_SYS})
include(${CMAKE_CURRENT_LIST_DIR}/ConfigChecks.cmake) # TODO: Check if this needs to be "hidden" here
unset(INKSCAPE_INCS)
unset(INKSCAPE_INCS_SYS)
unset(INKSCAPE_CXX_FLAGS)
unset(INKSCAPE_CXX_FLAGS_DEBUG)