2#include <Library/LibrarySettings.hpp>
4#include <score/application/ApplicationContext.hpp>
6#include <QCoreApplication>
13#include <llvm/ADT/StringMap.h>
14#include <llvm/ADT/StringRef.h>
16#if LLVM_VERSION_MAJOR >= 17
17#include <llvm/TargetParser/Host.h>
18#include <llvm/TargetParser/Triple.h>
20#include <llvm/Support/Host.h>
28#if __has_include(<llvm/Config/llvm-config-64.h>)
29#include <llvm/Config/llvm-config-64.h>
30#elif __has_include(<llvm/Config/llvm-config.h>)
31#include <llvm/Config/llvm-config.h>
34#if defined(__has_feature)
35#if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
36#define __SANITIZE_ADDRESS__ 1
40#if defined(SCORE_FHS_BUILD)
41#define SCORE_USE_DISTRO_SYSROOT 1
43#if defined(SCORE_DEPLOYMENT_BUILD)
44#define SCORE_USE_DISTRO_SYSROOT 0
46#define SCORE_USE_DISTRO_SYSROOT 1
50#include <JitCpp/JitOptions.hpp>
52#include <score_git_info.hpp>
57static inline std::string locateSDK()
59 if(QString sdk = qgetenv(
"SCORE_JIT_SDK"); !sdk.isEmpty())
60 return sdk.toStdString();
63 QString path = ctx.getSDKPath();
65 if(QString libPath = QStringLiteral(
"%1/%2/usr").arg(path).arg(SCORE_TAG_NO_V);
66 QDir(libPath +
"/include/c++").exists())
68 return libPath.toStdString();
71 if(QString libPath = path +
"/usr"; QDir(libPath +
"/include/c++").exists())
73 return libPath.toStdString();
76 auto appFolder = QCoreApplication::instance()->applicationDirPath();
84 return d.absolutePath().toStdString();
86#elif defined(__linux__)
91 return d.absolutePath().toStdString();
93#elif defined(__APPLE__)
97 if(d.cd(
"Frameworks"))
99 if(d.cd(
"Score.Framework"))
101 return d.absolutePath().toStdString();
104 auto framework = QString(appFolder +
"/Score.Framework");
105 if(QDir{}.exists(framework))
106 return framework.toStdString();
108 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
109 "Developer/SDKs/MacOSX.sdk/usr";
114#if defined(__APPLE__)
115 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
116 "Developer/SDKs/MacOSX.sdk/usr";
118 if(QFileInfo(
"/usr/include/c++").isDir())
124 return ctx.getSDKPath().toStdString();
142 static constexpr bool deploying =
true;
144 static constexpr bool deploying =
false;
151 ret.path = locateSDK();
153 ret.sdk_kind = located_sdk::none;
154 if(ret.path.starts_with(
"/usr") || ret.path.starts_with(
"/Applications"))
155 ret.sdk_kind = located_sdk::official;
157 ret.sdk_kind = located_sdk::platform;
163 if(ret.sdk_kind == located_sdk::platform
164 && QDir(QString::fromStdString(ret.path)).exists(
"lib/cmake/score/prototype.cpp.in"))
165 ret.sdk_kind = located_sdk::official;
168 QDir dir(QString::fromStdString(ret.path));
170 ret.sdk_kind = located_sdk::none;
172 if(!dir.cd(
"include") || !dir.cd(
"c++"))
174#if defined(SCORE_DEPLOYMENT_BUILD)
178 qDebug() <<
"JIT: no score SDK in" << QString::fromStdString(ret.path);
180 ret.sdk_kind = located_sdk::none;
183 qDebug() <<
"Unable to locate standard headers, fallback to /usr";
186 if(!dir.cd(
"include") || !dir.cd(
"c++"))
188 qDebug() <<
"Unable to locate any standard headers, install C++ development "
190 throw std::runtime_error(
"Unable to compile");
192 ret.sdk_kind = located_sdk::platform;
205static inline std::string locateOrcRuntime()
207 if(QString p = qgetenv(
"SCORE_JIT_ORC_RUNTIME"); !p.isEmpty())
208 return p.toStdString();
210 auto sdk = locateSDKWithFallback();
214 const QString base = QString::fromStdString(sdk.path);
215 const QString parent = QFileInfo(base).absolutePath();
216 const QStringList roots{base, parent,
217 parent +
"/llvm", parent +
"/llvm-libs",
218 base +
"/llvm", base +
"/llvm-libs"};
219 for(
const QString& root : roots)
222 const QString clangLibs = root +
"/lib/clang";
223 if(!QDir(clangLibs).exists())
226 clangLibs, {
"liborc_rt*.a"}, QDir::Files, QDirIterator::Subdirectories);
228 return it.next().toStdString();
239static inline std::string locateBuiltinsRuntime()
241 if(QString p = qgetenv(
"SCORE_JIT_BUILTINS"); !p.isEmpty())
242 return p.toStdString();
244 auto sdk = locateSDKWithFallback();
248 const QString base = QString::fromStdString(sdk.path);
249 const QString parent = QFileInfo(base).absolutePath();
250 const QStringList roots{base, parent,
251 parent +
"/llvm", parent +
"/llvm-libs",
252 base +
"/llvm", base +
"/llvm-libs"};
253 const llvm::Triple host{llvm::sys::getProcessTriple()};
254 const QString archive = QString::fromStdString(
255 "libclang_rt.builtins-" + llvm::Triple::getArchTypeName(host.getArch()).str()
258 for(
const QString& root : roots)
260 const QString clangLibs = root +
"/lib/clang";
261 if(!QDir(clangLibs).exists())
263 QDirIterator it(clangLibs, {archive}, QDir::Files, QDirIterator::Subdirectories);
266 const QString f = it.next();
267 if(f.contains(
"/windows/") || f.contains(
"\\windows\\"))
268 return f.toStdString();
269 if(fallback.isEmpty())
273 return fallback.toStdString();
282static inline std::string locateMingwRuntimeLib(
const char* env,
const char* name)
284 if(QString p = qgetenv(env); !p.isEmpty())
285 return p.toStdString();
287 auto sdk = locateSDKWithFallback();
291 const QString base = QString::fromStdString(sdk.path);
292 const QString parent = QFileInfo(base).absolutePath();
293 const QStringList roots{base, parent,
294 parent +
"/llvm", parent +
"/llvm-libs",
295 base +
"/llvm", base +
"/llvm-libs"};
296 const QString lib = QString::fromUtf8(name);
297 for(
const QString& root : roots)
300 for(
const QString& p :
301 {QString(root +
"/lib/" + lib),
302 QString(root +
"/x86_64-w64-mingw32/lib/" + lib)})
304 return p.toStdString();
309static inline std::string locateMingwexRuntime()
311 return locateMingwRuntimeLib(
"SCORE_JIT_MINGWEX",
"libmingwex.a");
314static inline std::string locateUcrtImportLib()
316 return locateMingwRuntimeLib(
"SCORE_JIT_UCRT",
"libucrt.a");
320populateCompileOptions(std::vector<std::string>& args, CompilerOptions opts)
322 args.push_back(
"-triple");
323 const std::string processTriple = llvm::sys::getProcessTriple();
324 args.push_back(processTriple);
334 if(llvm::Triple(processTriple).isOSBinFormatCOFF())
336 args.push_back(
"-mcmodel=large");
350 args.push_back(
"-D_UCRT");
358 args.push_back(
"-D__USE_MINGW_ANSI_STDIO=0");
359 args.push_back(
"-fno-use-init-array");
360 args.push_back(
"-funwind-tables=2");
361 args.push_back(
"-fno-sized-deallocation");
364 args.push_back(
"-target-cpu");
365 args.push_back(llvm::sys::getHostCPUName().lower());
368 llvm::StringMap<bool> HostFeatures;
369#if LLVM_VERSION_MAJOR < 19
370 bool ok = llvm::sys::getHostCPUFeatures(HostFeatures);
372 constexpr bool ok =
true;
373 HostFeatures = llvm::sys::getHostCPUFeatures();
377 for(
const llvm::StringMapEntry<bool>& F : HostFeatures)
379 args.push_back(
"-target-feature");
380 args.push_back((F.second ?
"+" :
"-") + F.first().str());
391 args.push_back(
"-std=gnu++23");
392 args.push_back(
"-disable-free");
393 args.push_back(
"-fdeprecated-macro");
394 args.push_back(
"-fmath-errno");
399 args.push_back(
"-mthread-model");
400 args.push_back(
"posix");
402 args.push_back(
"-mconstructor-aliases");
407 args.push_back(
"-fno-use-cxa-atexit");
411 args.push_back(
"-fno-signed-zeros");
412 args.push_back(
"-mreassociate");
413 args.push_back(
"-freciprocal-math");
414 args.push_back(
"-fno-rounding-math");
417 args.push_back(
"-ffp-contract=fast");
419#if !defined(__linux__)
422 args.push_back(
"-Ofast");
423 args.push_back(
"-menable-no-infs");
424 args.push_back(
"-menable-no-nans");
425 args.push_back(
"-ffinite-math-only");
426 args.push_back(
"-ffast-math");
428 args.push_back(
"-O3");
429 args.push_back(
"-fno-builtin");
433 args.push_back(
"-mno-stack-arg-probe");
435 args.push_back(
"-fgnuc-version=4.2.1");
437#if defined(__APPLE__)
438 args.push_back(
"-fmax-type-align=16");
446 args.push_back(
"-fblocks");
456 args.push_back(
"-Wno-elaborated-enum-base");
458 args.push_back(
"-mrelocation-model");
459 args.push_back(
"pic");
460 args.push_back(
"-pic-level");
465 args.push_back(
"-fvisibility=hidden");
467 args.push_back(
"-fvisibility-inlines-hidden");
475#if LLVM_VERSION_MAJOR >= 22
476 const bool useNativePlatform = !locateOrcRuntime().empty();
478 const bool useNativePlatform =
false;
485 if(!useNativePlatform || !llvm::Triple(processTriple).isOSBinFormatMachO())
487 args.push_back(
"-ftls-model=local-exec");
488 args.push_back(
"-femulated-tls");
495 args.push_back(
"-ftls-model=global-dynamic");
499 args.push_back(
"-mrelax-all");
500 args.push_back(
"-disable-llvm-verifier");
501 args.push_back(
"-discard-value-names");
502#if defined(__SANITIZE_ADDRESS__)
523 args.push_back(
"-fno-assume-sane-operator-new");
525 args.push_back(
"-stack-protector");
527 if(opts.NoExceptions)
529 args.push_back(
"-fno-rtti");
533#if LLVM_VERSION_MAJOR <= 13
534 args.push_back(
"-munwind-tables");
537 args.push_back(
"-fcxx-exceptions");
538 args.push_back(
"-fexceptions");
539 args.push_back(
"-fexternc-nounwind");
541 args.push_back(
"-exception-model=seh");
544 args.push_back(
"-faddrsig");
547 args.push_back(
"-vectorize-loops");
548 args.push_back(
"-vectorize-slp");
551static inline void populateDefinitions(std::vector<std::string>& args)
553#if defined(__APPLE__)
555 args.push_back(
"-DMOODYCAMEL_MAYBE_ALIGN_TO_CACHELINE=");
557#define XSTR(s) STR(s)
560#if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
561 args.push_back(
"-DBOOST_ASIO_ENABLE_BUFFER_DEBUGGING");
563#if defined(BOOST_ASIO_HAS_STD_INVOKE_RESULT)
565 "-DBOOST_ASIO_HAS_STD_INVOKE_RESULT=" XSTR(BOOST_ASIO_HAS_STD_INVOKE_RESULT));
567#if defined(BOOST_MATH_DISABLE_FLOAT128)
568 args.push_back(
"-DBOOST_MATH_DISABLE_FLOAT128=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
570#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
571 args.push_back(
"-DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING");
573#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
574 args.push_back(
"-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE");
576#if defined(BOOST_NO_RTTI)
577 args.push_back(
"-DBOOST_NO_RTTI=" XSTR(BOOST_NO_RTTI));
579#if defined(FMT_SHARED)
580 args.push_back(
"-DFMT_SHARED=" XSTR(FMT_SHARED));
588#if defined(FMT_HEADER_ONLY)
589 args.push_back(
"-DFMT_HEADER_ONLY=" XSTR(FMT_HEADER_ONLY));
591#if defined(FMT_STATIC_THOUSANDS_SEPARATOR)
593 "-DFMT_STATIC_THOUSANDS_SEPARATOR=" XSTR(FMT_STATIC_THOUSANDS_SEPARATOR));
595#if defined(FMT_USE_FLOAT128)
596 args.push_back(
"-DFMT_USE_FLOAT128=" XSTR(FMT_USE_FLOAT128));
598#if defined(FMT_USE_INT128)
599 args.push_back(
"-DFMT_USE_INT128=" XSTR(FMT_USE_INT128));
601#if defined(FMT_USE_LONG_DOUBLE)
602 args.push_back(
"-DFMT_USE_LONG_DOUBLE=" XSTR(FMT_USE_LONG_DOUBLE));
604#if defined(LIBREMIDI_ALSA)
605 args.push_back(
"-DLIBREMIDI_ALSA");
607#if defined(LIBREMIDI_HAS_JACK_GET_VERSION)
608 args.push_back(
"-DLIBREMIDI_HAS_JACK_GET_VERSION");
610#if defined(LIBREMIDI_HAS_UDEV)
611 args.push_back(
"-DLIBREMIDI_HAS_UDEV");
613#if defined(LIBREMIDI_JACK)
614 args.push_back(
"-DLIBREMIDI_JACK");
616#if defined(LIBREMIDI_KEYBOARD)
617 args.push_back(
"-DLIBREMIDI_KEYBOARD");
619#if defined(LIBREMIDI_PIPEWIRE)
620 args.push_back(
"-DLIBREMIDI_PIPEWIRE");
622#if defined(LIBREMIDI_PIPEWIRE_UMP)
623 args.push_back(
"-DLIBREMIDI_PIPEWIRE_UMP");
625#if defined(LIBREMIDI_USE_BOOST)
626 args.push_back(
"-DLIBREMIDI_USE_BOOST");
628#if defined(LIBREMIDI_WEAKJACK)
629 args.push_back(
"-DLIBREMIDI_WEAKJACK");
631#if defined(QT_CORE_LIB)
632 args.push_back(
"-DQT_CORE_LIB");
634#if defined(QT_DISABLE_DEPRECATED_BEFORE)
635 args.push_back(
"-DQT_DISABLE_DEPRECATED_BEFORE=" XSTR(QT_DISABLE_DEPRECATED_BEFORE));
637#if defined(QT_GUI_LIB)
638 args.push_back(
"-DQT_GUI_LIB");
640#if defined(QT_NETWORK_LIB)
641 args.push_back(
"-DQT_NETWORK_LIB");
643#if defined(QT_NO_JAVA_STYLE_ITERATORS)
644 args.push_back(
"-DQT_NO_JAVA_STYLE_ITERATORS");
646#if defined(QT_NO_KEYWORDS)
647 args.push_back(
"-DQT_NO_KEYWORDS");
649#if defined(QT_NO_LINKED_LIST)
650 args.push_back(
"-DQT_NO_LINKED_LIST");
652#if defined(QT_NO_NARROWING_CONVERSIONS_IN_CONNECT)
653 args.push_back(
"-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT");
655#if defined(QT_NO_USING_NAMESPACE)
656 args.push_back(
"-DQT_NO_USING_NAMESPACE");
658#if defined(QT_OPENGL_LIB)
659 args.push_back(
"-DQT_OPENGL_LIB");
661#if defined(QT_QMLINTEGRATION_LIB)
662 args.push_back(
"-DQT_QMLINTEGRATION_LIB");
664#if defined(QT_QML_LIB)
665 args.push_back(
"-DQT_QML_LIB");
667#if defined(QT_SERIALPORT_LIB)
668 args.push_back(
"-DQT_SERIALPORT_LIB");
670#if defined(QT_SHADERTOOLS_LIB)
671 args.push_back(
"-DQT_SHADERTOOLS_LIB");
673#if defined(QT_STATEMACHINE_LIB)
674 args.push_back(
"-DQT_STATEMACHINE_LIB");
676#if defined(QT_USE_QSTRINGBUILDER)
677 args.push_back(
"-DQT_USE_QSTRINGBUILDER");
679#if defined(QT_WEBSOCKETS_LIB)
680 args.push_back(
"-DQT_WEBSOCKETS_LIB");
682#if defined(QT_WIDGETS_LIB)
683 args.push_back(
"-DQT_WIDGETS_LIB");
685#if defined(RAPIDJSON_HAS_STDSTRING)
686 args.push_back(
"-DRAPIDJSON_HAS_STDSTRING=" XSTR(RAPIDJSON_HAS_STDSTRING));
688#if defined(SCORE_DEBUG)
689 args.push_back(
"-DSCORE_DEBUG");
691#if defined(SCORE_LIB_BASE)
692 args.push_back(
"-DSCORE_LIB_BASE");
694#if defined(SCORE_LIB_DEVICE)
695 args.push_back(
"-DSCORE_LIB_DEVICE");
697#if defined(SCORE_LIB_INSPECTOR)
698 args.push_back(
"-DSCORE_LIB_INSPECTOR");
700#if defined(SCORE_LIB_LOCALTREE)
701 args.push_back(
"-DSCORE_LIB_LOCALTREE");
703#if defined(SCORE_LIB_PROCESS)
704 args.push_back(
"-DSCORE_LIB_PROCESS");
706#if defined(SCORE_LIB_STATE)
707 args.push_back(
"-DSCORE_LIB_STATE");
709#if defined(SCORE_PLUGIN_AUDIO)
710 args.push_back(
"-DSCORE_PLUGIN_AUDIO");
712#if defined(SCORE_PLUGIN_AUTOMATION)
713 args.push_back(
"-DSCORE_PLUGIN_AUTOMATION");
715#if defined(SCORE_PLUGIN_AVND)
716 args.push_back(
"-DSCORE_PLUGIN_AVND");
718#if defined(SCORE_PLUGIN_CURVE)
719 args.push_back(
"-DSCORE_PLUGIN_CURVE");
721#if defined(SCORE_PLUGIN_DATAFLOW)
722 args.push_back(
"-DSCORE_PLUGIN_DATAFLOW");
724#if defined(SCORE_PLUGIN_DEVICEEXPLORER)
725 args.push_back(
"-DSCORE_PLUGIN_DEVICEEXPLORER");
727#if defined(SCORE_PLUGIN_ENGINE)
728 args.push_back(
"-DSCORE_PLUGIN_ENGINE");
730#if defined(SCORE_PLUGIN_GFX)
731 args.push_back(
"-DSCORE_PLUGIN_GFX");
733#if defined(SCORE_PLUGIN_LIBRARY)
734 args.push_back(
"-DSCORE_PLUGIN_LIBRARY");
736#if defined(SCORE_PLUGIN_MEDIA)
737 args.push_back(
"-DSCORE_PLUGIN_MEDIA");
739#if defined(SCORE_PLUGIN_SCENARIO)
740 args.push_back(
"-DSCORE_PLUGIN_SCENARIO");
742#if defined(SCORE_PLUGIN_TRANSPORT)
743 args.push_back(
"-DSCORE_PLUGIN_TRANSPORT");
745#if defined(SERVUS_USE_AVAHI_CLIENT)
746 args.push_back(
"-DSERVUS_USE_AVAHI_CLIENT");
748#if defined(SPDLOG_COMPILED_LIB)
749 args.push_back(
"-DSPDLOG_COMPILED_LIB=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
751#if defined(SPDLOG_DEBUG_ON)
752 args.push_back(
"-DSPDLOG_DEBUG_ON=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
754#if defined(SPDLOG_FMT_EXTERNAL)
755 args.push_back(
"-DSPDLOG_FMT_EXTERNAL=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
757#if defined(SPDLOG_NO_DATETIME)
758 args.push_back(
"-DSPDLOG_NO_DATETIME=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
760#if defined(SPDLOG_NO_NAME)
761 args.push_back(
"-DSPDLOG_NO_NAME=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
763#if defined(SPDLOG_NO_THREAD_ID)
764 args.push_back(
"-DSPDLOG_NO_THREAD_ID=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
766#if defined(SPDLOG_SHARED_LIB)
767 args.push_back(
"-DSPDLOG_SHARED_LIB=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
769#if defined(SPDLOG_TRACE_ON)
770 args.push_back(
"-DSPDLOG_TRACE_ON=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
772#if defined(TINYSPLINE_DOUBLE_PRECISION)
773 args.push_back(
"-DTINYSPLINE_DOUBLE_PRECISION");
776#if defined(SCORE_DEBUG)
777 args.push_back(
"-DSCORE_DEBUG");
781 args.push_back(
"-D_GNU_SOURCE=1");
782 args.push_back(
"-D__STDC_CONSTANT_MACROS");
783 args.push_back(
"-D__STDC_FORMAT_MACROS");
784 args.push_back(
"-D__STDC_LIMIT_MACROS");
785#if defined(FFTW_SINGLE_ONLY)
786 args.push_back(
"-DFFTW_SINGLE_ONLY");
787#elif defined(FFTW_DOUBLE_ONLY)
788 args.push_back(
"-DFFTW_DOUBLE_ONLY");
792static inline auto getPotentialTriples()
794 std::vector<QString> triples;
795 triples.push_back(LLVM_DEFAULT_TARGET_TRIPLE);
796 triples.push_back(LLVM_HOST_TRIPLE);
797#if defined(__x86_64__)
798 triples.push_back(
"x86_64-pc-linux-gnu");
799 triples.push_back(
"x86_64-unknown-linux-gnu");
800#elif defined(__i686__)
801 triples.push_back(
"i686-pc-linux-gnu");
802#elif defined(__i586__)
803 triples.push_back(
"i586-pc-linux-gnu");
804#elif defined(__i486__)
805 triples.push_back(
"i486-pc-linux-gnu");
806#elif defined(__i386__)
807 triples.push_back(
"i386-pc-linux-gnu");
808#elif defined(__arm__)
809 triples.push_back(
"armv8-none-linux-gnueabi");
810 triples.push_back(
"armv8-pc-linux-gnueabi");
811 triples.push_back(
"armv8-none-linux-gnu");
812 triples.push_back(
"armv8-pc-linux-gnu");
813 triples.push_back(
"armv7-none-linux-gnueabi");
814 triples.push_back(
"armv7-pc-linux-gnueabi");
815 triples.push_back(
"armv7-none-linux-gnu");
816 triples.push_back(
"armv7-pc-linux-gnu");
817 triples.push_back(
"armv6-none-linux-gnueabi");
818 triples.push_back(
"armv6-pc-linux-gnueabi");
819 triples.push_back(
"armv6-none-linux-gnu");
820 triples.push_back(
"armv6-pc-linux-gnu");
821#elif defined(__aarch64__)
822 triples.push_back(
"aarch64-none-linux-gnueabi");
823 triples.push_back(
"aarch64-pc-linux-gnueabi");
824 triples.push_back(
"aarch64-unknown-linux-gnueabi");
825 triples.push_back(
"aarch64-none-linux-gnu");
826 triples.push_back(
"aarch64-pc-linux-gnu");
827 triples.push_back(
"aarch64-unknown-linux-gnu");
828 triples.push_back(
"aarch64-redhat-linux");
872static inline void populateIncludeDirs(std::vector<std::string>& args)
874 auto sdk_location = locateSDKWithFallback();
875 if(sdk_location.sdk_kind == located_sdk::none)
878 throw std::runtime_error(
879 QStringLiteral(
"The score SDK is not installed: C++ cannot be compiled. "
880 "Install it from the package manager, in %1/%2.")
881 .arg(lib.getSDKPath(), QStringLiteral(SCORE_TAG_NO_V))
884 auto& sdk = sdk_location.path;
885 auto qsdk = QString::fromStdString(sdk);
887 qDebug() <<
"SDK located: " << qsdk;
888 std::string llvm_lib_version = SCORE_LLVM_VERSION;
889#if defined(__APPLE__) && SCORE_FHS_BUILD
890 llvm_lib_version =
"13.0.0";
893 QDir resDir = QString(qsdk +
"/lib/clang");
894 auto entries = resDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
895 if(!entries.empty() && !entries.contains(SCORE_LLVM_VERSION))
896 llvm_lib_version = entries.front().toStdString();
898#if defined(__APPLE__) && SCORE_FHS_BUILD
899 std::string appleSharedSdk
900 =
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/"
902 args.push_back(
"-resource-dir");
903 args.push_back(appleSharedSdk +
"/lib/clang/" + llvm_lib_version);
905 args.push_back(
"-resource-dir");
906 args.push_back(sdk +
"/lib/clang/" + llvm_lib_version);
909#if defined(_LIBCPP_VERSION)
910 args.push_back(
"-stdlib=libc++");
911 args.push_back(
"-internal-isystem");
913#if defined(__APPLE__) && SCORE_FHS_BUILD
914 args.push_back(appleSharedSdk +
"/include/c++/v1");
916 args.push_back(sdk +
"/include/c++/v1");
923 const QDir incdir(qsdk +
"/include");
924 for(
const auto& d : incdir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
926 if(QFileInfo::exists(qsdk +
"/include/" + d +
"/c++/v1/__config_site"))
928 args.push_back(
"-internal-isystem");
929 args.push_back(sdk +
"/include/" + d.toStdString() +
"/c++/v1");
935#elif defined(_GLIBCXX_RELEASE)
939 const auto libstdcpp_major = QString::number(_GLIBCXX_RELEASE);
941 QDir cpp_dir{
"/usr/include/c++"};
943 QDirIterator cpp_it{cpp_dir};
944 while(cpp_it.hasNext())
947 auto ver = cpp_it.fileName();
948 if(!ver.isEmpty() && ver.startsWith(libstdcpp_major))
950 auto gcc = ver.toStdString();
953 args.push_back(
"-internal-isystem");
954 args.push_back(
"/usr/include/c++/" + gcc);
957 for(
auto& triple : getPotentialTriples())
959 if(cpp_dir.exists(triple))
962 args.push_back(
"-internal-isystem");
963 args.push_back(
"/usr/include/c++/" + gcc +
"/" + triple.toStdString());
974#if defined(__APPLE__) && SCORE_FHS_BUILD
975 args.push_back(
"-internal-isystem");
976 args.push_back(appleSharedSdk +
"/lib/clang/" + llvm_lib_version +
"/include");
977 args.push_back(
"-internal-externc-isystem");
979 "/Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/"
980 "SDKs/MacOSX.sdk/usr/include");
982 args.push_back(
"-internal-isystem");
983 args.push_back(sdk +
"/lib/clang/" + llvm_lib_version +
"/include");
984 args.push_back(
"-internal-externc-isystem");
985 args.push_back(sdk +
"/include");
988#if defined(__APPLE__)
993 if(QFileInfo{qsdk +
"/include/macos-sdks"}.isDir())
994 args.push_back(
"-isystem" + sdk +
"/include/macos-sdks");
1006 auto include = [&](
const std::string& path) {
1007 std::string path_to_include = sdk +
"/include/" + path;
1008 auto qpath = QString::fromStdString(path_to_include);
1009 if(!QFileInfo{qpath}.isDir())
1011 qDebug() <<
"Trying to include non-existent path: " << qpath;
1015 args.push_back(
"-isystem" + sdk +
"/include/" + path);
1019#if defined(__linux__)
1021#if defined(__x86_64__)
1022 include(
"x86_64-linux-gnu");
1024 include(
"aarch64-linux-gnu");
1029 std::string qt_folder =
"qt";
1030 if(QFile::exists(qsdk +
"/include/qt6/QtCore"))
1033 QDirIterator qtVersionFolder{
1034 qsdk +
"/include/" + QString::fromStdString(qt_folder) +
"/QtCore",
1036 QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot,
1038 std::string qt_version = QT_VERSION_STR;
1039 if(qtVersionFolder.hasNext())
1041 QDir sub = qtVersionFolder.next();
1042 qt_version = sub.dirName().toStdString();
1044 include(qt_folder +
"");
1045 include(qt_folder +
"/QtCore");
1046 include(qt_folder +
"/QtCore/" + qt_version);
1047 include(qt_folder +
"/QtCore/" + qt_version +
"/QtCore");
1048 include(qt_folder +
"/QtGui");
1049 include(qt_folder +
"/QtGui/" + qt_version);
1050 include(qt_folder +
"/QtGui/" + qt_version +
"/QtGui");
1051 include(qt_folder +
"/QtWidgets");
1052 include(qt_folder +
"/QtWidgets/" + qt_version);
1053 include(qt_folder +
"/QtWidgets/" + qt_version +
"/QtWidgets");
1054 include(qt_folder +
"/QtQml");
1055 include(qt_folder +
"/QtQml/" + qt_version);
1056 include(qt_folder +
"/QtQml/" + qt_version +
"/QtQml");
1057 include(qt_folder +
"/QtQuick");
1058 include(qt_folder +
"/QtQuick/" + qt_version);
1059 include(qt_folder +
"/QtQuick/" + qt_version +
"/QtQuick");
1060 include(qt_folder +
"/QtXml");
1061 include(qt_folder +
"/QtNetwork");
1062 include(qt_folder +
"/QtSvg");
1063 include(qt_folder +
"/QtSql");
1064 include(qt_folder +
"/QtOpenGL");
1065 include(qt_folder +
"/QtShaderTools");
1066 include(qt_folder +
"/QtShaderTools/" + qt_version);
1067 include(qt_folder +
"/QtShaderTools/" + qt_version +
"/QtShaderTools");
1068 include(qt_folder +
"/QtSerialPort");
1070 if(sdk_location.sdk_kind == located_sdk::official && sdk_location.deploying)
1076 auto thirdparty_include_dirs = {
1077 "/3rdparty/libossia/3rdparty/boost_1_88_0",
1078 "/3rdparty/libossia/3rdparty/nano-signal-slot/include",
1079 "/3rdparty/libossia/3rdparty/spdlog/include",
1080 "/3rdparty/libossia/3rdparty/dr_libs",
1081 "/3rdparty/libossia/3rdparty/Flicks",
1082 "/3rdparty/libossia/3rdparty/fmt/include",
1083 "/3rdparty/libossia/3rdparty/magic_enum/include",
1084 "/3rdparty/libossia/3rdparty/readerwriterqueue",
1085 "/3rdparty/libossia/3rdparty/concurrentqueue",
1086 "/3rdparty/libossia/3rdparty/SmallFunction/smallfun/include",
1087 "/3rdparty/libossia/3rdparty/websocketpp",
1088 "/3rdparty/libossia/3rdparty/rapidjson/include",
1089 "/3rdparty/libossia/3rdparty/libremidi/include",
1090 "/3rdparty/libossia/3rdparty/oscpack",
1091 "/3rdparty/libossia/3rdparty/rnd/include",
1092 "/3rdparty/libossia/3rdparty/span/include",
1093 "/3rdparty/libossia/3rdparty/tuplet/include",
1094 "/3rdparty/libossia/3rdparty/unordered_dense/include",
1095 "/3rdparty/libossia/3rdparty/multi_index/include",
1096 "/3rdparty/libossia/3rdparty/verdigris/src",
1097 "/3rdparty/libossia/3rdparty/weakjack",
1099 for(
auto path : thirdparty_include_dirs)
1101 args.push_back(
"-isystem" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
1103 auto src_include_dirs
1104 = {
"/3rdparty/libossia/src",
1105 "/3rdparty/avendish/include",
1107 "/src/plugins/score-lib-state",
1108 "/src/plugins/score-lib-device",
1109 "/src/plugins/score-lib-process",
1110 "/src/plugins/score-lib-inspector",
1111 "/src/plugins/score-plugin-avnd",
1112 "/src/plugins/score-plugin-gfx",
1113 "/src/plugins/score-plugin-jit",
1114 "/src/plugins/score-plugin-nodal",
1115 "/src/plugins/score-plugin-remotecontrol",
1116 "/src/plugins/score-plugin-audio",
1117 "/src/plugins/score-plugin-curve",
1118 "/src/plugins/score-plugin-dataflow",
1119 "/src/plugins/score-plugin-engine",
1120 "/src/plugins/score-plugin-scenario",
1121 "/src/plugins/score-plugin-library",
1122 "/src/plugins/score-plugin-deviceexplorer",
1123 "/src/plugins/score-plugin-media",
1124 "/src/plugins/score-plugin-loop",
1125 "/src/plugins/score-plugin-midi",
1126 "/src/plugins/score-plugin-protocols",
1127 "/src/plugins/score-plugin-recording",
1128 "/src/plugins/score-plugin-automation",
1129 "/src/plugins/score-plugin-js",
1130 "/src/plugins/score-plugin-mapping"};
1132 for(
auto path : src_include_dirs)
1134 args.push_back(
"-I" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
1140 "/src/plugins/score-lib-state",
1141 "/src/plugins/score-lib-device",
1142 "/src/plugins/score-lib-process",
1143 "/src/plugins/score-lib-inspector",
1144 "/src/plugins/score-plugin-avnd",
1145 "/src/plugins/score-plugin-gfx",
1146 "/src/plugins/score-plugin-jit",
1147 "/src/plugins/score-plugin-nodal",
1148 "/src/plugins/score-plugin-remotecontrol",
1149 "/src/plugins/score-plugin-audio",
1150 "/src/plugins/score-plugin-curve",
1151 "/src/plugins/score-plugin-dataflow",
1152 "/src/plugins/score-plugin-engine",
1153 "/src/plugins/score-plugin-scenario",
1154 "/src/plugins/score-plugin-library",
1155 "/src/plugins/score-plugin-deviceexplorer",
1156 "/src/plugins/score-plugin-media",
1157 "/src/plugins/score-plugin-loop",
1158 "/src/plugins/score-plugin-midi",
1159 "/src/plugins/score-plugin-protocols",
1160 "/src/plugins/score-plugin-recording",
1161 "/src/plugins/score-plugin-automation",
1162 "/src/plugins/score-plugin-js",
1163 "/src/plugins/score-plugin-mapping",
1164 "/3rdparty/libossia/src"};
1166 for(
auto path : src_build_dirs)
1168 args.push_back(
"-I" + std::string(SCORE_ROOT_BINARY_DIR) + path);
Definition LibrarySettings.hpp:46
Definition JitPlatform.hpp:130
T & settings() const
Access a specific Settings model instance.
Definition ApplicationContext.hpp:41