mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-11-01 05:01:10 -06:00
Added dependencies on the Intel Thread Building Blocks.
Changed the C++ parallelization code to Intel Thread Building Blocks.
This commit is contained in:
parent
8a42c0ad9f
commit
cb1a6eae1e
6 changed files with 158 additions and 96 deletions
140
xs/Build.PL
140
xs/Build.PL
|
|
@ -8,8 +8,18 @@ use ExtUtils::CppGuess;
|
|||
use Module::Build::WithXSpp;
|
||||
|
||||
my $cpp_guess = ExtUtils::CppGuess->new;
|
||||
my $lib_ext = ${$cpp_guess}{config}{lib_ext};
|
||||
my $mswin = $^O eq 'MSWin32';
|
||||
|
||||
# Library paths to search for boost, thread building blocks and such.
|
||||
# On Windows, there is really no standard. On Unices, this is a bit better.
|
||||
my @library_path_prefixes = ();
|
||||
if ($mswin) {
|
||||
@library_path_prefixes = ("C:\\", "C:\\dev\\", "C:\\local\\", "D:\\", "D:\\dev\\", "D:\\local\\");
|
||||
} else {
|
||||
@library_path_prefixes = qw(/opt/local/ /usr/local/ /opt/ /usr/);
|
||||
}
|
||||
|
||||
# _GLIBCXX_USE_C99 : to get the long long type for g++
|
||||
# HAS_BOOL : stops Perl/lib/CORE/handy.h from doing "# define bool char" for MSVC
|
||||
# NOGDI : prevents inclusion of wingdi.h which defines functions Polygon() and Polyline() in global namespace
|
||||
|
|
@ -76,24 +86,23 @@ if (defined $ENV{BOOST_INCLUDEDIR}) {
|
|||
# Boost library was not defined by the environment.
|
||||
# Try to guess at some default paths.
|
||||
if ($mswin) {
|
||||
for my $path (glob('C:\dev\boost*\include'), glob ('C:\boost*\include')) {
|
||||
for my $path (map glob($_ . 'boost*\include'), @library_path_prefixes) {
|
||||
push @boost_include, $path;
|
||||
}
|
||||
if (! @boost_include) {
|
||||
# No boost\include. Try to include the boost root.
|
||||
for my $path (glob('C:\dev\boost*'), glob ('C:\boost*')) {
|
||||
for my $path (map glob($_ . 'boost*'), @library_path_prefixes) {
|
||||
push @boost_include, $path;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
push @boost_include, grep { -d $_ }
|
||||
qw(/opt/local/include /usr/local/include /opt/include /usr/include);
|
||||
@boost_include = grep { -d $_ . '/boost' } map { $_ . 'include' } @library_path_prefixes;
|
||||
}
|
||||
}
|
||||
|
||||
my @boost_libs = ();
|
||||
if (defined $ENV{BOOST_LIBRARYDIR}) {
|
||||
push @boost_libs, $ENV{BOOST_LIBRARYDIR}
|
||||
push @boost_libs, $ENV{BOOST_LIBRARYDIR};
|
||||
} elsif (defined $ENV{BOOST_DIR}) {
|
||||
my $subdir = $ENV{BOOST_DIR} . ($mswin ? '\stage\lib' : '/stage/lib');
|
||||
if (-d $subdir) {
|
||||
|
|
@ -105,14 +114,11 @@ if (defined $ENV{BOOST_LIBRARYDIR}) {
|
|||
# Boost library was not defined by the environment.
|
||||
# Try to guess at some default paths.
|
||||
if ($mswin) {
|
||||
for my $path (
|
||||
glob('C:\dev\boost*\lib'), glob ('C:\boost*\lib'),
|
||||
glob('C:\dev\boost*\stage\lib'), glob ('C:\boost*\stage\lib')) {
|
||||
for my $path (map (glob($_ . 'boost*\lib'), glob($_ . 'boost*\stage\lib')), @library_path_prefixes) {
|
||||
push @boost_libs, $path;
|
||||
}
|
||||
} else {
|
||||
push @boost_libs, grep { -d $_ }
|
||||
qw(/opt/local/lib /usr/local/lib /opt/lib /usr/lib /lib);
|
||||
push @boost_libs, grep { -d $_ } map $_ . 'lib', @library_path_prefixes;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -138,7 +144,6 @@ if ($have_boost) {
|
|||
} else {
|
||||
# Either static linking, or check_lib could not be used to find the boost libraries.
|
||||
my $lib_prefix = 'libboost_';
|
||||
my $lib_ext = ${$cpp_guess}{config}{lib_ext};
|
||||
PATH: foreach my $path (@boost_libs) {
|
||||
# Try to find the boost system library.
|
||||
my @files = glob "$path/${lib_prefix}system*$lib_ext";
|
||||
|
|
@ -185,6 +190,110 @@ is handy, if you have built Boost libraries with mutliple settings.
|
|||
|
||||
EOF
|
||||
|
||||
# Search for the Intel Thread Building Blocks.
|
||||
my @tbb_include = ();
|
||||
if (defined $ENV{TBB_INCLUDEDIR}) {
|
||||
push @tbb_include, $ENV{TBB_INCLUDEDIR}
|
||||
} elsif (defined $ENV{TBB_DIR}) {
|
||||
my $subdir = $ENV{TBB_DIR} . (($mswin == 1) ? '\include' : '/include');
|
||||
push @tbb_include, $subdir if (-d $subdir);
|
||||
} else {
|
||||
# Thread Building Blocks library was not defined by the environment.
|
||||
# Try to guess at some default paths.
|
||||
if ($mswin) {
|
||||
for my $path (map glob($_ . 'tbb*\include'), @library_path_prefixes) {
|
||||
push @tbb_include, $path;
|
||||
}
|
||||
} else {
|
||||
@tbb_include = grep { -d $_ . '/tbb' } map { $_ . 'include' } @library_path_prefixes;
|
||||
}
|
||||
}
|
||||
|
||||
my @tbb_libs = ();
|
||||
if (defined $ENV{TBB_LIBRARYDIR}) {
|
||||
push @tbb_libs, $ENV{TBB_LIBRARYDIR}
|
||||
} elsif (defined $ENV{TBB_DIR}) {
|
||||
my $subdir = $ENV{TBB_DIR} . ($mswin ? '\lib' : '/lib');
|
||||
push @tbb_libs, $subdir if (-d $subdir);
|
||||
} else {
|
||||
# Thread Building Blocks library was not defined by the environment.
|
||||
# Try to guess at some default paths.
|
||||
if ($mswin) {
|
||||
for my $path (map { glob($_ . 'tbb*\lib') } @library_path_prefixes) {
|
||||
push @tbb_libs, $path;
|
||||
}
|
||||
} else {
|
||||
@tbb_libs = grep { -d $_ } map { $_ . 'lib' } @library_path_prefixes;
|
||||
}
|
||||
}
|
||||
|
||||
# In order to generate the -l switches we need to know how Thread Building Blocks libraries are named
|
||||
my $have_tbb = 0;
|
||||
#my @tbb_libraries = qw(tbb tbbmalloc tbbmalloc_proxy); # we need these
|
||||
my @tbb_libraries = qw(tbb); # we need these
|
||||
|
||||
if (!$ENV{SLIC3R_STATIC}) {
|
||||
# Dynamic linking of Thread Building Blocks libraries.
|
||||
if (! $mswin) {
|
||||
# Check without explicit lib path (works on Linux and OSX).
|
||||
$have_tbb = 1
|
||||
if check_lib(
|
||||
lib => [ @tbb_libraries ],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($have_tbb) {
|
||||
# The Thread Building Blocks library was detected by check_lib on Linux.
|
||||
push @LIBS, map "-l${_}", @tbb_libraries;
|
||||
} else {
|
||||
# Either static linking, or check_lib could not be used to find the Thread Building Blocks libraries.
|
||||
my $lib_prefix = $cpp_guess->is_msvc ? '' : 'lib';
|
||||
PATH: foreach my $path (@tbb_libs) {
|
||||
# Try to find the Thread Building Blocks system library.
|
||||
my @files = glob "$path/${lib_prefix}tbb*$lib_ext";
|
||||
next if !@files;
|
||||
if ($files[0] =~ /\Q${lib_prefix}tbb\E([^.]*)\Q$lib_ext\E$/) {
|
||||
# Suffix contains the version number, the build type etc.
|
||||
my $suffix = $1;
|
||||
# Verify existence of all required TBB libraries at $path.
|
||||
for my $lib (map "${lib_prefix}${_}${suffix}${lib_ext}", @tbb_libraries) {
|
||||
# If the library file does not exist, try next library path.
|
||||
-f "$path/$lib" or next PATH;
|
||||
}
|
||||
if (! $cpp_guess->is_msvc) {
|
||||
# Test the correctness of TBB libraries by linking them to a minimal C program.
|
||||
check_lib(
|
||||
lib => [ map "${_}${suffix}", @tbb_libraries ],
|
||||
INC => join(' ', map "-I$_", @INC, @tbb_include),
|
||||
LIBS => "-L$path",
|
||||
) or next;
|
||||
}
|
||||
push @INC, (map " -I$_", @tbb_include); # TODO: only use the one related to the chosen lib path
|
||||
if ($ENV{SLIC3R_STATIC} || $cpp_guess->is_msvc) {
|
||||
push @LIBS, map "${path}/${_}_static.lib", @tbb_libraries;
|
||||
} else {
|
||||
push @LIBS, " -L$path", (map " -l$_$suffix", @tbb_libraries);
|
||||
}
|
||||
$have_tbb = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
die <<'EOF' if !$have_tbb;
|
||||
Slic3r requires the Intel Thread Building Blocks libraries. Please make sure the library is installed.
|
||||
|
||||
If the Intel Thread Building Blocks library is installed, this script should be able to locate them in several
|
||||
standard locations. If this is not the case, you might want to supply a path to the library
|
||||
through the TBB_DIR environment variable:
|
||||
|
||||
TBB_DIR=/path/to/TBB perl Build.PL
|
||||
|
||||
Or you may specify TBB_INCLUDEPATH and TBB_LIBRARYPATH separatly, which
|
||||
is handy, if you have built the Thread Building Blocks libraries with mutliple settings.
|
||||
|
||||
EOF
|
||||
|
||||
# Add the OpenGL and GLU libraries.
|
||||
if ($ENV{SLIC3R_GUI}) {
|
||||
if ($mswin) {
|
||||
|
|
@ -206,15 +315,6 @@ if ($ENV{SLIC3R_DEBUG}) {
|
|||
# Disable asserts in the release builds.
|
||||
push @cflags, '-DNDEBUG';
|
||||
}
|
||||
if ($cpp_guess->is_gcc) {
|
||||
# check whether we're dealing with a buggy GCC version
|
||||
# see https://github.com/alexrj/Slic3r/issues/1965
|
||||
if (`cc --version` =~ m/ 4\.7\.[012]/) {
|
||||
# Workaround suggested by Boost devs:
|
||||
# https://svn.boost.org/trac/boost/ticket/8695
|
||||
push @cflags, qw(-fno-inline-small-functions);
|
||||
}
|
||||
}
|
||||
|
||||
print "\n";
|
||||
print 'With @cflags: ', join(', ', map "\"$_\"", @cflags), "\n";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue