Loading...
Searching...
No Matches
JitPlatform.hpp
1#pragma once
2#include <Library/LibrarySettings.hpp>
3
4#include <score/application/ApplicationContext.hpp>
5
6#include <QApplication>
7#include <QDebug>
8#include <QDir>
9#include <QDirIterator>
10
11#include <llvm/ADT/StringMap.h>
12#include <llvm/ADT/StringRef.h>
13
14#if LLVM_VERSION_MAJOR >= 17
15#include <llvm/TargetParser/Host.h>
16#else
17#include <llvm/Support/Host.h>
18#endif
19
20#include <iostream>
21#include <string>
22#include <vector>
23#include <version>
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>
28#endif
29
30#if defined(__has_feature)
31#if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
32#define __SANITIZE_ADDRESS__ 1
33#endif
34#endif
35
36#if defined(SCORE_FHS_BUILD)
37#define SCORE_USE_DISTRO_SYSROOT 1
38#else
39#if defined(SCORE_DEPLOYMENT_BUILD)
40#define SCORE_USE_DISTRO_SYSROOT 0
41#else
42#define SCORE_USE_DISTRO_SYSROOT 1
43#endif
44#endif
45
46#include <JitCpp/JitOptions.hpp>
47
48#include <score_git_info.hpp>
49
50namespace Jit
51{
52
53static inline std::string locateSDK()
54{
55 if(QString sdk = qgetenv("SCORE_JIT_SDK"); !sdk.isEmpty())
56 return sdk.toStdString();
57
58 auto& ctx = score::AppContext().settings<Library::Settings::Model>();
59 QString path = ctx.getSDKPath();
60
61 if(QString libPath = QStringLiteral("%1/%2/usr").arg(path).arg(SCORE_TAG_NO_V);
62 QDir(libPath + "/include/c++").exists())
63 {
64 return libPath.toStdString();
65 }
66
67 if(QString libPath = path + "/usr"; QDir(libPath + "/include/c++").exists())
68 {
69 return libPath.toStdString();
70 }
71
72 auto appFolder = qApp->applicationDirPath();
73
74#if !SCORE_FHS_BUILD
75
76#if defined(_WIN32)
77 {
78 QDir d{appFolder};
79 d.cd("sdk");
80 return d.absolutePath().toStdString();
81 }
82#elif defined(__linux__)
83 {
84 QDir d{appFolder};
85 d.cdUp();
86 d.cd("usr");
87 return d.absolutePath().toStdString();
88 }
89#elif defined(__APPLE__)
90 {
91 QDir d{appFolder};
92 d.cdUp();
93 if(d.cd("Frameworks"))
94 {
95 if(d.cd("Score.Framework"))
96 {
97 return d.absolutePath().toStdString();
98 }
99 }
100 auto framework = QString(appFolder + "/Score.Framework");
101 if(QDir{}.exists(framework))
102 return framework.toStdString();
103 else
104 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
105 "Developer/SDKs/MacOSX.sdk/usr";
106 }
107#endif
108
109#else
110#if defined(__APPLE__)
111 return "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
112 "Developer/SDKs/MacOSX.sdk/usr";
113#endif
114 if(QFileInfo("/usr/include/c++").isDir())
115 {
116 return "/usr";
117 }
118 else
119 {
120 return ctx.getSDKPath().toStdString();
121 }
122#endif
123}
124
126{
127 std::string path;
128 enum
129 {
130 none, // Nothing was found
131 platform, // Building against /usr/include, useful for dev builds
132 official // The SDK obtained from official score releases
133 } sdk_kind
134 = none;
135
136// Do we use the score source dir or the headers from the SDK
137#if !SCORE_FHS_BUILD
138 static constexpr bool deploying = true;
139#else
140 static constexpr bool deploying = false;
141#endif
142};
143
144inline located_sdk locateSDKWithFallback()
145{
146 located_sdk ret;
147 ret.path = locateSDK();
148 if(ret.path.empty())
149 ret.sdk_kind = located_sdk::none;
150 if(ret.path.starts_with("/usr") || ret.path.starts_with("/Applications"))
151 ret.sdk_kind = located_sdk::official;
152 else
153 ret.sdk_kind = located_sdk::platform;
154
155 {
156 QDir dir(QString::fromStdString(ret.path));
157 if(!dir.exists())
158 ret.sdk_kind = located_sdk::none;
159
160 if(!dir.cd("include") || !dir.cd("c++"))
161 {
162 qDebug() << "Unable to locate standard headers, fallback to /usr";
163 ret.path = "/usr";
164 dir.setPath("/usr");
165 if(!dir.cd("include") || !dir.cd("c++"))
166 {
167 qDebug() << "Unable to locate any standard headers, install C++ development "
168 "toolchain";
169 throw std::runtime_error("Unable to compile");
170 }
171 ret.sdk_kind = located_sdk::platform;
172 }
173 }
174 return ret;
175}
176
177static inline void
178populateCompileOptions(std::vector<std::string>& args, CompilerOptions opts)
179{
180 args.push_back("-triple");
181 args.push_back(llvm::sys::getProcessTriple());
182
183 args.push_back("-target-cpu");
184 args.push_back(llvm::sys::getHostCPUName().lower());
185
186 {
187 llvm::StringMap<bool> HostFeatures;
188#if LLVM_VERSION_MAJOR < 19
189 bool ok = llvm::sys::getHostCPUFeatures(HostFeatures);
190#else
191 constexpr bool ok = true;
192 HostFeatures = llvm::sys::getHostCPUFeatures();
193#endif
194 if(ok)
195 {
196 for(const llvm::StringMapEntry<bool>& F : HostFeatures)
197 {
198 args.push_back("-target-feature");
199 args.push_back((F.second ? "+" : "-") + F.first().str());
200 }
201 }
202 }
203
204 args.push_back("-std=c++23");
205 args.push_back("-disable-free");
206 args.push_back("-fdeprecated-macro");
207 args.push_back("-fmath-errno");
208 // disappeared in clang 11 args.push_back("-fuse-init-array");
209
210 // args.push_back("-mrelocation-model");
211 // args.push_back("static");
212 args.push_back("-mthread-model");
213 args.push_back("posix");
214 // disappeared in clang 11 args.push_back("-masm-verbose");
215 args.push_back("-mconstructor-aliases");
216
217 // args.push_back("-dwarf-column-info");
218 // args.push_back("-debugger-tuning=gdb");
219
220 args.push_back("-fno-use-cxa-atexit");
221
222 // -Ofast stuff:
223 // args.push_back("-menable-unsafe-fp-math");
224 args.push_back("-fno-signed-zeros");
225 args.push_back("-mreassociate");
226 args.push_back("-freciprocal-math");
227 args.push_back("-fno-rounding-math");
228
229 // disappeared in clang 12 args.push_back("-fno-trapping-math");
230 args.push_back("-ffp-contract=fast");
231
232#if !defined(__linux__) // || (defined(__linux__) && __GLIBC_MINOR__ >= 31)
233 // isn't that great
234 // https://reviews.llvm.org/D74712
235 args.push_back("-Ofast");
236 args.push_back("-menable-no-infs");
237 args.push_back("-menable-no-nans");
238 args.push_back("-ffinite-math-only");
239 args.push_back("-ffast-math");
240#else
241 args.push_back("-O3");
242 args.push_back("-fno-builtin");
243#endif
244
245 // Prevent emitting ___chkstk_ms calls in alloca
246 args.push_back("-mno-stack-arg-probe");
247
248 args.push_back("-fgnuc-version=4.2.1");
249
250#if defined(__APPLE__)
251 args.push_back("-fmax-type-align=16");
252#endif
253 args.push_back("-mrelocation-model");
254 args.push_back("pic");
255 args.push_back("-pic-level");
256 args.push_back("2");
257 //args.push_back("-pic-is-pie");
258
259 // changed from -fvisibility hidden to -fvisibility=hidden in clang 16
260 args.push_back("-fvisibility=hidden");
261
262 args.push_back("-fvisibility-inlines-hidden");
263
264 // // tls:
265 args.push_back("-ftls-model=local-exec");
266 args.push_back("-femulated-tls");
267
268 // if fsanitize:
269 args.push_back("-mrelax-all");
270 args.push_back("-disable-llvm-verifier");
271 args.push_back("-discard-value-names");
272#if defined(__SANITIZE_ADDRESS__)
273 /*
274
275 args.push_back(
276 "-fsanitize=address,alignment,array-bounds,bool,builtin,enum,float-cast-"
277 "overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-"
278 "attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-"
279 "base,shift-exponent,signed-integer-overflow,unreachable,vla-bound,vptr,"
280 "unsigned-integer-overflow,implicit-integer-truncation");
281 args.push_back(
282 "-fsanitize-recover=alignment,array-bounds,bool,builtin,enum,float-cast-"
283 "overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-"
284 "attribute,null,pointer-overflow,returns-nonnull-attribute,shift-base,"
285 "shift-exponent,signed-integer-overflow,vla-bound,vptr,unsigned-integer-"
286 "overflow,implicit-integer-truncation");
287 args.push_back(
288 "-fsanitize-blacklist=/usr/lib/clang/7.0.0/share/asan_blacklist.txt");
289 args.push_back("-fsanitize-address-use-after-scope");
290 args.push_back("-mdisable-fp-elim");
291 */
292#endif
293 args.push_back("-fno-assume-sane-operator-new");
294 // args.push_back("-fcoroutines-ts");
295 args.push_back("-stack-protector");
296 args.push_back("0");
297 if(opts.NoExceptions)
298 {
299 args.push_back("-fno-rtti");
300 }
301 else
302 {
303#if LLVM_VERSION_MAJOR <= 13
304 args.push_back("-munwind-tables");
305#endif
306
307 args.push_back("-fcxx-exceptions");
308 args.push_back("-fexceptions");
309 args.push_back("-fexternc-nounwind");
310#if defined(_WIN32)
311 args.push_back("-exception-model=seh");
312#endif
313 }
314 args.push_back("-faddrsig");
315
316 // args.push_back("-momit-leaf-frame-pointer");
317 args.push_back("-vectorize-loops");
318 args.push_back("-vectorize-slp");
319}
320
321static inline void populateDefinitions(std::vector<std::string>& args)
322{
323#if defined(__APPLE__)
324 // needed because otherwise readerwriterqueue includes CoreFoundation.h ...
325 args.push_back("-DMOODYCAMEL_MAYBE_ALIGN_TO_CACHELINE=");
326#endif
327#define XSTR(s) STR(s)
328#define STR(s) #s
329
330#if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
331 args.push_back("-DBOOST_ASIO_ENABLE_BUFFER_DEBUGGING");
332#endif
333#if defined(BOOST_ASIO_HAS_STD_INVOKE_RESULT)
334 args.push_back(
335 "-DBOOST_ASIO_HAS_STD_INVOKE_RESULT=" XSTR(BOOST_ASIO_HAS_STD_INVOKE_RESULT));
336#endif
337#if defined(BOOST_MATH_DISABLE_FLOAT128)
338 args.push_back("-DBOOST_MATH_DISABLE_FLOAT128=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
339#endif
340#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
341 args.push_back("-DBOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING");
342#endif
343#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
344 args.push_back("-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE");
345#endif
346#if defined(BOOST_NO_RTTI)
347 args.push_back("-DBOOST_NO_RTTI=" XSTR(BOOST_NO_RTTI));
348#endif
349#if defined(FMT_SHARED)
350 args.push_back("-DFMT_SHARED=" XSTR(FMT_SHARED));
351#endif
352#if defined(FMT_STATIC_THOUSANDS_SEPARATOR)
353 args.push_back(
354 "-DFMT_STATIC_THOUSANDS_SEPARATOR=" XSTR(FMT_STATIC_THOUSANDS_SEPARATOR));
355#endif
356#if defined(FMT_USE_FLOAT128)
357 args.push_back("-DFMT_USE_FLOAT128=" XSTR(FMT_USE_FLOAT128));
358#endif
359#if defined(FMT_USE_INT128)
360 args.push_back("-DFMT_USE_INT128=" XSTR(FMT_USE_INT128));
361#endif
362#if defined(FMT_USE_LONG_DOUBLE)
363 args.push_back("-DFMT_USE_LONG_DOUBLE=" XSTR(FMT_USE_LONG_DOUBLE));
364#endif
365#if defined(LIBREMIDI_ALSA)
366 args.push_back("-DLIBREMIDI_ALSA");
367#endif
368#if defined(LIBREMIDI_HAS_JACK_GET_VERSION)
369 args.push_back("-DLIBREMIDI_HAS_JACK_GET_VERSION");
370#endif
371#if defined(LIBREMIDI_HAS_UDEV)
372 args.push_back("-DLIBREMIDI_HAS_UDEV");
373#endif
374#if defined(LIBREMIDI_JACK)
375 args.push_back("-DLIBREMIDI_JACK");
376#endif
377#if defined(LIBREMIDI_KEYBOARD)
378 args.push_back("-DLIBREMIDI_KEYBOARD");
379#endif
380#if defined(LIBREMIDI_PIPEWIRE)
381 args.push_back("-DLIBREMIDI_PIPEWIRE");
382#endif
383#if defined(LIBREMIDI_PIPEWIRE_UMP)
384 args.push_back("-DLIBREMIDI_PIPEWIRE_UMP");
385#endif
386#if defined(LIBREMIDI_USE_BOOST)
387 args.push_back("-DLIBREMIDI_USE_BOOST");
388#endif
389#if defined(LIBREMIDI_WEAKJACK)
390 args.push_back("-DLIBREMIDI_WEAKJACK");
391#endif
392#if defined(QT_CORE_LIB)
393 args.push_back("-DQT_CORE_LIB");
394#endif
395#if defined(QT_DISABLE_DEPRECATED_BEFORE)
396 args.push_back("-DQT_DISABLE_DEPRECATED_BEFORE=" XSTR(QT_DISABLE_DEPRECATED_BEFORE));
397#endif
398#if defined(QT_GUI_LIB)
399 args.push_back("-DQT_GUI_LIB");
400#endif
401#if defined(QT_NETWORK_LIB)
402 args.push_back("-DQT_NETWORK_LIB");
403#endif
404#if defined(QT_NO_JAVA_STYLE_ITERATORS)
405 args.push_back("-DQT_NO_JAVA_STYLE_ITERATORS");
406#endif
407#if defined(QT_NO_KEYWORDS)
408 args.push_back("-DQT_NO_KEYWORDS");
409#endif
410#if defined(QT_NO_LINKED_LIST)
411 args.push_back("-DQT_NO_LINKED_LIST");
412#endif
413#if defined(QT_NO_NARROWING_CONVERSIONS_IN_CONNECT)
414 args.push_back("-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT");
415#endif
416#if defined(QT_NO_USING_NAMESPACE)
417 args.push_back("-DQT_NO_USING_NAMESPACE");
418#endif
419#if defined(QT_OPENGL_LIB)
420 args.push_back("-DQT_OPENGL_LIB");
421#endif
422#if defined(QT_QMLINTEGRATION_LIB)
423 args.push_back("-DQT_QMLINTEGRATION_LIB");
424#endif
425#if defined(QT_QML_LIB)
426 args.push_back("-DQT_QML_LIB");
427#endif
428#if defined(QT_SERIALPORT_LIB)
429 args.push_back("-DQT_SERIALPORT_LIB");
430#endif
431#if defined(QT_SHADERTOOLS_LIB)
432 args.push_back("-DQT_SHADERTOOLS_LIB");
433#endif
434#if defined(QT_STATEMACHINE_LIB)
435 args.push_back("-DQT_STATEMACHINE_LIB");
436#endif
437#if defined(QT_USE_QSTRINGBUILDER)
438 args.push_back("-DQT_USE_QSTRINGBUILDER");
439#endif
440#if defined(QT_WEBSOCKETS_LIB)
441 args.push_back("-DQT_WEBSOCKETS_LIB");
442#endif
443#if defined(QT_WIDGETS_LIB)
444 args.push_back("-DQT_WIDGETS_LIB");
445#endif
446#if defined(RAPIDJSON_HAS_STDSTRING)
447 args.push_back("-DRAPIDJSON_HAS_STDSTRING=" XSTR(RAPIDJSON_HAS_STDSTRING));
448#endif
449#if defined(SCORE_DEBUG)
450 args.push_back("-DSCORE_DEBUG");
451#endif
452#if defined(SCORE_LIB_BASE)
453 args.push_back("-DSCORE_LIB_BASE");
454#endif
455#if defined(SCORE_LIB_DEVICE)
456 args.push_back("-DSCORE_LIB_DEVICE");
457#endif
458#if defined(SCORE_LIB_INSPECTOR)
459 args.push_back("-DSCORE_LIB_INSPECTOR");
460#endif
461#if defined(SCORE_LIB_LOCALTREE)
462 args.push_back("-DSCORE_LIB_LOCALTREE");
463#endif
464#if defined(SCORE_LIB_PROCESS)
465 args.push_back("-DSCORE_LIB_PROCESS");
466#endif
467#if defined(SCORE_LIB_STATE)
468 args.push_back("-DSCORE_LIB_STATE");
469#endif
470#if defined(SCORE_PLUGIN_AUDIO)
471 args.push_back("-DSCORE_PLUGIN_AUDIO");
472#endif
473#if defined(SCORE_PLUGIN_AUTOMATION)
474 args.push_back("-DSCORE_PLUGIN_AUTOMATION");
475#endif
476#if defined(SCORE_PLUGIN_AVND)
477 args.push_back("-DSCORE_PLUGIN_AVND");
478#endif
479#if defined(SCORE_PLUGIN_CURVE)
480 args.push_back("-DSCORE_PLUGIN_CURVE");
481#endif
482#if defined(SCORE_PLUGIN_DATAFLOW)
483 args.push_back("-DSCORE_PLUGIN_DATAFLOW");
484#endif
485#if defined(SCORE_PLUGIN_DEVICEEXPLORER)
486 args.push_back("-DSCORE_PLUGIN_DEVICEEXPLORER");
487#endif
488#if defined(SCORE_PLUGIN_ENGINE)
489 args.push_back("-DSCORE_PLUGIN_ENGINE");
490#endif
491#if defined(SCORE_PLUGIN_GFX)
492 args.push_back("-DSCORE_PLUGIN_GFX");
493#endif
494#if defined(SCORE_PLUGIN_LIBRARY)
495 args.push_back("-DSCORE_PLUGIN_LIBRARY");
496#endif
497#if defined(SCORE_PLUGIN_MEDIA)
498 args.push_back("-DSCORE_PLUGIN_MEDIA");
499#endif
500#if defined(SCORE_PLUGIN_SCENARIO)
501 args.push_back("-DSCORE_PLUGIN_SCENARIO");
502#endif
503#if defined(SCORE_PLUGIN_TRANSPORT)
504 args.push_back("-DSCORE_PLUGIN_TRANSPORT");
505#endif
506#if defined(SERVUS_USE_AVAHI_CLIENT)
507 args.push_back("-DSERVUS_USE_AVAHI_CLIENT");
508#endif
509#if defined(SPDLOG_COMPILED_LIB)
510 args.push_back("-DSPDLOG_COMPILED_LIB=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
511#endif
512#if defined(SPDLOG_DEBUG_ON)
513 args.push_back("-DSPDLOG_DEBUG_ON=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
514#endif
515#if defined(SPDLOG_FMT_EXTERNAL)
516 args.push_back("-DSPDLOG_FMT_EXTERNAL=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
517#endif
518#if defined(SPDLOG_NO_DATETIME)
519 args.push_back("-DSPDLOG_NO_DATETIME=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
520#endif
521#if defined(SPDLOG_NO_NAME)
522 args.push_back("-DSPDLOG_NO_NAME=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
523#endif
524#if defined(SPDLOG_NO_THREAD_ID)
525 args.push_back("-DSPDLOG_NO_THREAD_ID=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
526#endif
527#if defined(SPDLOG_SHARED_LIB)
528 args.push_back("-DSPDLOG_SHARED_LIB=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
529#endif
530#if defined(SPDLOG_TRACE_ON)
531 args.push_back("-DSPDLOG_TRACE_ON=" XSTR(BOOST_MATH_DISABLE_FLOAT128));
532#endif
533#if defined(TINYSPLINE_DOUBLE_PRECISION)
534 args.push_back("-DTINYSPLINE_DOUBLE_PRECISION");
535#endif
536
537#if defined(SCORE_DEBUG)
538 args.push_back("-DSCORE_DEBUG");
539#endif
540
541 // args.push_back("-DSCORE_STATIC_PLUGINS");
542 args.push_back("-D_GNU_SOURCE=1");
543 args.push_back("-D__STDC_CONSTANT_MACROS");
544 args.push_back("-D__STDC_FORMAT_MACROS");
545 args.push_back("-D__STDC_LIMIT_MACROS");
546#if defined(FFTW_SINGLE_ONLY)
547 args.push_back("-DFFTW_SINGLE_ONLY");
548#elif defined(FFTW_DOUBLE_ONLY)
549 args.push_back("-DFFTW_DOUBLE_ONLY");
550#endif
551}
552
553static inline auto getPotentialTriples()
554{
555 std::vector<QString> triples;
556 triples.push_back(LLVM_DEFAULT_TARGET_TRIPLE);
557 triples.push_back(LLVM_HOST_TRIPLE);
558#if defined(__x86_64__)
559 triples.push_back("x86_64-pc-linux-gnu");
560 triples.push_back("x86_64-unknown-linux-gnu");
561#elif defined(__i686__)
562 triples.push_back("i686-pc-linux-gnu");
563#elif defined(__i586__)
564 triples.push_back("i586-pc-linux-gnu");
565#elif defined(__i486__)
566 triples.push_back("i486-pc-linux-gnu");
567#elif defined(__i386__)
568 triples.push_back("i386-pc-linux-gnu");
569#elif defined(__arm__)
570 triples.push_back("armv8-none-linux-gnueabi");
571 triples.push_back("armv8-pc-linux-gnueabi");
572 triples.push_back("armv8-none-linux-gnu");
573 triples.push_back("armv8-pc-linux-gnu");
574 triples.push_back("armv7-none-linux-gnueabi");
575 triples.push_back("armv7-pc-linux-gnueabi");
576 triples.push_back("armv7-none-linux-gnu");
577 triples.push_back("armv7-pc-linux-gnu");
578 triples.push_back("armv6-none-linux-gnueabi");
579 triples.push_back("armv6-pc-linux-gnueabi");
580 triples.push_back("armv6-none-linux-gnu");
581 triples.push_back("armv6-pc-linux-gnu");
582#elif defined(__aarch64__)
583 triples.push_back("aarch64-none-linux-gnueabi");
584 triples.push_back("aarch64-pc-linux-gnueabi");
585 triples.push_back("aarch64-unknown-linux-gnueabi");
586 triples.push_back("aarch64-none-linux-gnu");
587 triples.push_back("aarch64-pc-linux-gnu");
588 triples.push_back("aarch64-unknown-linux-gnu");
589 triples.push_back("aarch64-redhat-linux");
590#endif
591
592 return triples;
593}
633static inline void populateIncludeDirs(std::vector<std::string>& args)
634{
635 auto sdk_location = locateSDKWithFallback();
636 auto& sdk = sdk_location.path;
637 auto qsdk = QString::fromStdString(sdk);
638
639 qDebug() << "SDK located: " << qsdk;
640 std::string llvm_lib_version = SCORE_LLVM_VERSION;
641#if defined(__APPLE__) && SCORE_FHS_BUILD
642 llvm_lib_version = "13.0.0";
643#endif
644
645 QDir resDir = QString(qsdk + "/lib/clang");
646 auto entries = resDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
647 if(!entries.empty() && !entries.contains(SCORE_LLVM_VERSION))
648 llvm_lib_version = entries.front().toStdString();
649
650#if defined(__APPLE__) && SCORE_FHS_BUILD
651 std::string appleSharedSdk
652 = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/"
653 "usr";
654 args.push_back("-resource-dir");
655 args.push_back(appleSharedSdk + "/lib/clang/" + llvm_lib_version);
656#else
657 args.push_back("-resource-dir");
658 args.push_back(sdk + "/lib/clang/" + llvm_lib_version);
659#endif
660
661#if defined(_LIBCPP_VERSION)
662 args.push_back("-stdlib=libc++");
663 args.push_back("-internal-isystem");
664
665#if defined(__APPLE__) && SCORE_FHS_BUILD
666 args.push_back(appleSharedSdk + "/include/c++/v1");
667#else
668 args.push_back(sdk + "/include/c++/v1");
669#endif
670
671#elif defined(_GLIBCXX_RELEASE)
672 // Try to locate the correct libstdc++ folder
673 // TODO these are only heuristics. how to make them better ?
674 {
675 const auto libstdcpp_major = QString::number(_GLIBCXX_RELEASE);
676
677 QDir cpp_dir{"/usr/include/c++"};
678 // Note: as this is only used for debugging we look in the host /usr
679 QDirIterator cpp_it{cpp_dir};
680 while(cpp_it.hasNext())
681 {
682 cpp_it.next();
683 auto ver = cpp_it.fileName();
684 if(!ver.isEmpty() && ver.startsWith(libstdcpp_major))
685 {
686 auto gcc = ver.toStdString();
687
688 // e.g. /usr/include/c++/8.2.1
689 args.push_back("-internal-isystem");
690 args.push_back("/usr/include/c++/" + gcc);
691
692 cpp_dir.cd(ver);
693 for(auto& triple : getPotentialTriples())
694 {
695 if(cpp_dir.exists(triple))
696 {
697 // e.g. /usr/include/c++/8.2.1/x86_64-pc-linux-gnu
698 args.push_back("-internal-isystem");
699 args.push_back("/usr/include/c++/" + gcc + "/" + triple.toStdString());
700 break;
701 }
702 }
703
704 break;
705 }
706 }
707 }
708#endif
709
710#if defined(__APPLE__) && SCORE_FHS_BUILD
711 args.push_back("-internal-isystem");
712 args.push_back(appleSharedSdk + "/lib/clang/" + llvm_lib_version + "/include");
713 args.push_back("-internal-externc-isystem");
714 args.push_back(
715 "/Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/"
716 "SDKs/MacOSX.sdk/usr/include");
717#else
718 args.push_back("-internal-isystem");
719 args.push_back(sdk + "/lib/clang/" + llvm_lib_version + "/include");
720 args.push_back("-internal-externc-isystem");
721 args.push_back(sdk + "/include");
722#endif
723
724 // -resource-dir
725 // /opt/score-sdk/llvm/lib/clang/11.0.0
726 // -internal-isystem
727 // /opt/score-sdk/llvm/bin/../include/c++/v1
728 // -internal-isystem
729 // /opt/score-sdk/llvm/lib/clang/11.0.0/include
730 //-internal-externc-isystem
732
733 auto include = [&](const std::string& path) {
734 std::string path_to_include = sdk + "/include/" + path;
735 auto qpath = QString::fromStdString(path_to_include);
736 if(!QFileInfo{qpath}.isDir())
737 {
738 qDebug() << "Trying to include non-existent path: " << qpath;
739 }
740 else
741 {
742 args.push_back("-isystem" + sdk + "/include/" + path);
743 }
744 };
745
746#if defined(__linux__)
747// #debian
748#if defined(__x86_64__)
749 include("x86_64-linux-gnu");
750#else
751 include("aarch64-linux-gnu");
752#endif
753#endif
754
755 // include(""); // /usr/include
756 std::string qt_folder = "qt";
757 if(QFile::exists(qsdk + "/include/qt6/QtCore"))
758 qt_folder = "qt6";
759
760 QDirIterator qtVersionFolder{
761 qsdk + "/include/" + QString::fromStdString(qt_folder) + "/QtCore",
762 {},
763 QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot,
764 {}};
765 std::string qt_version = QT_VERSION_STR;
766 if(qtVersionFolder.hasNext())
767 {
768 QDir sub = qtVersionFolder.next();
769 qt_version = sub.dirName().toStdString();
770 }
771 include(qt_folder + "");
772 include(qt_folder + "/QtCore");
773 include(qt_folder + "/QtCore/" + qt_version);
774 include(qt_folder + "/QtCore/" + qt_version + "/QtCore");
775 include(qt_folder + "/QtGui");
776 include(qt_folder + "/QtGui/" + qt_version);
777 include(qt_folder + "/QtGui/" + qt_version + "/QtGui");
778 include(qt_folder + "/QtWidgets");
779 include(qt_folder + "/QtWidgets/" + qt_version);
780 include(qt_folder + "/QtWidgets/" + qt_version + "/QtWidgets");
781 include(qt_folder + "/QtQml");
782 include(qt_folder + "/QtQml/" + qt_version);
783 include(qt_folder + "/QtQml/" + qt_version + "/QtQml");
784 include(qt_folder + "/QtQuick");
785 include(qt_folder + "/QtQuick/" + qt_version);
786 include(qt_folder + "/QtQuick/" + qt_version + "/QtQuick");
787 include(qt_folder + "/QtXml");
788 include(qt_folder + "/QtNetwork");
789 include(qt_folder + "/QtSvg");
790 include(qt_folder + "/QtSql");
791 include(qt_folder + "/QtOpenGL");
792 include(qt_folder + "/QtShaderTools");
793 include(qt_folder + "/QtShaderTools/" + qt_version);
794 include(qt_folder + "/QtShaderTools/" + qt_version + "/QtShaderTools");
795 include(qt_folder + "/QtSerialPort");
796
797 if(sdk_location.sdk_kind == located_sdk::official && sdk_location.deploying)
798 {
799 include("score");
800 }
801 else
802 {
803 auto thirdparty_include_dirs = {
804 "/3rdparty/libossia/3rdparty/boost_1_88_0",
805 "/3rdparty/libossia/3rdparty/nano-signal-slot/include",
806 "/3rdparty/libossia/3rdparty/spdlog/include",
807 "/3rdparty/libossia/3rdparty/dr_libs",
808 "/3rdparty/libossia/3rdparty/Flicks",
809 "/3rdparty/libossia/3rdparty/fmt/include",
810 "/3rdparty/libossia/3rdparty/magic_enum/include",
811 "/3rdparty/libossia/3rdparty/readerwriterqueue",
812 "/3rdparty/libossia/3rdparty/concurrentqueue",
813 "/3rdparty/libossia/3rdparty/SmallFunction/smallfun/include",
814 "/3rdparty/libossia/3rdparty/websocketpp",
815 "/3rdparty/libossia/3rdparty/rapidjson/include",
816 "/3rdparty/libossia/3rdparty/libremidi/include",
817 "/3rdparty/libossia/3rdparty/oscpack",
818 "/3rdparty/libossia/3rdparty/rnd/include",
819 "/3rdparty/libossia/3rdparty/span/include",
820 "/3rdparty/libossia/3rdparty/tuplet/include",
821 "/3rdparty/libossia/3rdparty/unordered_dense/include",
822 "/3rdparty/libossia/3rdparty/multi_index/include",
823 "/3rdparty/libossia/3rdparty/verdigris/src",
824 "/3rdparty/libossia/3rdparty/weakjack",
825 };
826 for(auto path : thirdparty_include_dirs)
827 {
828 args.push_back("-isystem" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
829 }
830 auto src_include_dirs
831 = {"/3rdparty/libossia/src",
832 "/3rdparty/avendish/include",
833 "/src/lib",
834 "/src/plugins/score-lib-state",
835 "/src/plugins/score-lib-device",
836 "/src/plugins/score-lib-process",
837 "/src/plugins/score-lib-inspector",
838 "/src/plugins/score-plugin-avnd",
839 "/src/plugins/score-plugin-gfx",
840 "/src/plugins/score-plugin-jit",
841 "/src/plugins/score-plugin-nodal",
842 "/src/plugins/score-plugin-remotecontrol",
843 "/src/plugins/score-plugin-audio",
844 "/src/plugins/score-plugin-curve",
845 "/src/plugins/score-plugin-dataflow",
846 "/src/plugins/score-plugin-engine",
847 "/src/plugins/score-plugin-scenario",
848 "/src/plugins/score-plugin-library",
849 "/src/plugins/score-plugin-deviceexplorer",
850 "/src/plugins/score-plugin-media",
851 "/src/plugins/score-plugin-loop",
852 "/src/plugins/score-plugin-midi",
853 "/src/plugins/score-plugin-protocols",
854 "/src/plugins/score-plugin-recording",
855 "/src/plugins/score-plugin-automation",
856 "/src/plugins/score-plugin-js",
857 "/src/plugins/score-plugin-mapping"};
858
859 for(auto path : src_include_dirs)
860 {
861 args.push_back("-I" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
862 }
863
864 auto src_build_dirs
865 = {"/.",
866 "/src/lib",
867 "/src/plugins/score-lib-state",
868 "/src/plugins/score-lib-device",
869 "/src/plugins/score-lib-process",
870 "/src/plugins/score-lib-inspector",
871 "/src/plugins/score-plugin-avnd",
872 "/src/plugins/score-plugin-gfx",
873 "/src/plugins/score-plugin-jit",
874 "/src/plugins/score-plugin-nodal",
875 "/src/plugins/score-plugin-remotecontrol",
876 "/src/plugins/score-plugin-audio",
877 "/src/plugins/score-plugin-curve",
878 "/src/plugins/score-plugin-dataflow",
879 "/src/plugins/score-plugin-engine",
880 "/src/plugins/score-plugin-scenario",
881 "/src/plugins/score-plugin-library",
882 "/src/plugins/score-plugin-deviceexplorer",
883 "/src/plugins/score-plugin-media",
884 "/src/plugins/score-plugin-loop",
885 "/src/plugins/score-plugin-midi",
886 "/src/plugins/score-plugin-protocols",
887 "/src/plugins/score-plugin-recording",
888 "/src/plugins/score-plugin-automation",
889 "/src/plugins/score-plugin-js",
890 "/src/plugins/score-plugin-mapping",
891 "/3rdparty/libossia/src"};
892
893 for(auto path : src_build_dirs)
894 {
895 args.push_back("-I" + std::string(SCORE_ROOT_BINARY_DIR) + path);
896 }
897 }
898}
899
900}
Definition LibrarySettings.hpp:46
Definition JitPlatform.hpp:126
T & settings() const
Access a specific Settings model instance.
Definition ApplicationContext.hpp:40