nob_macos.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // TODO: confirm that MacOS build works on MacOS
  2. #define MUSIALIZER_TARGET_NAME "macos"
  3. bool build_musializer(void)
  4. {
  5. bool result = true;
  6. Nob_Cmd cmd = {0};
  7. Nob_Procs procs = {0};
  8. #ifdef MUSIALIZER_HOTRELOAD
  9. procs.count = 0;
  10. cmd.count = 0;
  11. // TODO: add a way to replace `cc` with something else GCC compatible on POSIX
  12. // Like `clang` for instance
  13. nob_cmd_append(&cmd, "clang");
  14. nob_cmd_append(&cmd, "-Wall", "-Wextra", "-g");
  15. nob_cmd_append(&cmd, "-I.");
  16. nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/");
  17. nob_cmd_append(&cmd, "-fPIC", "-shared");
  18. nob_cmd_append(&cmd, "-o", "./build/libplug.dylib");
  19. nob_cmd_append(&cmd,
  20. "./src/plug.c",
  21. "./src/ffmpeg_linux.c");
  22. nob_cmd_append(&cmd, "./build/raylib/macos/libraylib.dylib");
  23. nob_cmd_append(&cmd, "-lm", "-ldl", "-lpthread");
  24. nob_da_append(&procs, nob_cmd_run_async(cmd));
  25. cmd.count = 0;
  26. nob_cmd_append(&cmd, "clang");
  27. nob_cmd_append(&cmd, "-Wall", "-Wextra", "-g");
  28. nob_cmd_append(&cmd, "-I.");
  29. nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/");
  30. nob_cmd_append(&cmd, "-o", "./build/musializer");
  31. nob_cmd_append(&cmd,
  32. "./src/musializer.c",
  33. "./src/hotreload_posix.c");
  34. nob_cmd_append(&cmd, "./build/raylib/macos/libraylib.dylib");
  35. nob_cmd_append(&cmd, "-lm", "-ldl", "-lpthread");
  36. nob_cmd_append(&cmd, "-rpath", "./build");
  37. nob_cmd_append(&cmd, "-rpath", "./build/raylib/macos");
  38. nob_cmd_append(&cmd, "-rpath", "./");
  39. nob_cmd_append(&cmd, "-rpath", "./raylib/macos");
  40. nob_da_append(&procs, nob_cmd_run_async(cmd));
  41. if (!nob_procs_wait(procs)) nob_return_defer(false);
  42. #else
  43. cmd.count = 0;
  44. nob_cmd_append(&cmd, "clang");
  45. nob_cmd_append(&cmd, "-Wall", "-Wextra", "-g");
  46. nob_cmd_append(&cmd, "-I.");
  47. nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/");
  48. nob_cmd_append(&cmd, "-o", "./build/musializer");
  49. nob_cmd_append(&cmd,
  50. "./src/plug.c",
  51. "./src/ffmpeg_linux.c",
  52. "./src/musializer.c");
  53. nob_cmd_append(&cmd, "./build/raylib/macos/libraylib.a");
  54. nob_cmd_append(&cmd, "-framework", "CoreVideo");
  55. nob_cmd_append(&cmd, "-framework", "IOKit");
  56. nob_cmd_append(&cmd, "-framework", "Cocoa");
  57. nob_cmd_append(&cmd, "-framework", "GLUT");
  58. nob_cmd_append(&cmd, "-framework", "OpenGL");
  59. nob_cmd_append(&cmd, "-lm", "-ldl", "-lpthread");
  60. if (!nob_cmd_run_sync(cmd)) nob_return_defer(false);
  61. #endif // MUSIALIZER_HOTRELOAD
  62. defer:
  63. nob_cmd_free(cmd);
  64. nob_da_free(procs);
  65. return result;
  66. }
  67. bool build_raylib(void)
  68. {
  69. bool result = true;
  70. Nob_Cmd cmd = {0};
  71. Nob_File_Paths object_files = {0};
  72. if (!nob_mkdir_if_not_exists("./build/raylib")) {
  73. nob_return_defer(false);
  74. }
  75. Nob_Procs procs = {0};
  76. const char *build_path = nob_temp_sprintf("./build/raylib/%s", MUSIALIZER_TARGET_NAME);
  77. if (!nob_mkdir_if_not_exists(build_path)) {
  78. nob_return_defer(false);
  79. }
  80. for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) {
  81. const char *input_path = nob_temp_sprintf("./raylib/raylib-"RAYLIB_VERSION"/src/%s.c", raylib_modules[i]);
  82. const char *output_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]);
  83. nob_da_append(&object_files, output_path);
  84. if (nob_needs_rebuild(output_path, &input_path, 1)) {
  85. cmd.count = 0;
  86. nob_cmd_append(&cmd, "clang");
  87. nob_cmd_append(&cmd, "-g", "-DPLATFORM_DESKTOP", "-fPIC", "-DSUPPORT_FILEFORMAT_FLAC=1");
  88. nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/external/glfw/include");
  89. nob_cmd_append(&cmd, "-Iexternal/glfw/deps/ming");
  90. nob_cmd_append(&cmd, "-DGRAPHICS_API_OPENGL_33");
  91. if(strcmp(raylib_modules[i], "rglfw") == 0) {
  92. nob_cmd_append(&cmd, "-x", "objective-c");
  93. }
  94. nob_cmd_append(&cmd, "-c", input_path);
  95. nob_cmd_append(&cmd, "-o", output_path);
  96. Nob_Proc proc = nob_cmd_run_async(cmd);
  97. nob_da_append(&procs, proc);
  98. }
  99. }
  100. cmd.count = 0;
  101. if (!nob_procs_wait(procs)) nob_return_defer(false);
  102. #ifndef MUSIALIZER_HOTRELOAD
  103. const char *libraylib_path = nob_temp_sprintf("%s/libraylib.a", build_path);
  104. if (nob_needs_rebuild(libraylib_path, object_files.items, object_files.count)) {
  105. nob_cmd_append(&cmd, "ar", "-crs", libraylib_path);
  106. for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) {
  107. const char *input_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]);
  108. nob_cmd_append(&cmd, input_path);
  109. }
  110. if (!nob_cmd_run_sync(cmd)) nob_return_defer(false);
  111. }
  112. #else
  113. const char *libraylib_path = nob_temp_sprintf("%s/libraylib.dylib", build_path);
  114. if (nob_needs_rebuild(libraylib_path, object_files.items, object_files.count)) {
  115. nob_cmd_append(&cmd, "cc");
  116. nob_cmd_append(&cmd, "-shared", "-fPIC");
  117. nob_cmd_append(&cmd, "-framework", "CoreVideo");
  118. nob_cmd_append(&cmd, "-framework", "IOKit");
  119. nob_cmd_append(&cmd, "-framework", "Cocoa");
  120. nob_cmd_append(&cmd, "-framework", "GLUT");
  121. nob_cmd_append(&cmd, "-framework", "OpenGL");
  122. nob_cmd_append(&cmd, "-install_name", "@rpath/libraylib.dylib");
  123. nob_cmd_append(&cmd, "-o", libraylib_path);
  124. for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) {
  125. const char *input_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]);
  126. nob_cmd_append(&cmd, input_path);
  127. }
  128. if (!nob_cmd_run_sync(cmd)) nob_return_defer(false);
  129. }
  130. #endif // MUSIALIZER_HOTRELOAD
  131. defer:
  132. nob_cmd_free(cmd);
  133. nob_da_free(object_files);
  134. return result;
  135. }
  136. bool build_dist(void)
  137. {
  138. #ifdef MUSIALIZER_HOTRELOAD
  139. nob_log(NOB_ERROR, "We do not ship with hotreload enabled");
  140. return false;
  141. #else
  142. nob_log(NOB_ERROR, "TODO: Creating distro for MacOS build is not implemented yet");
  143. return false;
  144. #endif // MUSIALIZER_HOTRELOAD
  145. }