{"id":6430,"date":"2023-12-14T10:58:06","date_gmt":"2023-12-14T17:58:06","guid":{"rendered":"https:\/\/ioflood.com\/blog\/?p=6430"},"modified":"2023-12-14T10:59:44","modified_gmt":"2023-12-14T17:59:44","slug":"make-linux-command","status":"publish","type":"post","link":"https:\/\/ioflood.com\/blog\/make-linux-command\/","title":{"rendered":"&#8216;make&#8217; Linux Command | File System Automation Guide"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/ioflood.com\/blog\/wp-content\/uploads\/2023\/12\/Image-of-Linux-terminal-with-make-command-focusing-on-software-build-processes-and-compilation-300x300.jpg\" alt=\"Image of Linux terminal with make command focusing on software build processes and compilation\" width=\"300\" height=\"300\" title=\"\"><\/figure>\n<\/div>\n<p>Ever found yourself puzzled over how to automate your build process in Linux? You&#8217;re not alone, but luckily there&#8217;s a powerful tool that can simplify your life. Think of the &#8216;make&#8217; command as a skilled conductor, orchestrating various parts of your build process in a seamless manner. It&#8217;s a tool that, when mastered, can make your Linux experience much more efficient and enjoyable.<\/p>\n<p><strong>In this guide, we&#8217;ll help you understand and master the &#8216;make&#8217; command in Linux.<\/strong> We&#8217;ll cover everything from the basics to more advanced techniques, including alternative approaches and troubleshooting common issues.<\/p>\n<p>So, let&#8217;s dive in and start mastering the &#8216;make&#8217; command in Linux!<\/p>\n<h2>TL;DR: How Do I Use the &#8216;make&#8217; Command in Linux?<\/h2>\n<blockquote><p>\n  The <code>'make'<\/code> command in Linux is used to automate the build process. To use it you must first create a file (usually called <code>'Makefile'<\/code>) in your directory, and defining a &#8216;rule&#8217; within. Once created you can call it with the syntax, <code>make [option] rule<\/code>.\n<\/p><\/blockquote>\n<p>Here&#8217;s a simple example:<\/p>\n<pre><code class=\"language-bash line-numbers\">make target\n<\/code><\/pre>\n<p>In this example, the &#8216;make&#8217; command will look for a file named &#8216;Makefile&#8217; in your directory, and execute the &#8216;target&#8217; specified within that file. This is a basic use case of the &#8216;make&#8217; command, but there&#8217;s much more to it.<\/p>\n<blockquote><p>\n  Ready to dive deeper into the &#8216;make&#8217; command and its various applications? Keep reading for a more detailed understanding and advanced usage scenarios.\n<\/p><\/blockquote>\n<h2>The Basics of &#8216;make&#8217;<\/h2>\n<p>Before we dive into the deep end, let&#8217;s start with the basics. The &#8216;make&#8217; command is used in conjunction with a &#8216;Makefile&#8217; &#8211; a special file that contains instructions (or &#8216;rules&#8217;) for how to build your project.<\/p>\n<p>Creating a basic &#8216;Makefile&#8217; is simple. Let&#8217;s look at an example:<\/p>\n<pre><code class=\"language-bash line-numbers\"># This is a basic Makefile\n\nall:\n    gcc -o hello hello.c\n<\/code><\/pre>\n<p>In this &#8216;Makefile&#8217;, we have a single rule: &#8216;all&#8217;. This rule tells &#8216;make&#8217; to compile our &#8216;hello.c&#8217; file using the &#8216;gcc&#8217; compiler, and output the result to an executable file named &#8216;hello&#8217;.<\/p>\n<p>To use &#8216;make&#8217; with this &#8216;Makefile&#8217;, you would simply type the following command in your terminal:<\/p>\n<pre><code class=\"language-bash line-numbers\">make all\n\n# Output:\n# gcc -o hello hello.c\n<\/code><\/pre>\n<p>Upon running this command, &#8216;make&#8217; will execute the instructions associated with the &#8216;all&#8217; target in our &#8216;Makefile&#8217;. In this case, it compiles our &#8216;hello.c&#8217; file into an executable.<\/p>\n<p>The &#8216;make&#8217; command can save you a lot of time and effort by automating your build process. However, it&#8217;s important to be aware of potential pitfalls. For example, if &#8216;make&#8217; can&#8217;t find a &#8216;Makefile&#8217; in your current directory, or if there are syntax errors in your &#8216;Makefile&#8217;, it won&#8217;t be able to execute your build. We&#8217;ll cover how to troubleshoot these issues later in this guide.<\/p>\n<h2>Diving Deeper: Advanced Uses of &#8216;make&#8217;<\/h2>\n<p>As you become more familiar with the &#8216;make&#8217; command, you&#8217;ll discover its true power lies in its advanced features. &#8216;make&#8217; is not just about automating compilation; it can handle complex tasks like managing dependencies, using variables, and defining pattern rules. Let&#8217;s explore these advanced uses.<\/p>\n<p>But first, let&#8217;s familiarize ourselves with some of the command-line arguments or flags that can modify the behavior of the &#8216;make&#8217; command. Here&#8217;s a table with some of the most commonly used &#8216;make&#8217; arguments.<\/p>\n<table>\n<thead>\n<tr>\n<th>Argument<\/th>\n<th>Description<\/th>\n<th>Example<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>-B<\/code><\/td>\n<td>Forces all targets to be remade.<\/td>\n<td><code>make -B target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-f<\/code><\/td>\n<td>Specifies an alternative Makefile.<\/td>\n<td><code>make -f MyMakefile<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-i<\/code><\/td>\n<td>Ignores all errors in commands executed to remake files.<\/td>\n<td><code>make -i target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-j<\/code><\/td>\n<td>Specifies the number of jobs (commands) to run simultaneously.<\/td>\n<td><code>make -j4<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-k<\/code><\/td>\n<td>Keeps going as much as possible after an error.<\/td>\n<td><code>make -k target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-n<\/code><\/td>\n<td>Displays the commands that would be executed but do not execute them.<\/td>\n<td><code>make -n target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-o<\/code><\/td>\n<td>Ensures that a target is not remade.<\/td>\n<td><code>make -o target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-p<\/code><\/td>\n<td>Prints the complete set of macro definitions and target descriptions.<\/td>\n<td><code>make -p<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-q<\/code><\/td>\n<td>Checks if the target is up-to-date.<\/td>\n<td><code>make -q target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-r<\/code><\/td>\n<td>Eliminates use of the built-in implicit rules.<\/td>\n<td><code>make -r target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-s<\/code><\/td>\n<td>Silences the commands as they are executed.<\/td>\n<td><code>make -s target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-t<\/code><\/td>\n<td>Touches targets, but does not remake them.<\/td>\n<td><code>make -t target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-v<\/code><\/td>\n<td>Prints the version of the &#8216;make&#8217;.<\/td>\n<td><code>make -v<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-w<\/code><\/td>\n<td>Prints the current directory before doing anything.<\/td>\n<td><code>make -w target<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>-C<\/code><\/td>\n<td>Changes to the directory before doing anything.<\/td>\n<td><code>make -C \/path\/to\/dir<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Now that we have a basic understanding of &#8216;make&#8217; command line arguments, let&#8217;s dive deeper into the advanced use of &#8216;make&#8217;.<\/p>\n<h2>Exploring Alternatives: CMake and Autotools<\/h2>\n<p>While the &#8216;make&#8217; command is a powerful tool for build automation in Linux, it&#8217;s not the only game in town. There are other tools available that you might find useful depending on your specific needs. Let&#8217;s take a look at two of the most popular alternatives: &#8216;CMake&#8217; and &#8216;Autotools&#8217;.<\/p>\n<h3>CMake: A Cross-Platform Tool<\/h3>\n<p>CMake is a cross-platform tool that automates the build process in a compiler-independent manner. Unlike &#8216;make&#8217;, which uses a &#8216;Makefile&#8217;, CMake uses &#8216;CMakeLists.txt&#8217; files to manage the build process.<\/p>\n<p>Here&#8217;s a basic example of a &#8216;CMakeLists.txt&#8217; file:<\/p>\n<pre><code class=\"language-bash line-numbers\"># This is a basic CMakeLists.txt\n\ncmake_minimum_required(VERSION 3.10)\n\nproject(hello)\n\nadd_executable(hello hello.c)\n<\/code><\/pre>\n<p>To build your project with CMake, you would use the following commands:<\/p>\n<pre><code class=\"language-bash line-numbers\">cmake .\nmake\n\n# Output:\n# -- Configuring done\n# -- Generating done\n# -- Build files have been written to: \/path\/to\/your\/project\n# Scanning dependencies of target hello\n# [ 50%] Building C object CMakeFiles\/hello.dir\/hello.c.o\n# [100%] Linking C executable hello\n# [100%] Built target hello\n<\/code><\/pre>\n<p>CMake&#8217;s main advantage over &#8216;make&#8217; is its cross-platform compatibility. If you&#8217;re working on a project that needs to be built on multiple platforms, CMake might be a better choice.<\/p>\n<h3>Autotools: The Classic Approach<\/h3>\n<p>Autotools is a collection of tools (including &#8216;autoconf&#8217;, &#8216;automake&#8217;, and &#8216;libtool&#8217;) that are used to make your software package portable. It&#8217;s a bit more complex than &#8216;make&#8217; or &#8216;CMake&#8217;, but it&#8217;s extremely powerful.<\/p>\n<p>Here&#8217;s a basic example of how you might use Autotools to build your project:<\/p>\n<pre><code class=\"language-bash line-numbers\">autoscan\nmv configure.scan configure.ac\nautoheader\nautomake --add-missing\nautoconf\n.\/configure\nmake\n\n# Output:\n# configure.ac: creating directory .\n# configure.ac: creating .\/aclocal.m4\n# configure.ac: creating .\/Makefile.am\n# configure.ac: creating .\/configure\n# configure.ac: creating .\/config.h.in\n# configure: creating .\/config.status\n# config.status: creating config.h\n# config.status: config.h is unchanged\n# make: Nothing to be done for 'all'.\n<\/code><\/pre>\n<p>Autotools&#8217; main advantage is its ability to handle very complex build scenarios. However, it has a steep learning curve and might be overkill for simpler projects.<\/p>\n<p>In conclusion, while &#8216;make&#8217; is a fantastic tool for automating the build process in Linux, it&#8217;s not your only option. Depending on your needs, you might find &#8216;CMake&#8217; or &#8216;Autotools&#8217; to be a better fit. Regardless of the tool you choose, the key is to understand how it works and how to use it effectively.<\/p>\n<h2>Navigating &#8216;make&#8217; Command Challenges<\/h2>\n<p>While the &#8216;make&#8217; command is undoubtedly a powerful tool, like any tool, it can present its own set of challenges. Let&#8217;s discuss some common issues you might encounter when using the &#8216;make&#8217; command, and how to resolve them.<\/p>\n<h3>Missing Dependencies<\/h3>\n<p>One common issue is missing dependencies. If &#8216;make&#8217; can&#8217;t find a file that it needs to build your project, it will throw an error. Here&#8217;s an example:<\/p>\n<pre><code class=\"language-bash line-numbers\">make all\n\n# Output:\n# make: *** No rule to make target 'all'.  Stop.\n<\/code><\/pre>\n<p>In this example, &#8216;make&#8217; is looking for a target called &#8216;all&#8217;, but it can&#8217;t find it. This could mean that the &#8216;all&#8217; target isn&#8217;t defined in your &#8216;Makefile&#8217;, or that one of the files specified in the &#8216;all&#8217; target is missing.<\/p>\n<p>To resolve this issue, you&#8217;ll need to check your &#8216;Makefile&#8217; and make sure all the necessary files are available.<\/p>\n<h3>Syntax Errors in the &#8216;Makefile&#8217;<\/h3>\n<p>Another common issue is syntax errors in the &#8216;Makefile&#8217;. Here&#8217;s an example:<\/p>\n<pre><code class=\"language-bash line-numbers\">make\n\n# Output:\n# Makefile:2: *** missing separator.  Stop.\n<\/code><\/pre>\n<p>In this example, &#8216;make&#8217; is complaining about a missing separator on line 2 of the &#8216;Makefile&#8217;. This usually means that &#8216;make&#8217; is expecting a tab character, but it&#8217;s finding something else (like spaces).<\/p>\n<p>To resolve this issue, you&#8217;ll need to check the syntax of your &#8216;Makefile&#8217;. Remember, &#8216;make&#8217; is very particular about its syntax &#8211; especially when it comes to tabs vs spaces.<\/p>\n<h3>Unintended Side Effects<\/h3>\n<p>Finally, keep in mind that &#8216;make&#8217; can have unintended side effects if not used carefully. For example, if you accidentally run &#8216;make clean&#8217; without realizing what it does, you might end up deleting important files.<\/p>\n<p>To avoid this, always make sure you understand what a &#8216;Makefile&#8217; does before you run it. And remember, you can always use the &#8216;-n&#8217; flag with &#8216;make&#8217; to see what it would do without actually doing it:<\/p>\n<pre><code class=\"language-bash line-numbers\">make -n clean\n\n# Output:\n# rm -f hello\n<\/code><\/pre>\n<p>In this example, &#8216;make -n clean&#8217; shows that &#8216;make clean&#8217; would delete the &#8216;hello&#8217; file, but it doesn&#8217;t actually delete it.<\/p>\n<p>In conclusion, while the &#8216;make&#8217; command can present its own set of challenges, with a bit of knowledge and careful use, it&#8217;s a tool that can greatly simplify your build process.<\/p>\n<h2>Understanding Build Automation and the &#8216;make&#8217; Command<\/h2>\n<p>Before we delve further into the &#8216;make&#8217; command, it&#8217;s crucial to understand the concept of build automation and why it&#8217;s so important in software development.<\/p>\n<h3>The Importance of Build Automation<\/h3>\n<p>Build automation refers to scripting or automating a wide variety of tasks that software developers do in their day-to-day activities, including:<\/p>\n<ul>\n<li>Compiling source code into binary code<\/li>\n<li>Packaging binary code<\/li>\n<li>Running tests<\/li>\n<li>Deployment to production systems<\/li>\n<\/ul>\n<p>Automating these tasks can lead to significant time savings, allowing developers to focus on designing and implementing their code. It also reduces the chances of human error and ensures a consistent build process across the team.<\/p>\n<h3>The Evolution of the &#8216;make&#8217; Command<\/h3>\n<p>The &#8216;make&#8217; command is one of the earliest and most enduring examples of a build automation tool. It was originally developed in 1976 by Stuart Feldman at Bell Labs. Despite the development of numerous other build tools, &#8216;make&#8217; remains widely used, especially in Unix and Unix-like operating systems.<\/p>\n<p>The &#8216;make&#8217; command revolutionized programming by automating the build process. It uses a &#8216;Makefile&#8217; to determine which parts of a program need to be recompiled, and executes the commands to recompile them.<\/p>\n<p>Let&#8217;s take a look at a simple &#8216;Makefile&#8217; example:<\/p>\n<pre><code class=\"language-bash line-numbers\"># This is a basic Makefile\n\nall:\n    gcc -o hello hello.c\n<\/code><\/pre>\n<p>In this &#8216;Makefile&#8217;, we have a single rule: &#8216;all&#8217;. This rule tells &#8216;make&#8217; to compile our &#8216;hello.c&#8217; file using the &#8216;gcc&#8217; compiler, and output the result to an executable file named &#8216;hello&#8217;.<\/p>\n<p>When we run the command <code>make all<\/code>, &#8216;make&#8217; will execute the instructions associated with the &#8216;all&#8217; target in our &#8216;Makefile&#8217;.<\/p>\n<pre><code class=\"language-bash line-numbers\">make all\n\n# Output:\n# gcc -o hello hello.c\n<\/code><\/pre>\n<p>As you can see, the &#8216;make&#8217; command simplifies the build process by automating the compilation of our code. This is just a simple example, but &#8216;make&#8217; can handle much more complex scenarios, making it a powerful tool in any developer&#8217;s toolkit.<\/p>\n<h2>The &#8216;make&#8217; Command in Larger Projects<\/h2>\n<p>As your software development projects grow in size and complexity, the &#8216;make&#8217; command remains a steadfast tool in your arsenal. It&#8217;s not just about compiling a few files; it&#8217;s about managing dependencies, automating tasks, and streamlining your entire build process.<\/p>\n<h3>Continuous Integration and Continuous Deployment<\/h3>\n<p>In the context of larger projects, the &#8216;make&#8217; command often plays a crucial role in Continuous Integration (CI) and Continuous Deployment (CD) pipelines. CI\/CD is a method to frequently deliver apps to customers by introducing automation into the stages of app development. The main concepts attributed to CI\/CD are continuous integration, continuous delivery, and continuous deployment.<\/p>\n<p>In CI, when developers push code to the shared repository, automated build and test processes kick off. These automated &#8216;make&#8217; commands ensure that new changes integrate well into the existing codebase. If any integration problems occur, developers can address them right away. This leads to more frequent and stable releases.<\/p>\n<p>In CD, every change that passes the automated testing phase is automatically released to customers. This means that &#8216;make&#8217; commands are not just building the project but also preparing it for deployment. This could involve creating Docker images, pushing code to servers, or updating configuration files.<\/p>\n<p>Here&#8217;s an example of how you might use &#8216;make&#8217; in a CI\/CD pipeline:<\/p>\n<pre><code class=\"language-bash line-numbers\"># This is a Makefile for a CI\/CD pipeline\n\nbuild:\n    gcc -o myapp myapp.c\n\ndeploy:\n    scp myapp myuser@myserver:\/path\/to\/myapp\n\n.PHONY: build deploy\n<\/code><\/pre>\n<p>In this &#8216;Makefile&#8217;, we have two rules: &#8216;build&#8217; and &#8216;deploy&#8217;. The &#8216;build&#8217; rule compiles our &#8216;myapp.c&#8217; file into an executable, and the &#8216;deploy&#8217; rule copies the executable to a server.<\/p>\n<pre><code class=\"language-bash line-numbers\">ci-build-and-deploy:\n    make build &amp;&amp; make deploy\n\n# Output:\n# gcc -o myapp myapp.c\n# scp myapp myuser@myserver:\/path\/to\/myapp\n<\/code><\/pre>\n<p>As you can see, the &#8216;make&#8217; command is a powerful tool for automating your build and deployment process, making it an essential part of any CI\/CD pipeline.<\/p>\n<h3>Further Resources for Mastering &#8216;make&#8217;<\/h3>\n<p>Ready to dive deeper into the &#8216;make&#8217; command? Here are some resources to help you on your journey:<\/p>\n<ul>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.gnu.org\/software\/make\/manual\/make.html\" target=\"_blank\" rel=\"noopener\">GNU Make Manual<\/a>: The official manual for &#8216;make&#8217; from the GNU project.<\/p>\n<\/li>\n<li>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"http:\/\/www.oreilly.com\/openbook\/make3\/book\/index.csp\" target=\"_blank\" rel=\"noopener\">Managing Projects with GNU Make<\/a>: An online book about &#8216;make&#8217; from O&#8217;Reilly Media.<\/p>\n<\/li>\n<li>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/earthly.dev\/blog\/series\/makefile\/\" target=\"_blank\" rel=\"noopener\">Practical Makefiles, by Example<\/a>: A practical guide to using &#8216;make&#8217; in your projects.<\/p>\n<\/li>\n<\/ul>\n<h2>Wrapping Up: Mastering the &#8216;make&#8217; Command in Linux<\/h2>\n<p>In this comprehensive guide, we&#8217;ve delved into the &#8216;make&#8217; command in Linux, a powerful tool for automating the build process. We&#8217;ve explored its usage, from basic to advanced, and even looked at alternative approaches to handle build automation.<\/p>\n<p>We began with the basics, learning how to create a simple &#8216;Makefile&#8217; and use the &#8216;make&#8217; command to automate our build process. We then ventured into more advanced territory, exploring complex uses of &#8216;make&#8217;, such as managing dependencies, using variables, and defining pattern rules. We also delved into the common issues one may encounter when using the &#8216;make&#8217; command, such as missing dependencies or syntax errors in the &#8216;Makefile&#8217;, and provided solutions and workarounds for each issue.<\/p>\n<p>We also looked at alternative tools for build automation, such as &#8216;CMake&#8217; and &#8216;Autotools&#8217;, giving you a sense of the broader landscape of tools for automating the build process. Here&#8217;s a quick comparison of these tools:<\/p>\n<table>\n<thead>\n<tr>\n<th>Tool<\/th>\n<th>Complexity<\/th>\n<th>Cross-Platform<\/th>\n<th>Use Case<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>&#8216;make&#8217;<\/td>\n<td>Moderate<\/td>\n<td>No<\/td>\n<td>Small to Medium Projects<\/td>\n<\/tr>\n<tr>\n<td>&#8216;CMake&#8217;<\/td>\n<td>High<\/td>\n<td>Yes<\/td>\n<td>Large, Cross-Platform Projects<\/td>\n<\/tr>\n<tr>\n<td>&#8216;Autotools&#8217;<\/td>\n<td>High<\/td>\n<td>No<\/td>\n<td>Large Unix-like Projects<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Whether you&#8217;re just starting out with the &#8216;make&#8217; command or you&#8217;re looking to level up your build automation skills, we hope this guide has given you a deeper understanding of &#8216;make&#8217; and its capabilities.<\/p>\n<p>With its balance of power and flexibility, the &#8216;make&#8217; command is a valuable tool for any developer working in a Linux environment. Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ever found yourself puzzled over how to automate your build process in Linux? You&#8217;re not alone, but luckily there&#8217;s a powerful tool that can simplify your life. Think of the &#8216;make&#8217; command as a skilled conductor, orchestrating various parts of your build process in a seamless manner. It&#8217;s a tool that, when mastered, can make [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":13815,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,3,9],"tags":[],"class_list":["post-6430","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bash","category-linux","category-sysadmin","cat-124-id","cat-3-id","cat-9-id","has_thumb"],"_links":{"self":[{"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/posts\/6430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/comments?post=6430"}],"version-history":[{"count":7,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/posts\/6430\/revisions"}],"predecessor-version":[{"id":13715,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/posts\/6430\/revisions\/13715"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/media\/13815"}],"wp:attachment":[{"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/media?parent=6430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/categories?post=6430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ioflood.com\/blog\/wp-json\/wp\/v2\/tags?post=6430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}