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 <ciso646>
21 #include <iostream>
22 #include <string>
23 #include <vector>
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 
50 namespace Jit
51 {
52 
53 static 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 
125 static inline void
126 populateCompileOptions(std::vector<std::string>& args, CompilerOptions opts)
127 {
128  args.push_back("-triple");
129  args.push_back(llvm::sys::getDefaultTargetTriple());
130 
131  args.push_back("-target-cpu");
132  args.push_back(llvm::sys::getHostCPUName().lower());
133 
134  {
135  llvm::StringMap<bool> HostFeatures;
136  if(llvm::sys::getHostCPUFeatures(HostFeatures))
137  {
138  for(const llvm::StringMapEntry<bool>& F : HostFeatures)
139  {
140  args.push_back("-target-feature");
141  args.push_back((F.second ? "+" : "-") + F.first().str());
142  }
143  }
144  }
145 
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");
150  // disappeared in clang 11 args.push_back("-fuse-init-array");
151 
152  // args.push_back("-mrelocation-model");
153  // args.push_back("static");
154  args.push_back("-mthread-model");
155  args.push_back("posix");
156  // disappeared in clang 11 args.push_back("-masm-verbose");
157  args.push_back("-mconstructor-aliases");
158 
159  // args.push_back("-dwarf-column-info");
160  // args.push_back("-debugger-tuning=gdb");
161 
162  args.push_back("-fno-use-cxa-atexit");
163 
164  // -Ofast stuff:
165  // args.push_back("-menable-unsafe-fp-math");
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");
170 
171  // disappeared in clang 12 args.push_back("-fno-trapping-math");
172  args.push_back("-ffp-contract=fast");
173 
174 #if !defined(__linux__) // || (defined(__linux__) && __GLIBC_MINOR__ >= 31)
175  // isn't that great
176  // https://reviews.llvm.org/D74712
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");
182 #else
183  args.push_back("-O3");
184  args.push_back("-fno-builtin");
185 #endif
186 
187  // Prevent emitting ___chkstk_ms calls in alloca
188  args.push_back("-mno-stack-arg-probe");
189 
190  args.push_back("-fgnuc-version=4.2.1");
191 
192 #if defined(__APPLE__)
193  args.push_back("-fmax-type-align=16");
194 #endif
195  args.push_back("-mrelocation-model");
196  args.push_back("pic");
197  args.push_back("-pic-level");
198  args.push_back("2");
199  //args.push_back("-pic-is-pie");
200 
201  // changed from -fvisibility hidden to -fvisibility=hidden in clang 16
202  args.push_back("-fvisibility=hidden");
203 
204  args.push_back("-fvisibility-inlines-hidden");
205 
206  // // tls:
207  args.push_back("-ftls-model=local-exec");
208  // args.push_back("-fno-emulated-tls");
209 
210  // if fsanitize:
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__)
215  /*
216 
217  args.push_back(
218  "-fsanitize=address,alignment,array-bounds,bool,builtin,enum,float-cast-"
219  "overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-"
220  "attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-"
221  "base,shift-exponent,signed-integer-overflow,unreachable,vla-bound,vptr,"
222  "unsigned-integer-overflow,implicit-integer-truncation");
223  args.push_back(
224  "-fsanitize-recover=alignment,array-bounds,bool,builtin,enum,float-cast-"
225  "overflow,float-divide-by-zero,function,integer-divide-by-zero,nonnull-"
226  "attribute,null,pointer-overflow,returns-nonnull-attribute,shift-base,"
227  "shift-exponent,signed-integer-overflow,vla-bound,vptr,unsigned-integer-"
228  "overflow,implicit-integer-truncation");
229  args.push_back(
230  "-fsanitize-blacklist=/usr/lib/clang/7.0.0/share/asan_blacklist.txt");
231  args.push_back("-fsanitize-address-use-after-scope");
232  args.push_back("-mdisable-fp-elim");
233  */
234 #endif
235  args.push_back("-fno-assume-sane-operator-new");
236  // args.push_back("-fcoroutines-ts");
237  args.push_back("-stack-protector");
238  args.push_back("0");
239  if(opts.NoExceptions)
240  {
241  args.push_back("-fno-rtti");
242  }
243  else
244  {
245 #if LLVM_VERSION_MAJOR <= 13
246  args.push_back("-munwind-tables");
247 #endif
248 
249  args.push_back("-fcxx-exceptions");
250  args.push_back("-fexceptions");
251  args.push_back("-fexternc-nounwind");
252 #if defined(_WIN32)
253  args.push_back("-exception-model=seh");
254 #endif
255  }
256  args.push_back("-faddrsig");
257 
258  // args.push_back("-momit-leaf-frame-pointer");
259  args.push_back("-vectorize-loops");
260  args.push_back("-vectorize-slp");
261 }
262 
263 static inline void populateDefinitions(std::vector<std::string>& args)
264 {
265 #if defined(__APPLE__)
266  // needed because otherwise readerwriterqueue includes CoreFoundation.h ...
267  args.push_back("-DMOODYCAMEL_MAYBE_ALIGN_TO_CACHELINE=");
268 #endif
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");
287 
288  // TLS apparently not yet well supported by lljit :
289  // - undefined references to ___emutls_add_address
290  // - MachO TLV relocations not yet supported
291 #if __APPLE__
292  args.push_back("-DSPDLOG_NO_TLS=1");
293  args.push_back("-DMOODYCAMEL_NO_THREAD_LOCAL=1");
294 
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__");
298 #endif
299 
300 #if defined(SCORE_DEBUG)
301  args.push_back("-DSCORE_DEBUG");
302 #endif
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");
327  // args.push_back("-DSCORE_STATIC_PLUGINS");
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");
337 #endif
338 }
339 
340 static inline auto getPotentialTriples()
341 {
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");
373 #endif
374 
375  return triples;
376 }
416 static inline void populateIncludeDirs(std::vector<std::string>& args)
417 {
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;
422 
423  bool sdk_found = true;
424 
425  {
426  QDir dir(qsdk);
427  if(!dir.cd("include") || !dir.cd("c++"))
428  {
429  qDebug() << "Unable to locate standard headers, fallback to /usr";
430  qsdk = "/usr";
431  sdk = "/usr";
432  dir.setPath("/usr");
433  if(!dir.cd("include") || !dir.cd("c++"))
434  {
435  qDebug() << "Unable to locate standard headers++";
436  throw std::runtime_error("Unable to compile");
437  }
438  sdk_found = false;
439  }
440  }
441 
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";
446 #endif
447 
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();
452 
453 #if defined(__APPLE__) && SCORE_FHS_BUILD
454  std::string appleSharedSdk
455  = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/"
456  "usr";
457  args.push_back("-resource-dir");
458  args.push_back(appleSharedSdk + "/lib/clang/" + llvm_lib_version);
459 #else
460  args.push_back("-resource-dir");
461  args.push_back(sdk + "/lib/clang/" + llvm_lib_version);
462 #endif
463 
464 #if defined(_LIBCPP_VERSION)
465  args.push_back("-stdlib=libc++");
466  args.push_back("-internal-isystem");
467 
468 #if defined(__APPLE__) && SCORE_FHS_BUILD
469  args.push_back(appleSharedSdk + "/include/c++/v1");
470 #else
471  args.push_back(sdk + "/include/c++/v1");
472 #endif
473 
474 #elif defined(_GLIBCXX_RELEASE)
475  // Try to locate the correct libstdc++ folder
476  // TODO these are only heuristics. how to make them better ?
477  {
478  const auto libstdcpp_major = QString::number(_GLIBCXX_RELEASE);
479 
480  QDir cpp_dir{"/usr/include/c++"};
481  // Note: as this is only used for debugging we look in the host /usr
482  QDirIterator cpp_it{cpp_dir};
483  while(cpp_it.hasNext())
484  {
485  cpp_it.next();
486  auto ver = cpp_it.fileName();
487  if(!ver.isEmpty() && ver.startsWith(libstdcpp_major))
488  {
489  auto gcc = ver.toStdString();
490 
491  // e.g. /usr/include/c++/8.2.1
492  args.push_back("-internal-isystem");
493  args.push_back("/usr/include/c++/" + gcc);
494 
495  cpp_dir.cd(ver);
496  for(auto& triple : getPotentialTriples())
497  {
498  if(cpp_dir.exists(triple))
499  {
500  // e.g. /usr/include/c++/8.2.1/x86_64-pc-linux-gnu
501  args.push_back("-internal-isystem");
502  args.push_back("/usr/include/c++/" + gcc + "/" + triple.toStdString());
503  break;
504  }
505  }
506 
507  break;
508  }
509  }
510  }
511 #endif
512 
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");
517  args.push_back(
518  "/Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/"
519  "SDKs/MacOSX.sdk/usr/include");
520 #else
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");
525 #endif
526 
527  // -resource-dir
528  // /opt/score-sdk/llvm/lib/clang/11.0.0
529  // -internal-isystem
530  // /opt/score-sdk/llvm/bin/../include/c++/v1
531  // -internal-isystem
532  // /opt/score-sdk/llvm/lib/clang/11.0.0/include
533  //-internal-externc-isystem
535 
536  auto include = [&](const std::string& path) {
537  args.push_back("-I" + sdk + "/include/" + path);
538  };
539 
540 #if defined(__linux__)
541  include("x86_64-linux-gnu"); // #debian
542 #endif
543  // include(""); // /usr/include
544  QDirIterator qtVersionFolder{
545  qsdk + "/include/qt/QtCore",
546  {},
547  QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot,
548  {}};
549  std::string qt_version = QT_VERSION_STR;
550  if(qtVersionFolder.hasNext())
551  {
552  QDir sub = qtVersionFolder.next();
553  qt_version = sub.dirName().toStdString();
554  }
555  include("qt");
556  include("qt/QtCore");
557  include("qt/QtCore/" + qt_version);
558  include("qt/QtCore/" + qt_version + "/QtCore");
559  include("qt/QtGui");
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");
565  include("qt/QtQml");
566  include("qt/QtQml/" + qt_version);
567  include("qt/QtQml/" + qt_version + "/QtQml");
568  include("qt/QtXml");
569  include("qt/QtNetwork");
570  include("qt/QtSvg");
571  include("qt/QtSql");
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");
578 
579 #if !SCORE_FHS_BUILD
580  bool deploying = true;
581 #else
582  bool deploying = false;
583 #endif
584 
585  if(deploying && sdk_found)
586  {
587  include("score");
588  }
589  else
590  {
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",
614  "/src/lib",
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"};
639 
640  for(auto path : src_include_dirs)
641  {
642  args.push_back("-I" + std::string(SCORE_ROOT_SOURCE_DIR) + path);
643  }
644 
645  auto src_build_dirs
646  = {"/.",
647  "/src/lib",
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"};
673 
674  for(auto path : src_build_dirs)
675  {
676  args.push_back("-I" + std::string(SCORE_ROOT_BINARY_DIR) + path);
677  }
678  }
679 }
680 
681 }
Definition: LibrarySettings.hpp:46
T & settings() const
Access a specific Settings model instance.
Definition: ApplicationContext.hpp:40