2 #include <Library/LibrarySettings.hpp>
4 #include <score/application/ApplicationContext.hpp>
6 #include <QApplication>
9 #include <QDirIterator>
11 #include <llvm/ADT/StringMap.h>
12 #include <llvm/ADT/StringRef.h>
14 #if LLVM_VERSION_MAJOR >= 17
15 #include <llvm/TargetParser/Host.h>
17 #include <llvm/Support/Host.h>
24 #if __has_include(<llvm/Config/llvm-config-64.h>)
25 #include <llvm/Config/llvm-config-64.h>
26 #elif __has_include(<llvm/Config/llvm-config.h>)
27 #include <llvm/Config/llvm-config.h>
30 #if defined(__has_feature)
31 #if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
32 #define __SANITIZE_ADDRESS__ 1
36 #if defined(SCORE_FHS_BUILD)
37 #define SCORE_USE_DISTRO_SYSROOT 1
39 #if defined(SCORE_DEPLOYMENT_BUILD)
40 #define SCORE_USE_DISTRO_SYSROOT 0
42 #define SCORE_USE_DISTRO_SYSROOT 1
46 #include <JitCpp/JitOptions.hpp>
48 #include <score_git_info.hpp>
53 static inline std::string locateSDK()
55 if(QString sdk = qgetenv(
"SCORE_JIT_SDK"); !sdk.isEmpty())
56 return sdk.toStdString();
59 QString path = ctx.getSDKPath();
61 if(QString libPath = QStringLiteral(
"%1/%2/usr").arg(path).arg(SCORE_TAG_NO_V);
62 QDir(libPath +
"/include/c++").exists())
64 return libPath.toStdString();
67 if(QString libPath = path +
"/usr"; QDir(libPath +
"/include/c++").exists())
69 return libPath.toStdString();
72 auto appFolder = qApp->applicationDirPath();
80 return d.absolutePath().toStdString();
82 #elif defined(__linux__)
87 return d.absolutePath().toStdString();
89 #elif defined(__APPLE__)
93 if(d.cd(
"Frameworks"))
95 if(d.cd(
"Score.Framework"))
97 return d.absolutePath().toStdString();
100 auto framework = QString(appFolder +
"/Score.Framework");
101 if(QDir{}.exists(framework))
102 return framework.toStdString();
104 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
105 "Developer/SDKs/MacOSX.sdk/usr";
110 #if defined(__APPLE__)
111 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
112 "Developer/SDKs/MacOSX.sdk/usr";
114 if(QFileInfo(
"/usr/include/c++").isDir())
120 return ctx.getSDKPath().toStdString();
126 populateCompileOptions(std::vector<std::string>& args, CompilerOptions opts)
128 args.push_back(
"-triple");
129 args.push_back(llvm::sys::getDefaultTargetTriple());
131 args.push_back(
"-target-cpu");
132 args.push_back(llvm::sys::getHostCPUName().lower());
135 llvm::StringMap<bool> HostFeatures;
136 if(llvm::sys::getHostCPUFeatures(HostFeatures))
138 for(
const llvm::StringMapEntry<bool>& F : HostFeatures)
140 args.push_back(
"-target-feature");
141 args.push_back((F.second ?
"+" :
"-") + F.first().str());
146 args.push_back(
"-std=c++2b");
147 args.push_back(
"-disable-free");
148 args.push_back(
"-fdeprecated-macro");
149 args.push_back(
"-fmath-errno");
154 args.push_back(
"-mthread-model");
155 args.push_back(
"posix");
157 args.push_back(
"-mconstructor-aliases");
162 args.push_back(
"-fno-use-cxa-atexit");
166 args.push_back(
"-fno-signed-zeros");
167 args.push_back(
"-mreassociate");
168 args.push_back(
"-freciprocal-math");
169 args.push_back(
"-fno-rounding-math");
172 args.push_back(
"-ffp-contract=fast");
174 #if !defined(__linux__)
177 args.push_back(
"-Ofast");
178 args.push_back(
"-menable-no-infs");
179 args.push_back(
"-menable-no-nans");
180 args.push_back(
"-ffinite-math-only");
181 args.push_back(
"-ffast-math");
183 args.push_back(
"-O3");
184 args.push_back(
"-fno-builtin");
188 args.push_back(
"-mno-stack-arg-probe");
190 args.push_back(
"-fgnuc-version=4.2.1");
192 #if defined(__APPLE__)
193 args.push_back(
"-fmax-type-align=16");
195 args.push_back(
"-mrelocation-model");
196 args.push_back(
"pic");
197 args.push_back(
"-pic-level");
202 args.push_back(
"-fvisibility=hidden");
204 args.push_back(
"-fvisibility-inlines-hidden");
207 args.push_back(
"-ftls-model=local-exec");
211 args.push_back(
"-mrelax-all");
212 args.push_back(
"-disable-llvm-verifier");
213 args.push_back(
"-discard-value-names");
214 #if defined(__SANITIZE_ADDRESS__)
235 args.push_back(
"-fno-assume-sane-operator-new");
237 args.push_back(
"-stack-protector");
239 if(opts.NoExceptions)
241 args.push_back(
"-fno-rtti");
245 #if LLVM_VERSION_MAJOR <= 13
246 args.push_back(
"-munwind-tables");
249 args.push_back(
"-fcxx-exceptions");
250 args.push_back(
"-fexceptions");
251 args.push_back(
"-fexternc-nounwind");
253 args.push_back(
"-exception-model=seh");
256 args.push_back(
"-faddrsig");
259 args.push_back(
"-vectorize-loops");
260 args.push_back(
"-vectorize-slp");
263 static inline void populateDefinitions(std::vector<std::string>& args)
265 #if defined(__APPLE__)
267 args.push_back(
"-DMOODYCAMEL_MAYBE_ALIGN_TO_CACHELINE=");
269 args.push_back(
"-DBOOST_MATH_DISABLE_FLOAT128=1");
270 args.push_back(
"-DBOOST_ASIO_DISABLE_CONCEPTS=1");
271 args.push_back(
"-DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING");
272 args.push_back(
"-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE");
273 args.push_back(
"-DQT_CORE_LIB");
274 args.push_back(
"-DQT_DISABLE_DEPRECATED_BEFORE=0x050800");
275 args.push_back(
"-DQT_GUI_LIB");
276 args.push_back(
"-DQT_NETWORK_LIB");
277 args.push_back(
"-DQT_NO_KEYWORDS");
278 args.push_back(
"-DQT_QML_LIB");
279 args.push_back(
"-DQT_QUICK_LIB");
280 args.push_back(
"-DQT_SERIALPORT_LIB");
281 args.push_back(
"-DQT_STATICPLUGIN");
282 args.push_back(
"-DQT_SVG_LIB");
283 args.push_back(
"-DQT_WEBSOCKETS_LIB");
284 args.push_back(
"-DQT_WIDGETS_LIB");
285 args.push_back(
"-DQT_XML_LIB");
286 args.push_back(
"-DRAPIDJSON_HAS_STDSTRING=1");
292 args.push_back(
"-DSPDLOG_NO_TLS=1");
293 args.push_back(
"-DMOODYCAMEL_NO_THREAD_LOCAL=1");
295 args.push_back(
"-D__thread=__do_not_use_thread_local__");
296 args.push_back(
"-Dthread_local=__do_not_use_thread_local__");
297 args.push_back(
"-D_Thread_local=__do_not_use_thread_local__");
300 #if defined(SCORE_DEBUG)
301 args.push_back(
"-DSCORE_DEBUG");
303 args.push_back(
"-DSCORE_LIB_BASE");
304 args.push_back(
"-DSCORE_LIB_DEVICE");
305 args.push_back(
"-DSCORE_LIB_INSPECTOR");
306 args.push_back(
"-DSCORE_LIB_LOCALTREE");
307 args.push_back(
"-DSCORE_LIB_PROCESS");
308 args.push_back(
"-DSCORE_LIB_STATE");
309 args.push_back(
"-DSCORE_PLUGIN_GFX");
310 args.push_back(
"-DSCORE_PLUGIN_REMOTECONTROL");
311 args.push_back(
"-DSCORE_PLUGIN_NODAL");
312 args.push_back(
"-DSCORE_PLUGIN_AUDIO");
313 args.push_back(
"-DSCORE_PLUGIN_AUTOMATION");
314 args.push_back(
"-DSCORE_PLUGIN_CURVE");
315 args.push_back(
"-DSCORE_PLUGIN_DATAFLOW");
316 args.push_back(
"-DSCORE_PLUGIN_DEVICEEXPLORER");
317 args.push_back(
"-DSCORE_PLUGIN_ENGINE");
318 args.push_back(
"-DSCORE_PLUGIN_LIBRARY");
319 args.push_back(
"-DSCORE_PLUGIN_MAPPING");
320 args.push_back(
"-DSCORE_PLUGIN_MEDIA");
321 args.push_back(
"-DSCORE_PLUGIN_PROTOCOLS");
322 args.push_back(
"-DSCORE_PLUGIN_SCENARIO");
323 args.push_back(
"-DSCORE_PLUGIN_MIDI");
324 args.push_back(
"-DSCORE_PLUGIN_PROTOCOLS");
325 args.push_back(
"-DSCORE_PLUGIN_RECORDING");
326 args.push_back(
"-DSCORE_PLUGIN_TRANSPORT");
328 args.push_back(
"-DTINYSPLINE_DOUBLE_PRECISION");
329 args.push_back(
"-D_GNU_SOURCE=1");
330 args.push_back(
"-D__STDC_CONSTANT_MACROS");
331 args.push_back(
"-D__STDC_FORMAT_MACROS");
332 args.push_back(
"-D__STDC_LIMIT_MACROS");
333 #if defined(FFTW_SINGLE_ONLY)
334 args.push_back(
"-DFFTW_SINGLE_ONLY");
335 #elif defined(FFTW_DOUBLE_ONLY)
336 args.push_back(
"-DFFTW_DOUBLE_ONLY");
340 static inline auto getPotentialTriples()
342 std::vector<QString> triples;
343 triples.push_back(LLVM_DEFAULT_TARGET_TRIPLE);
344 triples.push_back(LLVM_HOST_TRIPLE);
345 #if defined(__x86_64__)
346 triples.push_back(
"x86_64-pc-linux-gnu");
347 #elif defined(__i686__)
348 triples.push_back(
"i686-pc-linux-gnu");
349 #elif defined(__i586__)
350 triples.push_back(
"i586-pc-linux-gnu");
351 #elif defined(__i486__)
352 triples.push_back(
"i486-pc-linux-gnu");
353 #elif defined(__i386__)
354 triples.push_back(
"i386-pc-linux-gnu");
355 #elif defined(__arm__)
356 triples.push_back(
"armv8-none-linux-gnueabi");
357 triples.push_back(
"armv8-pc-linux-gnueabi");
358 triples.push_back(
"armv8-none-linux-gnu");
359 triples.push_back(
"armv8-pc-linux-gnu");
360 triples.push_back(
"armv7-none-linux-gnueabi");
361 triples.push_back(
"armv7-pc-linux-gnueabi");
362 triples.push_back(
"armv7-none-linux-gnu");
363 triples.push_back(
"armv7-pc-linux-gnu");
364 triples.push_back(
"armv6-none-linux-gnueabi");
365 triples.push_back(
"armv6-pc-linux-gnueabi");
366 triples.push_back(
"armv6-none-linux-gnu");
367 triples.push_back(
"armv6-pc-linux-gnu");
368 #elif defined(__aarch64__)
369 triples.push_back(
"aarch64-none-linux-gnueabi");
370 triples.push_back(
"aarch64-pc-linux-gnueabi");
371 triples.push_back(
"aarch64-none-linux-gnu");
372 triples.push_back(
"aarch64-pc-linux-gnu");
416 static inline void populateIncludeDirs(std::vector<std::string>& args)
418 auto sdk = locateSDK();
419 auto qsdk = QString::fromStdString(sdk);
420 std::cerr <<
"\nLooking for sdk in: " << sdk <<
"\n";
421 qDebug() <<
"Looking for sdk in: " << qsdk;
423 bool sdk_found =
true;
427 if(!dir.cd(
"include") || !dir.cd(
"c++"))
429 qDebug() <<
"Unable to locate standard headers, fallback to /usr";
433 if(!dir.cd(
"include") || !dir.cd(
"c++"))
435 qDebug() <<
"Unable to locate standard headers++";
436 throw std::runtime_error(
"Unable to compile");
442 qDebug() <<
"SDK located: " << qsdk;
443 std::string llvm_lib_version = SCORE_LLVM_VERSION;
444 #if defined(__APPLE__) && SCORE_FHS_BUILD
445 llvm_lib_version =
"13.0.0";
448 QDir resDir = QString(qsdk +
"/lib/clang");
449 auto entries = resDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
450 if(!entries.empty() && !entries.contains(SCORE_LLVM_VERSION))
451 llvm_lib_version = entries.front().toStdString();
453 #if defined(__APPLE__) && SCORE_FHS_BUILD
454 std::string appleSharedSdk
455 =
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/"
457 args.push_back(
"-resource-dir");
458 args.push_back(appleSharedSdk +
"/lib/clang/" + llvm_lib_version);
460 args.push_back(
"-resource-dir");
461 args.push_back(sdk +
"/lib/clang/" + llvm_lib_version);
464 #if defined(_LIBCPP_VERSION)
465 args.push_back(
"-stdlib=libc++");
466 args.push_back(
"-internal-isystem");
468 #if defined(__APPLE__) && SCORE_FHS_BUILD
469 args.push_back(appleSharedSdk +
"/include/c++/v1");
471 args.push_back(sdk +
"/include/c++/v1");
474 #elif defined(_GLIBCXX_RELEASE)
478 const auto libstdcpp_major = QString::number(_GLIBCXX_RELEASE);
480 QDir cpp_dir{
"/usr/include/c++"};
482 QDirIterator cpp_it{cpp_dir};
483 while(cpp_it.hasNext())
486 auto ver = cpp_it.fileName();
487 if(!ver.isEmpty() && ver.startsWith(libstdcpp_major))
489 auto gcc = ver.toStdString();
492 args.push_back(
"-internal-isystem");
493 args.push_back(
"/usr/include/c++/" + gcc);
496 for(
auto& triple : getPotentialTriples())
498 if(cpp_dir.exists(triple))
501 args.push_back(
"-internal-isystem");
502 args.push_back(
"/usr/include/c++/" + gcc +
"/" + triple.toStdString());
513 #if defined(__APPLE__) && SCORE_FHS_BUILD
514 args.push_back(
"-internal-isystem");
515 args.push_back(appleSharedSdk +
"/lib/clang/" + llvm_lib_version +
"/include");
516 args.push_back(
"-internal-externc-isystem");
518 "/Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/"
519 "SDKs/MacOSX.sdk/usr/include");
521 args.push_back(
"-internal-isystem");
522 args.push_back(sdk +
"/lib/clang/" + llvm_lib_version +
"/include");
523 args.push_back(
"-internal-externc-isystem");
524 args.push_back(sdk +
"/include");
536 auto include = [&](
const std::string& path) {
537 args.push_back(
"-I" + sdk +
"/include/" + path);
540 #if defined(__linux__)
541 include(
"x86_64-linux-gnu");
544 QDirIterator qtVersionFolder{
545 qsdk +
"/include/qt/QtCore",
547 QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot,
549 std::string qt_version = QT_VERSION_STR;
550 if(qtVersionFolder.hasNext())
552 QDir sub = qtVersionFolder.next();
553 qt_version = sub.dirName().toStdString();
556 include(
"qt/QtCore");
557 include(
"qt/QtCore/" + qt_version);
558 include(
"qt/QtCore/" + qt_version +
"/QtCore");
560 include(
"qt/QtGui/" + qt_version);
561 include(
"qt/QtGui/" + qt_version +
"/QtGui");
562 include(
"qt/QtWidgets");
563 include(
"qt/QtWidgets/" + qt_version);
564 include(
"qt/QtWidgets/" + qt_version +
"/QtWidgets");
566 include(
"qt/QtQml/" + qt_version);
567 include(
"qt/QtQml/" + qt_version +
"/QtQml");
569 include(
"qt/QtNetwork");
572 include(
"qt/QtOpenGL");
573 include(
"qt/QtShaderTools");
574 include(
"qt/QtShaderTools/" + qt_version);
575 include(
"qt/QtShaderTools/" + qt_version +
"/QtShaderTools");
576 include(
"qt/QtSerialBus");
577 include(
"qt/QtSerialPort");
580 bool deploying =
true;
582 bool deploying =
false;
585 if(deploying && sdk_found)
591 auto src_include_dirs
592 = {
"/3rdparty/libossia/src",
593 "/3rdparty/libossia/3rdparty/boost_1_82_0",
594 "/3rdparty/libossia/3rdparty/nano-signal-slot/include",
595 "/3rdparty/libossia/3rdparty/spdlog/include",
596 "/3rdparty/libossia/3rdparty/brigand/include",
597 "/3rdparty/libossia/3rdparty/Flicks",
598 "/3rdparty/libossia/3rdparty/fmt/include",
599 "/3rdparty/libossia/3rdparty/readerwriterqueue",
600 "/3rdparty/libossia/3rdparty/concurrentqueue",
601 "/3rdparty/libossia/3rdparty/SmallFunction/smallfun/include",
602 "/3rdparty/libossia/3rdparty/websocketpp",
603 "/3rdparty/libossia/3rdparty/rapidjson/include",
604 "/3rdparty/libossia/3rdparty/libremidi/include",
605 "/3rdparty/libossia/3rdparty/oscpack",
606 "/3rdparty/libossia/3rdparty/rnd/include",
607 "/3rdparty/libossia/3rdparty/span/include",
608 "/3rdparty/libossia/3rdparty/tuplet/include",
609 "/3rdparty/libossia/3rdparty/unordered_dense/include",
610 "/3rdparty/libossia/3rdparty/multi_index/include",
611 "/3rdparty/libossia/3rdparty/verdigris/src",
612 "/3rdparty/libossia/3rdparty/weakjack",
613 "/3rdparty/avendish/include",
615 "/src/plugins/score-lib-state",
616 "/src/plugins/score-lib-device",
617 "/src/plugins/score-lib-process",
618 "/src/plugins/score-lib-inspector",
619 "/src/plugins/score-plugin-avnd",
620 "/src/plugins/score-plugin-gfx",
621 "/src/plugins/score-plugin-jit",
622 "/src/plugins/score-plugin-nodal",
623 "/src/plugins/score-plugin-remotecontrol",
624 "/src/plugins/score-plugin-audio",
625 "/src/plugins/score-plugin-curve",
626 "/src/plugins/score-plugin-dataflow",
627 "/src/plugins/score-plugin-engine",
628 "/src/plugins/score-plugin-scenario",
629 "/src/plugins/score-plugin-library",
630 "/src/plugins/score-plugin-deviceexplorer",
631 "/src/plugins/score-plugin-media",
632 "/src/plugins/score-plugin-loop",
633 "/src/plugins/score-plugin-midi",
634 "/src/plugins/score-plugin-protocols",
635 "/src/plugins/score-plugin-recording",
636 "/src/plugins/score-plugin-automation",
637 "/src/plugins/score-plugin-js",
638 "/src/plugins/score-plugin-mapping"};
640 for(
auto path : src_include_dirs)
642 args.push_back(
"-I" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
648 "/src/plugins/score-lib-state",
649 "/src/plugins/score-lib-device",
650 "/src/plugins/score-lib-process",
651 "/src/plugins/score-lib-inspector",
652 "/src/plugins/score-plugin-avnd",
653 "/src/plugins/score-plugin-gfx",
654 "/src/plugins/score-plugin-jit",
655 "/src/plugins/score-plugin-nodal",
656 "/src/plugins/score-plugin-remotecontrol",
657 "/src/plugins/score-plugin-audio",
658 "/src/plugins/score-plugin-curve",
659 "/src/plugins/score-plugin-dataflow",
660 "/src/plugins/score-plugin-engine",
661 "/src/plugins/score-plugin-scenario",
662 "/src/plugins/score-plugin-library",
663 "/src/plugins/score-plugin-deviceexplorer",
664 "/src/plugins/score-plugin-media",
665 "/src/plugins/score-plugin-loop",
666 "/src/plugins/score-plugin-midi",
667 "/src/plugins/score-plugin-protocols",
668 "/src/plugins/score-plugin-recording",
669 "/src/plugins/score-plugin-automation",
670 "/src/plugins/score-plugin-js",
671 "/src/plugins/score-plugin-mapping",
672 "/3rdparty/libossia/src"};
674 for(
auto path : src_build_dirs)
676 args.push_back(
"-I" + std::string(SCORE_ROOT_BINARY_DIR) + path);
Definition: LibrarySettings.hpp:46
T & settings() const
Access a specific Settings model instance.
Definition: ApplicationContext.hpp:40