From bb36e78428bd05855fd6bd74807749547597d995 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 17 Aug 2017 13:30:46 +0200 Subject: [PATCH] Further CMake integration, split the xs CMakeFiles.txt to FindAlienWx.cmake and FindPerlEmbed.cmake for easier Perl integration. --- CMakeLists.txt | 2 + cmake/modules/FindAlienWx.cmake | 97 +++++++++++ cmake/modules/FindPerlEmbed.cmake | 78 +++++++++ cmake/modules/LibFindMacros.cmake | 265 ++++++++++++++++++++++++++++++ xs/CMakeLists.txt | 90 +++------- 5 files changed, 469 insertions(+), 63 deletions(-) create mode 100644 cmake/modules/FindAlienWx.cmake create mode 100644 cmake/modules/FindPerlEmbed.cmake create mode 100644 cmake/modules/LibFindMacros.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e6cf48157..d962586d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ else () endif () option(SLIC3R_STATIC "Compile Slic3r with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL}) +option(SLIC3R_GUI "Compile Slic3r with GUI components (OpenGL, wxWidgets)" 1) +option(SLIC3R_PRUSACONTROL "Compile Slic3r with the PrusaControl prject file format (requires wxWidgets base library)" 1) option(SLIC3R_PROFILE "Compile Slic3r with an invasive Shiny profiler" 0) option(SLIC3R_HAS_BROKEN_CROAK "Compile Slic3r for a broken Strawberry Perl 64bit" 0) option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1) diff --git a/cmake/modules/FindAlienWx.cmake b/cmake/modules/FindAlienWx.cmake new file mode 100644 index 000000000..557faba9b --- /dev/null +++ b/cmake/modules/FindAlienWx.cmake @@ -0,0 +1,97 @@ +# Find the wxWidgets module based on the information provided by the Perl Alien::wxWidgets module. + +# Check for the Perl & PerlLib modules +include(LibFindMacros) +libfind_package(AlienWx Perl) +libfind_package(AlienWx PerlLibs) + +if (AlienWx_DEBUG) + message(STATUS " AlienWx_FIND_COMPONENTS=${AlienWx_FIND_COMPONENTS}") +endif() + +# Execute an Alien::Wx module to find the relevant information regarding +# the wxWidgets used by the Perl interpreter. +# Perl specific stuff +set(AlienWx_TEMP_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/AlienWx_TEMP_INCLUDE.txt) +execute_process( + COMMAND ${PERL_EXECUTABLE} -e " +# Import Perl modules. +use strict; +use warnings; +use Text::ParseWords; +use Alien::wxWidgets; +use ExtUtils::CppGuess; + +# Test for a Visual Studio compiler +my \$cpp_guess = ExtUtils::CppGuess->new; +my \$mswin = \$^O eq 'MSWin32'; +my \$msvc = \$cpp_guess->is_msvc; + +# List of wxWidgets components to be used. +my @components = split /;/, '${AlienWx_FIND_COMPONENTS}'; + +# Query the available data from Alien::wxWidgets. +my \$version = Alien::wxWidgets->version; +my \$config = Alien::wxWidgets->config; +my \$compiler = Alien::wxWidgets->compiler; +my \$linker = Alien::wxWidgets->linker; +my \$include_path = ' ' . Alien::wxWidgets->include_path; +my \$defines = ' ' . Alien::wxWidgets->defines; +my \$cflags = Alien::wxWidgets->c_flags; +my \$linkflags = Alien::wxWidgets->link_flags; +my \$libraries = ' ' . Alien::wxWidgets->libraries(@components); +my @libraries = Alien::wxWidgets->link_libraries(@components); +my @implib = Alien::wxWidgets->import_libraries(@components); +my @shrlib = Alien::wxWidgets->shared_libraries(@components); +my @keys = Alien::wxWidgets->library_keys; # 'gl', 'adv', ... +my \$library_path = Alien::wxWidgets->shared_library_path; +my \$key = Alien::wxWidgets->key; +my \$prefix = Alien::wxWidgets->prefix; + +my \$filename = '${AlienWx_TEMP_INCLUDE}'; +open(my $fh, '>', \$filename) or die \"Could not open file '\$filename' \$!\"; + +# Convert a space separated lists to CMake semicolon separated lists, +# escape the backslashes, +# export the resulting list to a temp file. +sub cmake_set_var { + my (\$varname, \$content) = @_; + # Remove line separators. + \$content =~ s/\\r|\\n//g; + # Escape the path separators. + \$content =~ s/\\\\/\\\\\\\\\\\\\\\\/g; + my @words = shellwords(\$content); + print \$fh \"set(AlienWx_\$varname \\\"\" . join(';', @words) . \"\\\")\\n\"; +} +cmake_set_var('VERSION', \$version); +\$include_path =~ s/ -I/ /g; +cmake_set_var('INCLUDE_DIRS', \$include_path); +\$libraries =~ s/ -L/ -LIBPATH:/g if \$msvc; +cmake_set_var('LIBRARIES', \$libraries); +#cmake_set_var('LIBRARY_DIRS', ); +\$defines =~ s/ -D/ /g; +cmake_set_var('DEFINITIONS', \$defines); +#cmake_set_var('DEFINITIONS_DEBUG', ); +cmake_set_var('CXX_FLAGS', \$cflags); +close \$fh; +") +include(${AlienWx_TEMP_INCLUDE}) +file(REMOVE ${AlienWx_TEMP_INCLUDE}) +unset(AlienWx_TEMP_INCLUDE) + +if (AlienWx_DEBUG) + message(STATUS " AlienWx_VERSION = ${AlienWx_VERSION}") + message(STATUS " AlienWx_INCLUDE_DIRS = ${AlienWx_INCLUDE_DIRS}") + message(STATUS " AlienWx_LIBRARIES = ${AlienWx_LIBRARIES}") + message(STATUS " AlienWx_LIBRARY_DIRS = ${AlienWx_LIBRARY_DIRS}") + message(STATUS " AlienWx_DEFINITIONS = ${AlienWx_DEFINITIONS}") + message(STATUS " AlienWx_DEFINITIONS_DEBUG = ${AlienWx_DEFINITIONS_DEBUG}") + message(STATUS " AlienWx_CXX_FLAGS = ${AlienWx_CXX_FLAGS}") +endif() + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(AlienWx + REQUIRED_VARS AlienWx_INCLUDE_DIRS AlienWx_LIBRARIES +# HANDLE_COMPONENTS + VERSION_VAR AlienWx_VERSION) diff --git a/cmake/modules/FindPerlEmbed.cmake b/cmake/modules/FindPerlEmbed.cmake new file mode 100644 index 000000000..fc209bc91 --- /dev/null +++ b/cmake/modules/FindPerlEmbed.cmake @@ -0,0 +1,78 @@ +# Find the dependencies for linking with the Perl runtime library. + +# Check for the Perl & PerlLib modules +include(LibFindMacros) +libfind_package(PerlEmbed Perl) +libfind_package(PerlEmbed PerlLibs) + +# Execute an Alien::Wx module to find the relevant information regarding +# the wxWidgets used by the Perl interpreter. +# Perl specific stuff +set(PerlEmbed_TEMP_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/PerlEmbed_TEMP_INCLUDE.txt) +execute_process( + COMMAND ${PERL_EXECUTABLE} -MExtUtils::Embed -e " +# Import Perl modules. +use strict; +use warnings; +use Text::ParseWords; +use ExtUtils::CppGuess; + +# Test for a Visual Studio compiler +my \$cpp_guess = ExtUtils::CppGuess->new; +my \$mswin = \$^O eq 'MSWin32'; +my \$msvc = \$cpp_guess->is_msvc; + +# Query the available data from Alien::wxWidgets. +my \$ccflags; +my \$ldflags; +{ local *STDOUT; open STDOUT, '>', \\\$ccflags; ccflags; } +{ local *STDOUT; open STDOUT, '>', \\\$ldflags; ldopts; } +\$ccflags = ' ' . \$ccflags; +\$ldflags = ' ' . \$ldflags; + +my \$filename = '${PerlEmbed_TEMP_INCLUDE}'; +open(my $fh, '>', \$filename) or die \"Could not open file '\$filename' \$!\"; + +# Convert a space separated lists to CMake semicolon separated lists, +# escape the backslashes, +# export the resulting list to a temp file. +sub cmake_set_var { + my (\$varname, \$content) = @_; + # Remove line separators. + \$content =~ s/\\r|\\n//g; + # Escape the path separators. + \$content =~ s/\\\\/\\\\\\\\\\\\\\\\/g; + my @words = shellwords(\$content); + print \$fh \"set(PerlEmbed_\$varname \\\"\" . join(';', @words) . \"\\\")\\n\"; +} +cmake_set_var('CCFLAGS', \$ccflags); +\$ldflags =~ s/ -L/ -LIBPATH:/g if \$msvc; +cmake_set_var('LDFLAGS', \$ldflags); +close \$fh; +") +include(${PerlEmbed_TEMP_INCLUDE}) +file(REMOVE ${PerlEmbed_TEMP_INCLUDE}) +unset(PerlEmbed_TEMP_INCLUDE) + +if (PerlEmbed_DEBUG) + # First show the configuration extracted by FindPerl & FindPerlLibs: + message(STATUS " PERL_INCLUDE_PATH = ${PERL_INCLUDE_PATH}") + message(STATUS " PERL_LIBRARY = ${PERL_LIBRARY}") + message(STATUS " PERL_EXECUTABLE = ${PERL_EXECUTABLE}") + message(STATUS " PERL_SITESEARCH = ${PERL_SITESEARCH}") + message(STATUS " PERL_SITELIB = ${PERL_SITELIB}") + message(STATUS " PERL_VENDORARCH = ${PERL_VENDORARCH}") + message(STATUS " PERL_VENDORLIB = ${PERL_VENDORLIB}") + message(STATUS " PERL_ARCHLIB = ${PERL_ARCHLIB}") + message(STATUS " PERL_PRIVLIB = ${PERL_PRIVLIB}") + message(STATUS " PERL_EXTRA_C_FLAGS = ${PERL_EXTRA_C_FLAGS}") + # Second show the configuration extracted by this module (FindPerlEmbed): + message(STATUS " PerlEmbed_CCFLAGS = ${PerlEmbed_CCFLAGS}") + message(STATUS " PerlEmbed_LDFLAGS = ${PerlEmbed_LDFLAGS}") +endif() + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(PerlEmbed + REQUIRED_VARS PerlEmbed_CCFLAGS PerlEmbed_LDFLAGS + VERSION_VAR PERL_VERSION) diff --git a/cmake/modules/LibFindMacros.cmake b/cmake/modules/LibFindMacros.cmake new file mode 100644 index 000000000..f6800aa7b --- /dev/null +++ b/cmake/modules/LibFindMacros.cmake @@ -0,0 +1,265 @@ +# Version 2.2 +# Public Domain, originally written by Lasse Kärkkäinen +# Maintained at https://github.com/Tronic/cmake-modules +# Please send your improvements as pull requests on Github. + +# Find another package and make it a dependency of the current package. +# This also automatically forwards the "REQUIRED" argument. +# Usage: libfind_package( [extra args to find_package]) +macro (libfind_package PREFIX PKG) + set(${PREFIX}_args ${PKG} ${ARGN}) + if (${PREFIX}_FIND_REQUIRED) + set(${PREFIX}_args ${${PREFIX}_args} REQUIRED) + endif() + find_package(${${PREFIX}_args}) + set(${PREFIX}_DEPENDENCIES ${${PREFIX}_DEPENDENCIES};${PKG}) + unset(${PREFIX}_args) +endmacro() + +# A simple wrapper to make pkg-config searches a bit easier. +# Works the same as CMake's internal pkg_check_modules but is always quiet. +macro (libfind_pkg_check_modules) + find_package(PkgConfig QUIET) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${ARGN} QUIET) + endif() +endmacro() + +# Avoid useless copy&pasta by doing what most simple libraries do anyway: +# pkg-config, find headers, find library. +# Usage: libfind_pkg_detect( FIND_PATH [other args] FIND_LIBRARY [other args]) +# E.g. libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2) +function (libfind_pkg_detect PREFIX) + # Parse arguments + set(argname pkgargs) + foreach (i ${ARGN}) + if ("${i}" STREQUAL "FIND_PATH") + set(argname pathargs) + elseif ("${i}" STREQUAL "FIND_LIBRARY") + set(argname libraryargs) + else() + set(${argname} ${${argname}} ${i}) + endif() + endforeach() + if (NOT pkgargs) + message(FATAL_ERROR "libfind_pkg_detect requires at least a pkg_config package name to be passed.") + endif() + # Find library + libfind_pkg_check_modules(${PREFIX}_PKGCONF ${pkgargs}) + if (pathargs) + find_path(${PREFIX}_INCLUDE_DIR NAMES ${pathargs} HINTS ${${PREFIX}_PKGCONF_INCLUDE_DIRS}) + endif() + if (libraryargs) + find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS}) + endif() +endfunction() + +# Extracts a version #define from a version.h file, output stored to _VERSION. +# Usage: libfind_version_header(Foobar foobar/version.h FOOBAR_VERSION_STR) +# Fourth argument "QUIET" may be used for silently testing different define names. +# This function does nothing if the version variable is already defined. +function (libfind_version_header PREFIX VERSION_H DEFINE_NAME) + # Skip processing if we already have a version or if the include dir was not found + if (${PREFIX}_VERSION OR NOT ${PREFIX}_INCLUDE_DIR) + return() + endif() + set(quiet ${${PREFIX}_FIND_QUIETLY}) + # Process optional arguments + foreach(arg ${ARGN}) + if (arg STREQUAL "QUIET") + set(quiet TRUE) + else() + message(AUTHOR_WARNING "Unknown argument ${arg} to libfind_version_header ignored.") + endif() + endforeach() + # Read the header and parse for version number + set(filename "${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + if (NOT EXISTS ${filename}) + if (NOT quiet) + message(AUTHOR_WARNING "Unable to find ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + endif() + return() + endif() + file(READ "${filename}" header) + string(REGEX REPLACE ".*#[ \t]*define[ \t]*${DEFINE_NAME}[ \t]*\"([^\n]*)\".*" "\\1" match "${header}") + # No regex match? + if (match STREQUAL header) + if (NOT quiet) + message(AUTHOR_WARNING "Unable to find \#define ${DEFINE_NAME} \"\" from ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") + endif() + return() + endif() + # Export the version string + set(${PREFIX}_VERSION "${match}" PARENT_SCOPE) +endfunction() + +# Do the final processing once the paths have been detected. +# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain +# all the variables, each of which contain one include directory. +# Ditto for ${PREFIX}_PROCESS_LIBS and library files. +# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. +# Also handles errors in case library detection was required, etc. +function (libfind_process PREFIX) + # Skip processing if already processed during this configuration run + if (${PREFIX}_FOUND) + return() + endif() + + set(found TRUE) # Start with the assumption that the package was found + + # Did we find any files? Did we miss includes? These are for formatting better error messages. + set(some_files FALSE) + set(missing_headers FALSE) + + # Shorthands for some variables that we need often + set(quiet ${${PREFIX}_FIND_QUIETLY}) + set(required ${${PREFIX}_FIND_REQUIRED}) + set(exactver ${${PREFIX}_FIND_VERSION_EXACT}) + set(findver "${${PREFIX}_FIND_VERSION}") + set(version "${${PREFIX}_VERSION}") + + # Lists of config option names (all, includes, libs) + unset(configopts) + set(includeopts ${${PREFIX}_PROCESS_INCLUDES}) + set(libraryopts ${${PREFIX}_PROCESS_LIBS}) + + # Process deps to add to + foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES}) + if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS) + # The package seems to export option lists that we can use, woohoo! + list(APPEND includeopts ${${i}_INCLUDE_OPTS}) + list(APPEND libraryopts ${${i}_LIBRARY_OPTS}) + else() + # If plural forms don't exist or they equal singular forms + if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR + ({i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES)) + # Singular forms can be used + if (DEFINED ${i}_INCLUDE_DIR) + list(APPEND includeopts ${i}_INCLUDE_DIR) + endif() + if (DEFINED ${i}_LIBRARY) + list(APPEND libraryopts ${i}_LIBRARY) + endif() + else() + # Oh no, we don't know the option names + message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!") + endif() + endif() + endforeach() + + if (includeopts) + list(REMOVE_DUPLICATES includeopts) + endif() + + if (libraryopts) + list(REMOVE_DUPLICATES libraryopts) + endif() + + string(REGEX REPLACE ".*[ ;]([^ ;]*(_INCLUDE_DIRS|_LIBRARIES))" "\\1" tmp "${includeopts} ${libraryopts}") + if (NOT tmp STREQUAL "${includeopts} ${libraryopts}") + message(AUTHOR_WARNING "Plural form ${tmp} found in config options of ${PREFIX}. This works as before but is now deprecated. Please only use singular forms INCLUDE_DIR and LIBRARY, and update your find scripts for LibFindMacros > 2.0 automatic dependency system (most often you can simply remove the PROCESS variables entirely).") + endif() + + # Include/library names separated by spaces (notice: not CMake lists) + unset(includes) + unset(libs) + + # Process all includes and set found false if any are missing + foreach (i ${includeopts}) + list(APPEND configopts ${i}) + if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") + list(APPEND includes "${${i}}") + else() + set(found FALSE) + set(missing_headers TRUE) + endif() + endforeach() + + # Process all libraries and set found false if any are missing + foreach (i ${libraryopts}) + list(APPEND configopts ${i}) + if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") + list(APPEND libs "${${i}}") + else() + set (found FALSE) + endif() + endforeach() + + # Version checks + if (found AND findver) + if (NOT version) + message(WARNING "The find module for ${PREFIX} does not provide version information, so we'll just assume that it is OK. Please fix the module or remove package version requirements to get rid of this warning.") + elseif (version VERSION_LESS findver OR (exactver AND NOT version VERSION_EQUAL findver)) + set(found FALSE) + set(version_unsuitable TRUE) + endif() + endif() + + # If all-OK, hide all config options, export variables, print status and exit + if (found) + foreach (i ${configopts}) + mark_as_advanced(${i}) + endforeach() + if (NOT quiet) + message(STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") + if (LIBFIND_DEBUG) + message(STATUS " ${PREFIX}_DEPENDENCIES=${${PREFIX}_DEPENDENCIES}") + message(STATUS " ${PREFIX}_INCLUDE_OPTS=${includeopts}") + message(STATUS " ${PREFIX}_INCLUDE_DIRS=${includes}") + message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}") + message(STATUS " ${PREFIX}_LIBRARIES=${libs}") + endif() + set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE) + set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE) + set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE) + set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE) + set (${PREFIX}_FOUND TRUE PARENT_SCOPE) + endif() + return() + endif() + + # Format messages for debug info and the type of error + set(vars "Relevant CMake configuration variables:\n") + foreach (i ${configopts}) + mark_as_advanced(CLEAR ${i}) + set(val ${${i}}) + if ("${val}" STREQUAL "${i}-NOTFOUND") + set (val "") + elseif (val AND NOT EXISTS ${val}) + set (val "${val} (does not exist)") + else() + set(some_files TRUE) + endif() + set(vars "${vars} ${i}=${val}\n") + endforeach() + set(vars "${vars}You may use CMake GUI, cmake -D or ccmake to modify the values. Delete CMakeCache.txt to discard all values and force full re-detection if necessary.\n") + if (version_unsuitable) + set(msg "${PREFIX} ${${PREFIX}_VERSION} was found but") + if (exactver) + set(msg "${msg} only version ${findver} is acceptable.") + else() + set(msg "${msg} version ${findver} is the minimum requirement.") + endif() + else() + if (missing_headers) + set(msg "We could not find development headers for ${PREFIX}. Do you have the necessary dev package installed?") + elseif (some_files) + set(msg "We only found some files of ${PREFIX}, not all of them. Perhaps your installation is incomplete or maybe we just didn't look in the right place?") + if(findver) + set(msg "${msg} This could also be caused by incompatible version (if it helps, at least ${PREFIX} ${findver} should work).") + endif() + else() + set(msg "We were unable to find package ${PREFIX}.") + endif() + endif() + + # Fatal error out if REQUIRED + if (required) + set(msg "REQUIRED PACKAGE NOT FOUND\n${msg} This package is REQUIRED and you need to install it or adjust CMake configuration in order to continue building ${CMAKE_PROJECT_NAME}.") + message(FATAL_ERROR "${msg}\n${vars}") + endif() + # Otherwise just print a nasty warning + if (NOT quiet) + message(WARNING "WARNING: MISSING PACKAGE\n${msg} This package is NOT REQUIRED and you may ignore this warning but by doing so you may miss some functionality of ${CMAKE_PROJECT_NAME}. \n${vars}") + endif() +endfunction() diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index 2165146c0..8b276dd45 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -1,27 +1,17 @@ -# Enable c++11 language standard +# Enable C++11 language standard. set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -# Add our own cmake module path +# Add our own cmake module path. list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/) +# Where all the bundled libraries reside? set(LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/src/) +# For the bundled boost libraries (boost::nowide) include_directories(${LIBDIR}) -# Bring back SLIC3R_DYNAMIC logic from Build.PL -if (DEFINED SLIC3R_DYNAMIC AND NOT SLIC3R_DYNAMIC) - set(SLIC3R_STATIC 1) -endif () - -# Bring back SLIC3R_NOGUI logic from Build.PL -# Map SLIC3R_PRUS to SLIC3R_GUI -#if (DEFINED SLIC3R_NOGUI AND NOT SLIC3R_NOGUI OR SLIC3R_PRUS) -# set(SLIC3R_GUI 0) -#else () - set(SLIC3R_GUI 1) -#endif () - -# Generate XS typemap file +# Generate the Slic3r Perl module (XS) typemap file. +#FIXME add the dependencies. find_package(Perl REQUIRED) set(MyTypemap ${CMAKE_CURRENT_BINARY_DIR}/typemap) add_custom_command( @@ -30,8 +20,9 @@ add_custom_command( VERBATIM ) -# Generate main.xs file +# Generate the Slic3r Perl module (XS) main.xs file. set(MyMainXs ${CMAKE_CURRENT_BINARY_DIR}/main.xs) +#FIXME list the dependecies explicitely, add dependency on the typemap. file(GLOB files xsp/*.xsp) foreach (file ${files}) if (MSVC) @@ -43,7 +34,8 @@ foreach (file ${files}) endforeach () configure_file(main.xs.in ${MyMainXs} @ONLY) # Insert INCLUDE_COMMANDS into main.xs -# Generate XS.cpp file +# Generate the Slic3r Perl module (XS) XS.cpp file. +#FIXME add the dependency on main.xs and typemap. set(MyXsC "${CMAKE_CURRENT_BINARY_DIR}/XS.cpp") add_custom_command( OUTPUT ${MyXsC} @@ -98,7 +90,6 @@ endif () ## Configuration flags if (SLIC3R_GUI) message("Slic3r will be built with GUI support") -# target_compile_definitions(XS PRIVATE -DSLIC3R_GUI -DSLIC3R_PRUS) target_compile_definitions(XS PRIVATE -DSLIC3R_GUI) endif () @@ -119,44 +110,11 @@ endif () # Perl specific stuff find_package(PerlLibs REQUIRED) -execute_process( - COMMAND ${PERL_EXECUTABLE} -MExtUtils::Embed -e " - use Text::ParseWords; - my \$line; - { local *STDOUT; open STDOUT, '>', \\\$line; ccflags; } - \$line =~ s/\\\\/\\\\\\\\/g; - my @words = shellwords(\$line); - print join(';', @words)" - OUTPUT_VARIABLE PERL_CCLAGS -) -execute_process( - COMMAND ${PERL_EXECUTABLE} -MExtUtils::Embed -e " - use Text::ParseWords; - my \$line; - { local *STDOUT; open STDOUT, '>', \\\$line; ldopts; } - \$line =~ s/\\\\/\\\\\\\\/g; - my @words = shellwords(\$line); - print join(';', @words)" - OUTPUT_VARIABLE PERL_LDFLAGS -) +set(PerlEmbed_DEBUG 1) +find_package(PerlEmbed REQUIRED) target_include_directories(XS PRIVATE ${PERL_INCLUDE_PATH}) - -message("PERL_INCLUDE_PATH: ${PERL_INCLUDE_PATH}") -message("PERL_LIBRARY: ${PERL_LIBRARY}") -message("PERL_EXECUTABLE: ${PERL_EXECUTABLE}") -message("PERL_SITESEARCH: ${PERL_SITESEARCH}") -message("PERL_SITELIB: ${PERL_SITELIB}") -message("PERL_VENDORARCH: ${PERL_VENDORARCH}") -message("PERL_VENDORLIB: ${PERL_VENDORLIB}") -message("PERL_ARCHLIB: ${PERL_ARCHLIB}") -message("PERL_PRIVLIB: ${PERL_PRIVLIB}") -message("PERL_EXTRA_C_FLAGS: ${PERL_EXTRA_C_FLAGS}") -message("PERL_CCLAGS: ${PERL_CCLAGS}") -message("PERL_LDFLAGS: ${PERL_LDFLAGS}") - -target_compile_options(XS PRIVATE ${PERL_CCLAGS}) -#target_link_libraries(XS ${PERL_LDFLAGS}) -target_link_libraries(XS C:\\wperl64d\\lib\\CORE\\perl524.lib) +target_compile_options(XS PRIVATE ${PerlEmbed_CCLAGS}) +target_link_libraries(XS ${PERL_LIBRARY}) ## REQUIRED packages @@ -186,16 +144,22 @@ if (TBB_FOUND) endif () # Find and configure wxWidgets -set(wxWidgets_UseAlienWx 1) -if (wxWidgets_UseAlienWx) - # ${PROJECT_SOURCE_DIR}/cmake/helpers/alien_wx_to_cmake.pl -else () - find_package(wxWidgets REQUIRED) - if (wxWidgets_FOUND) +if (SLIC3R_PRUSACONTROL) + set(wxWidgets_UseAlienWx 1) + if (wxWidgets_UseAlienWx) + set(AlienWx_DEBUG 1) + find_package(AlienWx REQUIRED COMPONENTS base) + include_directories(${AlienWx_INCLUDE_DIR}) + string(APPEND CMAKE_CXX_FLAGS " ${AlienWx_CXX_FLAGS}") + add_definitions(${AlienWx_DEFINITIONS}) + target_link_libraries(XS ${AlienWx_LIBRARIES}) + else () + find_package(wxWidgets REQUIRED COMPONENTS base) include(${wxWidgets_USE_FILE}) target_link_libraries(XS ${wxWidgets_LIBRARIES}) endif () -endif () + target_compile_definitions(XS PRIVATE -DSLIC3R_GUI -DSLIC3R_PRUS) +endif() ## OPTIONAL packages