Further CMake integration, split the xs CMakeFiles.txt to
FindAlienWx.cmake and FindPerlEmbed.cmake for easier Perl integration.
This commit is contained in:
parent
5673205d2e
commit
bb36e78428
@ -10,6 +10,8 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
option(SLIC3R_STATIC "Compile Slic3r with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL})
|
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_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_HAS_BROKEN_CROAK "Compile Slic3r for a broken Strawberry Perl 64bit" 0)
|
||||||
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
||||||
|
97
cmake/modules/FindAlienWx.cmake
Normal file
97
cmake/modules/FindAlienWx.cmake
Normal file
@ -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)
|
78
cmake/modules/FindPerlEmbed.cmake
Normal file
78
cmake/modules/FindPerlEmbed.cmake
Normal file
@ -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)
|
265
cmake/modules/LibFindMacros.cmake
Normal file
265
cmake/modules/LibFindMacros.cmake
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
# Version 2.2
|
||||||
|
# Public Domain, originally written by Lasse Kärkkäinen <tronic>
|
||||||
|
# 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(<prefix> <another 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(<prefix> <pkg-config args> FIND_PATH <name> [other args] FIND_LIBRARY <name> [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 <PREFIX>_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} \"<version>\" 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 "<not found>")
|
||||||
|
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()
|
@ -1,27 +1,17 @@
|
|||||||
# Enable c++11 language standard
|
# Enable C++11 language standard.
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
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/)
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/)
|
||||||
|
|
||||||
|
# Where all the bundled libraries reside?
|
||||||
set(LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
set(LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
||||||
|
# For the bundled boost libraries (boost::nowide)
|
||||||
include_directories(${LIBDIR})
|
include_directories(${LIBDIR})
|
||||||
|
|
||||||
# Bring back SLIC3R_DYNAMIC logic from Build.PL
|
# Generate the Slic3r Perl module (XS) typemap file.
|
||||||
if (DEFINED SLIC3R_DYNAMIC AND NOT SLIC3R_DYNAMIC)
|
#FIXME add the dependencies.
|
||||||
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
|
|
||||||
find_package(Perl REQUIRED)
|
find_package(Perl REQUIRED)
|
||||||
set(MyTypemap ${CMAKE_CURRENT_BINARY_DIR}/typemap)
|
set(MyTypemap ${CMAKE_CURRENT_BINARY_DIR}/typemap)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
@ -30,8 +20,9 @@ add_custom_command(
|
|||||||
VERBATIM
|
VERBATIM
|
||||||
)
|
)
|
||||||
|
|
||||||
# Generate main.xs file
|
# Generate the Slic3r Perl module (XS) main.xs file.
|
||||||
set(MyMainXs ${CMAKE_CURRENT_BINARY_DIR}/main.xs)
|
set(MyMainXs ${CMAKE_CURRENT_BINARY_DIR}/main.xs)
|
||||||
|
#FIXME list the dependecies explicitely, add dependency on the typemap.
|
||||||
file(GLOB files xsp/*.xsp)
|
file(GLOB files xsp/*.xsp)
|
||||||
foreach (file ${files})
|
foreach (file ${files})
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
@ -43,7 +34,8 @@ foreach (file ${files})
|
|||||||
endforeach ()
|
endforeach ()
|
||||||
configure_file(main.xs.in ${MyMainXs} @ONLY) # Insert INCLUDE_COMMANDS into main.xs
|
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")
|
set(MyXsC "${CMAKE_CURRENT_BINARY_DIR}/XS.cpp")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${MyXsC}
|
OUTPUT ${MyXsC}
|
||||||
@ -98,7 +90,6 @@ endif ()
|
|||||||
## Configuration flags
|
## Configuration flags
|
||||||
if (SLIC3R_GUI)
|
if (SLIC3R_GUI)
|
||||||
message("Slic3r will be built with GUI support")
|
message("Slic3r will be built with GUI support")
|
||||||
# target_compile_definitions(XS PRIVATE -DSLIC3R_GUI -DSLIC3R_PRUS)
|
|
||||||
target_compile_definitions(XS PRIVATE -DSLIC3R_GUI)
|
target_compile_definitions(XS PRIVATE -DSLIC3R_GUI)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@ -119,44 +110,11 @@ endif ()
|
|||||||
|
|
||||||
# Perl specific stuff
|
# Perl specific stuff
|
||||||
find_package(PerlLibs REQUIRED)
|
find_package(PerlLibs REQUIRED)
|
||||||
execute_process(
|
set(PerlEmbed_DEBUG 1)
|
||||||
COMMAND ${PERL_EXECUTABLE} -MExtUtils::Embed -e "
|
find_package(PerlEmbed REQUIRED)
|
||||||
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
|
|
||||||
)
|
|
||||||
target_include_directories(XS PRIVATE ${PERL_INCLUDE_PATH})
|
target_include_directories(XS PRIVATE ${PERL_INCLUDE_PATH})
|
||||||
|
target_compile_options(XS PRIVATE ${PerlEmbed_CCLAGS})
|
||||||
message("PERL_INCLUDE_PATH: ${PERL_INCLUDE_PATH}")
|
target_link_libraries(XS ${PERL_LIBRARY})
|
||||||
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)
|
|
||||||
|
|
||||||
## REQUIRED packages
|
## REQUIRED packages
|
||||||
|
|
||||||
@ -186,16 +144,22 @@ if (TBB_FOUND)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Find and configure wxWidgets
|
# Find and configure wxWidgets
|
||||||
set(wxWidgets_UseAlienWx 1)
|
if (SLIC3R_PRUSACONTROL)
|
||||||
if (wxWidgets_UseAlienWx)
|
set(wxWidgets_UseAlienWx 1)
|
||||||
# ${PROJECT_SOURCE_DIR}/cmake/helpers/alien_wx_to_cmake.pl
|
if (wxWidgets_UseAlienWx)
|
||||||
else ()
|
set(AlienWx_DEBUG 1)
|
||||||
find_package(wxWidgets REQUIRED)
|
find_package(AlienWx REQUIRED COMPONENTS base)
|
||||||
if (wxWidgets_FOUND)
|
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})
|
include(${wxWidgets_USE_FILE})
|
||||||
target_link_libraries(XS ${wxWidgets_LIBRARIES})
|
target_link_libraries(XS ${wxWidgets_LIBRARIES})
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
target_compile_definitions(XS PRIVATE -DSLIC3R_GUI -DSLIC3R_PRUS)
|
||||||
|
endif()
|
||||||
|
|
||||||
## OPTIONAL packages
|
## OPTIONAL packages
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user