{"id":7753,"date":"2026-06-05T16:46:33","date_gmt":"2026-06-05T21:46:33","guid":{"rendered":"https:\/\/www.logikalsolutions.com\/wordpress\/?p=7753"},"modified":"2026-06-05T16:46:33","modified_gmt":"2026-06-05T21:46:33","slug":"xmake","status":"publish","type":"post","link":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/","title":{"rendered":"Xmake tutorial &#8211; Pt. 001"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I found Xmake looking to replace CMake scripts that <a href=\"https:\/\/www.copperspice.com\">CopperSpice<\/a> used. I mean, when one has to use three different search engines to look up a function before you can find it . . . Then you are told it is undocumented for internal use only . . . Not something one wants to see in production code!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Regular readers have seen me write about CopperSpice, CMake, and <a href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/rpath\/\">general hacks found in legacy toolchains<\/a>. CMake is immensely convoluted and seriously bloated. I tried VCPKG but it came up short. Well, it came up immensely short in platform support. It has the classic Microsoft problem &#8211; only wanting to support what built and shipped 15 minutes ago. When I tried to support Ubuntu 18.04 vcpkg failed spectacularly. Nothing in the repos went back that far.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the medical device world we can have twenty-plus year hermetically sealed development environments. It&#8217;s only been like the last five years that Harman stopped calling about a medical device for heart patients using OS\/2 and Qt 3.x. Once you get through your FDA 510K you avoid another one at all costs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Broad hardware and OS support<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I don&#8217;t read or do much Lua programming. It seems to be kind of &#8220;everywhere&#8221; and nowhere. I mean it is part of the <a href=\"https:\/\/scintilla.org\">Scintilla<\/a> library that is the core for <a href=\"https:\/\/texteditors.org\/cgi-bin\/wiki.pl?ScintillaEditorFamily\">a long list of editors<\/a>. Just visit <a href=\"https:\/\/github.com\/xmake-io\/xmake\">this Xmake page<\/a> and check out the long list of supported operating systems and CPUs. They even support i386 Linux. When I asked I was told they actively support Windows 7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Laugh all you want. There are hospitals and doctor offices running Windows XP. Upgrading the desktop OS for your medical records system is high risk in the ER. You have very little warning when a cart with a patient will be crashing through the door.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">hello_glib.cpp<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everybody needs a &#8220;hello world!&#8221;.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Deja-Vu-Mono.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1f1f1f\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;iostream>\n#include &lt;glib.h>\n\nint main(int argc, char** argv) \n{\n     GString *str1 = g_string_new(\"Hello world!\");\n     \n     std::cout &lt;&lt; str1->str &lt;&lt; std::endl;\n     \n     g_string_free( str1, TRUE);\n     return 0;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">#include<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">#include<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&lt;glib.h&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">int<\/span><span style=\"color: #B392F0\"> main(<\/span><span style=\"color: #F97583\">int<\/span><span style=\"color: #B392F0\"> argc<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">char**<\/span><span style=\"color: #B392F0\"> argv) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     GString <\/span><span style=\"color: #F97583\">*<\/span><span style=\"color: #B392F0\">str1 <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> g_string_new(<\/span><span style=\"color: #FFAB70\">&quot;Hello world!&quot;<\/span><span style=\"color: #B392F0\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     std<\/span><span style=\"color: #BBBBBB\">::<\/span><span style=\"color: #B392F0\">cout <\/span><span style=\"color: #F97583\">&lt;&lt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">str1<\/span><span style=\"color: #BBBBBB\">-&gt;<\/span><span style=\"color: #B392F0\">str <\/span><span style=\"color: #F97583\">&lt;&lt;<\/span><span style=\"color: #B392F0\"> std<\/span><span style=\"color: #BBBBBB\">::<\/span><span style=\"color: #B392F0\">endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     g_string_free( str1<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> TRUE);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">0<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, more work than it needs to be, but eventually <a href=\"https:\/\/sourceforge.net\/p\/basisdoctrina\/code\/ci\/master\/tree\/\">BasisDoctrina<\/a> will be using SDL3 which uses Glib. Well, technically the baby steps I have coded now use them, but I want to dump CMake before I get painted into a corner. I&#8217;m also very excited about the XPack part of Xmake. Debian and RPM packages &#8220;automatically&#8221; or so the pitch is. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">xmake.lua<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One trend in today&#8217;s, well, really even yesterday&#8217;s packaging tools is needing a hard coded file name. Xmake at least gives you a way around this.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Deja-Vu-Mono.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1f1f1f\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>add_rules(\"mode.debug\", \"mode.release\")\n\nset_languages(\"c++17\", \"c11\")\n\nadd_requires(\"glib\", {configs = {shared = true}})\n\ntarget(\"h_g\")\n    set_kind(\"binary\")\n    add_files(\"*.cpp\")\n    add_packages(\"glib\")\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">add_rules(<\/span><span style=\"color: #FFAB70\">&quot;mode.debug&quot;<\/span><span style=\"color: #B392F0\">, <\/span><span style=\"color: #FFAB70\">&quot;mode.release&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">set_languages(<\/span><span style=\"color: #FFAB70\">&quot;c++17&quot;<\/span><span style=\"color: #B392F0\">, <\/span><span style=\"color: #FFAB70\">&quot;c11&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">add_requires(<\/span><span style=\"color: #FFAB70\">&quot;glib&quot;<\/span><span style=\"color: #B392F0\">, {configs <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> {shared <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">true<\/span><span style=\"color: #B392F0\">}})<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">target(<\/span><span style=\"color: #FFAB70\">&quot;h_g&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    set_kind(<\/span><span style=\"color: #FFAB70\">&quot;binary&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    add_files(<\/span><span style=\"color: #FFAB70\">&quot;*.cpp&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    add_packages(<\/span><span style=\"color: #FFAB70\">&quot;glib&quot;<\/span><span style=\"color: #B392F0\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">You have decisions to make here. I did the straight forward add_requires() and add_packages(). The first comes into play when your project is being configured. The second is tied to the target itself. I wanted to dump maintaining dependency.sh scripts to install a whack-a-mole listed of dependencies. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check out <a href=\"https:\/\/xmake.io\/api\/description\/global-interfaces.html#add-requires\">the doc for add_requires()<\/a> because you can turn off checking for system installed versions. <strong>Don&#8217;t trust any AI generated answers about xmake&#8217;s system = false<\/strong> in your dependency line. Here is a snippet from the official doc.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package(\"myzlib\")\n     set_base(\"zlib\")\n     set_urls(\"https:\/\/github.com\/madler\/zlib.git\")\npackage_end()\n\nadd_requires(\"myzlib\", {system = false, alias = \"zlib\"})\n\ntarget(\"test\")\n     set_kind(\"binary\")\n     add_files(\"src\/*.c\")\n     add_packages(\"zlib\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you don&#8217;t override with your own package it will look in Xrepo for the dependency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Word of caution!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Xmake supports using CMake, Vcpkg and other things. When things aren&#8217;t in Xrepo it will go looking in the other package managers it knows about. Always use the <a href=\"https:\/\/xmake.microblock.cc\">browser interface to search the package repo<\/a> before you ASS-U-ME &#8220;it&#8217;s in there.&#8221; You can put yourself in a world of hurt if, say, it was pulling from Vcpkg repos, but had network issue so pulled a completely different version from CMake packages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Building<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you just cd to your project root and type xmake then hit return, xmake will pollute your source tree. It will create a build directory tree and a .xmake directory tree. Y&#8217;all know what happens. Nobody adds these to the gitignore list so now you have a shit-ton of binaries and build artifacts uploaded to your text based code management system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Personally I cannot understand this younger generation&#8217;s fascination with building in the project source tree. It is a recipe for catastrophe. Even NanoGUI does this. I love NanoGUI, but, come on guys!<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Deja-Vu-Mono.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1f1f1f\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#\necho \"MUST BE RUN FROM ROOT OF PROJECT DIRECTORY TREE\"\necho \" \"\necho \"This will delete existing local build or release \"\necho \"directories and create new ones. It will then prep \"\necho \"the build directory for a ninja build. Finally it \"\necho \"will perform the actual build.\"\n\nTIME_STARTED=$( date '+%F_%H:%M:%S' )\n\n#  Step 1 : Establish fresh clean directories\n#\n# xmake has bug where it cannot expand directory paths. \n#\necho \"*** Establishing fresh directories\"\nSCRIPT_DIR=\"$PWD\"\nBUILD_DIR=$(readlink -m \"$SCRIPT_DIR\/..\/h_g_local_build\")\nRELEASE_DIR=$(readlink -m \"$SCRIPT_DIR\/..\/h_g_local_release\")\n\necho \"SCRIPT_DIR        $SCRIPT_DIR\"\necho \"BUILD_DIR         $BUILD_DIR\"\necho \"RELEASE_DIR       $RELEASE_DIR\"\n\n#  Step 2 : Fresh directories\n#\nif &#91; -d \"$BUILD_DIR\" &#93;; then\n   rm -rf \"$BUILD_DIR\"\nfi\n\nif &#91; -d \"$RELEASE_DIR\" &#93;; then\n   rm -rf \"$RELEASE_DIR\"\nfi\n\n#  create the directories we will use so they are fresh and clean\n#\nmkdir -p \"$BUILD_DIR\"\nmkdir -p \"$RELEASE_DIR\"\n\n#\n\n#  Step 3 : configure build\n#\ncd \"$BUILD_DIR\"\n\nCORES=$(lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l)\nJOBS=$((CORES-1))\n\necho \"Found $CORES cores so setting job count to $JOBS\"\n\n\n# if you want to see verbose debug information add -vD to this line.\n# Yes, vd is an incredibly poor choice.\n#\nCONFIG_STARTED=$( date '+%F_%H:%M:%S' )\nxmake config --yes --file=\"$SCRIPT_DIR\/xmake.lua\" -P \"$BUILD_DIR\" -o \"$RELEASE_DIR\" \nCONFIG_COMPLETED=$( date '+%F_%H:%M:%S' )\n\n# Step 4 : Build and install\necho \"*** Building h_g Local\"\n\nBUILD_STARTED=$( date '+%F_%H:%M:%S' )\nxmake --jobs=$JOBS \nBUILD_COMPLETED=$( date '+%F_%H:%M:%S' )\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;MUST BE RUN FROM ROOT OF PROJECT DIRECTORY TREE&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot; &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;This will delete existing local build or release &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;directories and create new ones. It will then prep &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;the build directory for a ninja build. Finally it &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;will perform the actual build.&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">TIME_STARTED<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$( <\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #FFAB70\"> &#39;+%F_%H:%M:%S&#39; )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#  Step 1 : Establish fresh clean directories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\"># xmake has bug where it cannot expand directory paths. <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;*** Establishing fresh directories&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">SCRIPT_DIR<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">&quot;$PWD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">BUILD_DIR<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$(<\/span><span style=\"color: #B392F0\">readlink<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-m<\/span><span style=\"color: #FFAB70\"> &quot;$SCRIPT_DIR\/..\/h_g_local_build&quot;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">RELEASE_DIR<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$(<\/span><span style=\"color: #B392F0\">readlink<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-m<\/span><span style=\"color: #FFAB70\"> &quot;$SCRIPT_DIR\/..\/h_g_local_release&quot;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;SCRIPT_DIR        $SCRIPT_DIR&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;BUILD_DIR         $BUILD_DIR&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;RELEASE_DIR       $RELEASE_DIR&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#  Step 2 : Fresh directories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> &#91; <\/span><span style=\"color: #F97583\">-d<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$BUILD_DIR&quot;<\/span><span style=\"color: #B392F0\"> &#93;; <\/span><span style=\"color: #F97583\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">   rm <\/span><span style=\"color: #9DB1C5\">-rf<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$BUILD_DIR&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> &#91; <\/span><span style=\"color: #F97583\">-d<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$RELEASE_DIR&quot;<\/span><span style=\"color: #B392F0\"> &#93;; <\/span><span style=\"color: #F97583\">then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">   rm <\/span><span style=\"color: #9DB1C5\">-rf<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$RELEASE_DIR&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">fi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#  create the directories we will use so they are fresh and clean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">mkdir <\/span><span style=\"color: #9DB1C5\">-p<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$BUILD_DIR&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">mkdir <\/span><span style=\"color: #9DB1C5\">-p<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$RELEASE_DIR&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#  Step 3 : configure build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">cd <\/span><span style=\"color: #FFAB70\">&quot;$BUILD_DIR&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">CORES<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$(<\/span><span style=\"color: #B392F0\">lscpu<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-b<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-p=Core,Socket<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #F97583\">|<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #B392F0\">grep<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-v<\/span><span style=\"color: #FFAB70\"> &#39;^#&#39; <\/span><span style=\"color: #F97583\">|<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #B392F0\">sort<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-u<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #F97583\">|<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #B392F0\">wc<\/span><span style=\"color: #FFAB70\"> <\/span><span style=\"color: #9DB1C5\">-l<\/span><span style=\"color: #FFAB70\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">JOBS<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #9DB1C5\">$((CORES<\/span><span style=\"color: #F97583\">-<\/span><span style=\"color: #F8F8F8\">1<\/span><span style=\"color: #9DB1C5\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;Found $CORES cores so setting job count to $JOBS&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\"># if you want to see verbose debug information add -vD to this line.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\"># Yes, vd is an incredibly poor choice.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">CONFIG_STARTED<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$( <\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #FFAB70\"> &#39;+%F_%H:%M:%S&#39; )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">xmake <\/span><span style=\"color: #9DB1C5\">config<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">--yes<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">--file=<\/span><span style=\"color: #FFAB70\">&quot;$SCRIPT_DIR\/xmake.lua&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">-P<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$BUILD_DIR&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">-o<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&quot;$RELEASE_DIR&quot;<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">CONFIG_COMPLETED<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$( <\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #FFAB70\"> &#39;+%F_%H:%M:%S&#39; )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\"># Step 4 : Build and install<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">echo <\/span><span style=\"color: #FFAB70\">&quot;*** Building h_g Local&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">BUILD_STARTED<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$( <\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #FFAB70\"> &#39;+%F_%H:%M:%S&#39; )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">xmake <\/span><span style=\"color: #9DB1C5\">--jobs=$JOBS<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">BUILD_COMPLETED<\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #FFAB70\">$( <\/span><span style=\"color: #B392F0\">date<\/span><span style=\"color: #FFAB70\"> &#39;+%F_%H:%M:%S&#39; )<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Xmake has a <a href=\"https:\/\/xmake.io\/guide\/extras\/environment-variables.html\">list of supported environment variables<\/a>. <em>Never set them<\/em>. I spent days slamming my head against the keyboard trying to use XMAKE_PKG_CACHEDIR. The code in Xmake which checks for dependency dependencies doesn&#8217;t honor that variable. If I just did xmake from the command line my project built and ran. If I had this shell script pointing to a different directory for cache it failed trying to retrieve and build glib. None of the glib dependencies were downloaded into that new cache. It couldn&#8217;t find any header files it needed to compile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">First build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your first build will take a long time if you have a big dependency like glib. One real downside (which I reported) is the xmake config step does not have &#8211;jobs=N. That&#8217;s where the mother-humping workload is and it defaults to maxing out your machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Secondary builds run like this<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Deja-Vu-Mono.ttf\" style=\"font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1f1f1f\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>developer@u24mateDell:~\/sf_projects\/hello_glib$ .\/build_h_g.sh \nMUST BE RUN FROM ROOT OF PROJECT DIRECTORY TREE\n \nThis will delete existing local build or release \ndirectories and create new ones. It will then prep \nthe build directory for a ninja build. Finally it \nwill perform the actual build.\n*** Establishing fresh directories\nSCRIPT_DIR        \/home\/developer\/sf_projects\/hello_glib\nBUILD_DIR         \/home\/developer\/sf_projects\/h_g_local_build\nRELEASE_DIR       \/home\/developer\/sf_projects\/h_g_local_release\nFound 5 cores so setting job count to 4\nchecking for platform ... linux (x86_64)\n*** Building h_g Local\n&#91; 23%&#93;: &lt;h_g> cache compiling.release hello_glib.cpp\n&#91; 47%&#93;: &lt;h_g> linking.release h_g\n&#91;100%&#93;: build ok, spent 0.591s\ndeveloper@u24mateDell:~\/sf_projects\/hello_glib$ \n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">developer@u24mateDell:~\/sf_projects\/hello_glib$ <\/span><span style=\"color: #9DB1C5\">.\/build_h_g.sh<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">MUST <\/span><span style=\"color: #9DB1C5\">BE<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">RUN<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">FROM<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">ROOT<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">OF<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">PROJECT<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">DIRECTORY<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">TREE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">This <\/span><span style=\"color: #9DB1C5\">will<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">delete<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">existing<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">local<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">build<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">or<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">release<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">directories <\/span><span style=\"color: #9DB1C5\">and<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">create<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">new<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">ones.<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">It<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">will<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">then<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">prep<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">the <\/span><span style=\"color: #9DB1C5\">build<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">directory<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">for<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">a<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">ninja<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">build.<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">Finally<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">it<\/span><span style=\"color: #B392F0\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">will <\/span><span style=\"color: #9DB1C5\">perform<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">the<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">actual<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">build.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">***<\/span><span style=\"color: #B392F0\"> Establishing fresh directories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">SCRIPT_DIR        <\/span><span style=\"color: #9DB1C5\">\/home\/developer\/sf_projects\/hello_glib<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">BUILD_DIR         <\/span><span style=\"color: #9DB1C5\">\/home\/developer\/sf_projects\/h_g_local_build<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">RELEASE_DIR       <\/span><span style=\"color: #9DB1C5\">\/home\/developer\/sf_projects\/h_g_local_release<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">Found <\/span><span style=\"color: #F8F8F8\">5<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">cores<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">so<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">setting<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">job<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">count<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">to<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">checking <\/span><span style=\"color: #9DB1C5\">for<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">platform<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">...<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #9DB1C5\">linux<\/span><span style=\"color: #B392F0\"> (x86_64)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">***<\/span><span style=\"color: #B392F0\"> Building h_g Local<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">&#91; <\/span><span style=\"color: #F8F8F8\">23<\/span><span style=\"color: #B392F0\">%&#93;: <\/span><span style=\"color: #F97583\">&lt;<\/span><span style=\"color: #B392F0\">h_g<\/span><span style=\"color: #F97583\">&gt;<\/span><span style=\"color: #B392F0\"> cache compiling.release hello_glib.cpp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">&#91; <\/span><span style=\"color: #F8F8F8\">47<\/span><span style=\"color: #B392F0\">%&#93;: <\/span><span style=\"color: #F97583\">&lt;<\/span><span style=\"color: #B392F0\">h_g<\/span><span style=\"color: #F97583\">&gt;<\/span><span style=\"color: #B392F0\"> linking.release h_g<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">&#91;<\/span><span style=\"color: #F8F8F8\">100<\/span><span style=\"color: #B392F0\">%&#93;: build ok, spent 0.591s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">developer@u24mateDell:~\/sf_projects\/hello_glib$ <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Xmake is a massive improvement for project building and packaging. CMake and other legacy build environments have gotten so bloated and cumbersome that we all have to move to something with more up front architecture.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"918\" height=\"292\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_001.png\" alt=\"\" class=\"wp-image-7755\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_001.png 918w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_001-300x95.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_001-768x244.png 768w\" sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"846\" height=\"60\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_002.png\" alt=\"\" class=\"wp-image-7756\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_002.png 846w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_002-300x21.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/hello_glib_002-768x54.png 768w\" sizes=\"(max-width: 846px) 100vw, 846px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Note the very nice directory structure. This supports debug and release for every architecture you are compiling for. They didn&#8217;t leave it up to you to figure out. You just have to find where they put it. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines to look up a function before you can find it . . . Then you are told it is undocumented for internal use only . . . Not something one wants to see in production code! Regular readers have seen me write about CopperSpice, CMake, and general hacks found in legacy toolchains. CMake &hellip; <a title=\"Xmake tutorial &#8211; Pt. 001\" class=\"bnm-read-more\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/\"><span class=\"screen-reader-text\">Xmake tutorial &#8211; Pt. 001<\/span>Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":7754,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1309,3],"tags":[1504,1837,1835,17,2388,2387],"class_list":["post-7753","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-experience","category-information-technology","tag-c","tag-cmake","tag-copperspice","tag-microsoft","tag-vcpkg","tag-xmake","bnm-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Xmake tutorial - Pt. 001 &#8211; Logikal Blog<\/title>\n<meta name=\"description\" content=\"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Xmake tutorial - Pt. 001 &#8211; Logikal Blog\" \/>\n<meta property=\"og:description\" content=\"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/\" \/>\n<meta property=\"og:site_name\" content=\"Logikal Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-05T21:46:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"266\" \/>\n\t<meta property=\"og:image:height\" content=\"257\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"seasoned_geek\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"seasoned_geek\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/\"},\"author\":{\"name\":\"seasoned_geek\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"headline\":\"Xmake tutorial &#8211; Pt. 001\",\"datePublished\":\"2026-06-05T21:46:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/\"},\"wordCount\":909,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/xmake-logo.png\",\"keywords\":[\"C++\",\"CMake\",\"CopperSpice\",\"Microsoft\",\"vcpkg\",\"xmake\"],\"articleSection\":[\"Experience\",\"Information Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/\",\"name\":\"Xmake tutorial - Pt. 001 &#8211; Logikal Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/xmake-logo.png\",\"datePublished\":\"2026-06-05T21:46:33+00:00\",\"description\":\"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/xmake-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/xmake-logo.png\",\"width\":266,\"height\":257,\"caption\":\"xmake logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/information-technology\\\/xmake\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Xmake tutorial &#8211; Pt. 001\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\",\"name\":\"Logikal Blog\",\"description\":\"For people with attention spans longer than a Tweet\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\",\"name\":\"seasoned_geek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"caption\":\"seasoned_geek\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\"},\"description\":\"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\\\/Qt touchscreen\\\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \\\"Zinc It!\\\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \\\"The Minimum You Need to Know to Be an OpenVMS Application Developer\\\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \\\"The Minimum You Need to Know\\\" book series was born. Three years later he wrote his first novel \\\"Infinite Exposure\\\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \\\"The Earth That Was\\\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.\",\"sameAs\":[\"https:\\\/\\\/theminimumyouneedtoknow.com\"],\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/author\\\/seasoned_geek\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Xmake tutorial - Pt. 001 &#8211; Logikal Blog","description":"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/","og_locale":"en_US","og_type":"article","og_title":"Xmake tutorial - Pt. 001 &#8211; Logikal Blog","og_description":"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .","og_url":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/","og_site_name":"Logikal Blog","article_published_time":"2026-06-05T21:46:33+00:00","og_image":[{"width":266,"height":257,"url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png","type":"image\/png"}],"author":"seasoned_geek","twitter_card":"summary_large_image","twitter_misc":{"Written by":"seasoned_geek","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#article","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/"},"author":{"name":"seasoned_geek","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"headline":"Xmake tutorial &#8211; Pt. 001","datePublished":"2026-06-05T21:46:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/"},"wordCount":909,"commentCount":0,"publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png","keywords":["C++","CMake","CopperSpice","Microsoft","vcpkg","xmake"],"articleSection":["Experience","Information Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/","url":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/","name":"Xmake tutorial - Pt. 001 &#8211; Logikal Blog","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#primaryimage"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png","datePublished":"2026-06-05T21:46:33+00:00","description":"I found Xmake looking to replace CMake scripts that CopperSpice used. I mean, when one has to use three different search engines . . .","breadcrumb":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#primaryimage","url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png","contentUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2026\/06\/xmake-logo.png","width":266,"height":257,"caption":"xmake logo"},{"@type":"BreadcrumbList","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/xmake\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.logikalsolutions.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Xmake tutorial &#8211; Pt. 001"}]},{"@type":"WebSite","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website","url":"https:\/\/www.logikalsolutions.com\/wordpress\/","name":"Logikal Blog","description":"For people with attention spans longer than a Tweet","publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.logikalsolutions.com\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842","name":"seasoned_geek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","caption":"seasoned_geek"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r"},"description":"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\/Qt touchscreen\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \"Zinc It!\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \"The Minimum You Need to Know to Be an OpenVMS Application Developer\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \"The Minimum You Need to Know\" book series was born. Three years later he wrote his first novel \"Infinite Exposure\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \"The Earth That Was\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.","sameAs":["https:\/\/theminimumyouneedtoknow.com"],"url":"https:\/\/www.logikalsolutions.com\/wordpress\/author\/seasoned_geek\/"}]}},"_links":{"self":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/7753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/comments?post=7753"}],"version-history":[{"count":1,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/7753\/revisions"}],"predecessor-version":[{"id":7757,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/7753\/revisions\/7757"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media\/7754"}],"wp:attachment":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media?parent=7753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/categories?post=7753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/tags?post=7753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}