{"id":12541,"date":"2017-10-01T00:04:43","date_gmt":"2017-09-30T23:04:43","guid":{"rendered":"https:\/\/sysprogs.com\/w\/?p=12541"},"modified":"2017-10-01T00:04:43","modified_gmt":"2017-09-30T23:04:43","slug":"explaining-project-format-changes-in-visualgdb-5-3","status":"publish","type":"post","link":"https:\/\/sysprogs.com\/w\/explaining-project-format-changes-in-visualgdb-5-3\/","title":{"rendered":"Explaining project format changes in VisualGDB 5.3"},"content":{"rendered":"<p>The latest VisualGDB 5.3 release introduces a few\u00a0improvements in the project format that avoid hardcoding of the paths and settings in the project files and make toolchain management on different machines easier. However\u00a0some of those changes are not backward compatible with VisualGDB 5.2 and earlier, making it harder to update to v5.3\u00a0if some of\u00a0the\u00a0developers in your organization are still using v5.2. In this post I will\u00a0show you the project file format differences between\u00a0VisualGDB 5.3 and 5.2 and will\u00a0provide examples on making\u00a0v5.3 projects compatible with the older VisualGDB versions.<\/p>\n<p><!--more--><\/p>\n<h2>Non-Embedded Projects<\/h2>\n<p>The only change for non-embedded projects is the transition from\u00a0storing the detailed toolchain\u00a0information in <strong>.vgdbsettings<\/strong> files to only storing the toolchain ID and version and\u00a0loading the details from a\u00a0directory under %LOCALAPPDATA%. Below is the comparison of a\u00a0.vgdbsettings file for a simple project targeting Raspberry Pi\u00a0 created with VisualGDB 5.2 and 5.3 respectively:<\/p>\n<table>\n<tbody>\n<tr>\n<td>VisualGDB 5.2<\/td>\n<td>VisualGDB 5.3<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"\"> &lt;Build xsi:type=\"com.visualgdb.build.msbuild\"&gt;\r\n\u00a0\u00a0&lt;Toolchain&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;Name&gt;Raspberry PI&lt;\/Name&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;UniqueID&gt;com.visualgdb.raspberry_pi&lt;\/UniqueID&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;Location&gt;C:\\SysGCC\\raspberry&lt;\/Location&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;UnixSystem&gt;false&lt;\/UnixSystem&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;GCC&gt;C:\\SysGCC\\raspberry\\bin\\arm-linux-gnueabihf-gcc.exe&lt;\/GCC&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;GXX&gt;C:\\SysGCC\\raspberry\\bin\\arm-linux-gnueabihf-g++.exe&lt;\/GXX&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;GDB&gt;C:\\SysGCC\\raspberry\\bin\\arm-linux-gnueabihf-gdb.exe&lt;\/GDB&gt;\r\n\u00a0\u00a0\u00a0\u00a0&lt;Make&gt;C:\\SysGCC\\raspberry\\bin\\make.exe&lt;\/Make&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;AdditionalPathDirectories&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;string&gt;C:\\SysGCC\\raspberry\\bin&lt;\/string&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;\/AdditionalPathDirectories&gt;\r\n \u00a0\u00a0&lt;RequireCmdExe&gt;true&lt;\/RequireCmdExe&gt;\r\n \u00a0\u00a0&lt;RequireCtrlBreak&gt;false&lt;\/RequireCtrlBreak&gt;\r\n \u00a0\u00a0&lt;SourceDirMapping&gt;\r\n \u00a0\u00a0&lt;Directories \/&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;PathStyle&gt;MinGWUnixSlash&lt;\/PathStyle&gt;\r\n \u00a0\u00a0&lt;\/SourceDirMapping&gt;\r\n \u00a0\u00a0&lt;\/Toolchain&gt;\r\n\u00a0 &lt;RemoteBuildEnvironment&gt;\r\n \u00a0\u00a0&lt;Records&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;Record&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;VariableName&gt;LANG&lt;\/VariableName&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;Value&gt;en_US.UTF-8&lt;\/Value&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;\/Record&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;Record&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;VariableName&gt;PATH&lt;\/VariableName&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;Value&gt;C:\\SysGCC\\raspberry\\bin;%PATH%&lt;\/Value&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;\/Record&gt;\r\n \u00a0\u00a0&lt;\/Records&gt;\r\n \u00a0\u00a0&lt;\/RemoteBuildEnvironment&gt;\r\n \u00a0\u00a0&lt;ParallelJobCount&gt;0&lt;\/ParallelJobCount&gt;\r\n &lt;\/Build&gt;<\/pre>\n<\/td>\n<td>\n<pre class=\"\"> &lt;Build xsi:type=\"com.visualgdb.build.msbuild\"&gt;\r\n\u00a0 &lt;ToolchainID&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;ID&gt;com.visualgdb.raspberry_pi&lt;\/ID&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;Version&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;GCC&gt;4.9.2&lt;\/GCC&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;GDB&gt;7.7.1&lt;\/GDB&gt;\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;Revision&gt;4&lt;\/Revision&gt;\r\n \u00a0\u00a0\u00a0\u00a0&lt;\/Version&gt;\r\n \u00a0\u00a0&lt;\/ToolchainID&gt;\r\n \u00a0\u00a0&lt;ParallelJobCount&gt;0&lt;\/ParallelJobCount&gt;\r\n \u00a0\u00a0&lt;SuppressDirectoryChangeMessages&gt;true&lt;\/SuppressDirectoryChangeMessages&gt;\r\n &lt;\/Build&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note how the\u00a0<strong>Toolchain<\/strong> and <strong>RemoteBuildEnvironment<\/strong> elements were replaced by a\u00a0shorter <strong>ToolchainID<\/strong> element.\u00a0VisualGDB 5.3 will automatically\u00a0locate the toolchain corresponding to the ID and version from the project file and will\u00a0automatically set the\u00a0paths and environment variables from it.<\/p>\n<p>The .vxcproj file will also\u00a0now store the toolchain ID instead of the toolchain path:<\/p>\n<table>\n<tbody>\n<tr>\n<td>VisualGDB 5.2<\/td>\n<td>VisualGDB 5.3<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"\"> &lt;PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|VisualGDB'\"&gt;\r\n   &lt;GNUConfigurationType&gt;Debug&lt;\/GNUConfigurationType&gt;\r\n   &lt;Toolchain&gt;C:\\SysGCC\\raspberry&lt;\/Toolchain&gt;\r\n &lt;\/PropertyGroup&gt;<\/pre>\n<\/td>\n<td>\n<pre class=\"\">&lt;PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|VisualGDB'\"&gt;\r\n   &lt;GNUConfigurationType&gt;Debug&lt;\/GNUConfigurationType&gt;\r\n   &lt;ToolchainID&gt;com.visualgdb.raspberry_pi&lt;\/ToolchainID&gt;\r\n   &lt;ToolchainVersion&gt;4.9.2\/7.7.1\/r4&lt;\/ToolchainVersion&gt;\r\n &lt;\/PropertyGroup&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For non-MSBuild projects,\u00a0VisualGDB 5.3 also ensures that\u00a0settings like &#8216;build command&#8217; do not hardcode the toolchain path:<\/p>\n<table>\n<tbody>\n<tr>\n<td>VisualGDB 5.2<\/td>\n<td>VisualGDB 5.3<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"\"> &lt;Build xsi:type=\"com.visualgdb.build.make\"&gt;\r\n   &lt;MakeFilePathRelativeToSourceDir&gt;Makefile&lt;\/MakeFilePathRelativeToSourceDir&gt;\r\n   &lt;MakeConfigurationName&gt;Debug&lt;\/MakeConfigurationName&gt;\r\n   &lt;Toolchain&gt;\r\n     &lt;!-- ... --&gt;\r\n   &lt;\/Toolchain&gt;\r\n   &lt;MakeCommandTemplate&gt;\r\n   &lt;SkipWhenRunningCommandList&gt;false&lt;\/SkipWhenRunningCommandList&gt;\r\n   &lt;RemoteHost&gt;\r\n     &lt;HostName&gt;BuildMachine&lt;\/HostName&gt;\r\n     &lt;Transport&gt;BuiltinShortcut&lt;\/Transport&gt;\r\n   &lt;\/RemoteHost&gt;\r\n   &lt;Command&gt;cmd.exe&lt;\/Command&gt;\r\n   &lt;Arguments&gt;\/c \"C:\\SysGCC\\raspberry\\bin\\make.exe\"&lt;\/Arguments&gt;\r\n   &lt;WorkingDirectory&gt;$(BuildDir)&lt;\/WorkingDirectory&gt;\r\n   &lt;Environment&gt;\r\n     &lt;Records&gt;\r\n       &lt;Record&gt;\r\n         &lt;VariableName&gt;LANG&lt;\/VariableName&gt;\r\n         &lt;Value&gt;en_US.UTF-8&lt;\/Value&gt;\r\n       &lt;\/Record&gt;\r\n       &lt;Record&gt;\r\n         &lt;VariableName&gt;PATH&lt;\/VariableName&gt;\r\n         &lt;Value&gt;C:\\SysGCC\\raspberry\\bin;%PATH%&lt;\/Value&gt;\r\n       &lt;\/Record&gt;\r\n     &lt;\/Records&gt;\r\n   &lt;\/Environment&gt;\r\n   &lt;BackgroundMode xsi:nil=\"true\" \/&gt;\r\n   &lt;\/MakeCommandTemplate&gt;\r\n &lt;\/Build&gt;<\/pre>\n<\/td>\n<td>\n<pre class=\"\"> &lt;Build xsi:type=\"com.visualgdb.build.make\"&gt;\r\n   &lt;ToolchainID&gt;\r\n     &lt;!-- ... --&gt;\r\n   &lt;\/ToolchainID&gt;\r\n   &lt;MakeFilePathRelativeToSourceDir&gt;Makefile&lt;\/MakeFilePathRelativeToSourceDir&gt;\r\n   &lt;MakeConfigurationName&gt;Debug&lt;\/MakeConfigurationName&gt;\r\n   &lt;MakeCommandTemplate&gt;\r\n   &lt;SkipWhenRunningCommandList&gt;false&lt;\/SkipWhenRunningCommandList&gt;\r\n   &lt;RemoteHost&gt;\r\n     &lt;HostName&gt;BuildMachine&lt;\/HostName&gt;\r\n     &lt;Transport&gt;BuiltinShortcut&lt;\/Transport&gt;\r\n   &lt;\/RemoteHost&gt;\r\n   &lt;Command&gt;$(ToolchainMake)&lt;\/Command&gt;\r\n   &lt;Arguments&gt;$(ToolchainMakeArgs)&lt;\/Arguments&gt;\r\n   &lt;WorkingDirectory&gt;$(BuildDir)&lt;\/WorkingDirectory&gt;\r\n   &lt;BackgroundMode xsi:nil=\"true\" \/&gt;\r\n   &lt;\/MakeCommandTemplate&gt;\r\n &lt;\/Build&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note the new $(ToolchainMake) and $(ToolchainMakeArgs) variables that are automatically set by VisualGDB when it locates a toolchain matching the ID.<\/p>\n<p>When you open a VisualGDB 5.2\u00a0project in VisualGDB 5.3, it will suggest automatically upgrading it:<a href=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/upgrade.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12543\" src=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/upgrade.png\" alt=\"upgrade\" width=\"386\" height=\"362\" srcset=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/upgrade.png 386w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/upgrade-300x281.png 300w\" sizes=\"(max-width: 386px) 100vw, 386px\" \/><\/a><\/p>\n<p>The upgrade process will\u00a0locate a toolchain in the local toolchain list that matches the explicit definition inside the <strong>&lt;Toolchain&gt;<\/strong> element and will insert a\u00a0<strong>&lt;ToolchainID&gt;<\/strong> element referencing it. If no such toolchain is found, VisualGDB will suggest importing it:<a href=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/toolchain.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12544\" src=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/toolchain.png\" alt=\"toolchain\" width=\"623\" height=\"247\" srcset=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/toolchain.png 623w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/09\/toolchain-300x119.png 300w\" sizes=\"(max-width: 623px) 100vw, 623px\" \/><\/a><\/p>\n<p>Converted projects will have both the old &lt;Toolchain&gt;\u00a0and the new &lt;ToolchainID&gt; elements.<\/p>\n<p>You will be able to continue building the\u00a0converted non-embedded projects with both VisualGDB 5.2 and VisualGDB 5.3. However changing the toolchain settings\u00a0via v5.2 GUI will remove the <strong>&lt;ToolchainID&gt;<\/strong> element\u00a0and change the <strong>&lt;Toolchain&gt;<\/strong> instead. Changing\u00a0 the toolchain\u00a0via v5.3 GUI will change <strong>&lt;ToolchainID&gt;<\/strong>, but will keep <strong>&lt;Toolchain&gt;<\/strong> unchanged.<\/p>\n<p>If you want to build a project created with v5.3 using VisualGDB 5.2, simply add a <strong>&lt;Toolchain&gt;<\/strong> element to the .vgdbsettings file manually so that VisualGDB 5.2 can recognize it. If this is an MSBuild-based projects, also ensure you have the <strong>&lt;Toolchain&gt;<\/strong> property set\u00a0in the .vcxproj file.<\/p>\n<h2>Embedded projects<\/h2>\n<p>VisualGDB improves the\u00a0usability of embedded projects by using variables like $(BSP_ROOT) throughout the .vcxproj files instead of hardcoding any paths:<\/p>\n<table>\n<tbody>\n<tr>\n<td>VisualGDB 5.2<\/td>\n<td>VisualGDB 5.3<\/td>\n<\/tr>\n<tr>\n<td>\n<pre class=\"\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" \r\n  xmlns=\"http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003\"&gt;\r\n &lt;!-- ... --&gt;\r\n   &lt;PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|VisualGDB'\"&gt;\r\n     &lt;Toolchain&gt;C:\\SysGCC\\arm-eabi&lt;\/Toolchain&gt;\r\n   &lt;\/PropertyGroup&gt;\r\n   &lt;ItemGroup&gt;\r\n     &lt;ClCompile Include=\"..\\..\\..\\Users\\&lt;...&gt;\\EmbeddedBSPs\\&lt;...&gt;\\drivers\\AnalogIn.cpp\" \/&gt;\r\n   &lt;!-- ... --&gt;\r\n   &lt;\/ItemGroup&gt;\r\n &lt;!-- ... --&gt;\r\n&lt;\/Project&gt;<\/pre>\n<\/td>\n<td>\n<pre class=\"\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\"\r\n xmlns=\"http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003\"&gt;\r\n &lt;!-- ... --&gt;\r\n &lt;PropertyGroup Label=\"Globals\"&gt;\r\n   &lt;VCProjectVersion&gt;15.0&lt;\/VCProjectVersion&gt;\r\n   &lt;ProjectGuid&gt;...&lt;\/ProjectGuid&gt;\r\n   &lt;BSP_ID&gt;com.sysprogs.arm.stm32&lt;\/BSP_ID&gt;\r\n   &lt;BSP_VERSION&gt;4.3&lt;\/BSP_VERSION&gt;\r\n   &lt;InPlaceBSPSubdir \/&gt;\r\n &lt;\/PropertyGroup&gt;\r\n &lt;PropertyGroup Condition=\"...\"&gt;\r\n   &lt;GNUConfigurationType&gt;Debug&lt;\/GNUConfigurationType&gt;\r\n   &lt;ToolchainID&gt;com.visualgdb.arm-eabi&lt;\/ToolchainID&gt;\r\n   &lt;ToolchainVersion&gt;6.2.0\/7.12\/r4&lt;\/ToolchainVersion&gt;\r\n &lt;\/PropertyGroup&gt;\r\n &lt;!-- ... --&gt;\r\n &lt;ItemGroup&gt;\r\n   &lt;ClCompile Include=\"$(BSP_ROOT)\\drivers\\AnalogIn.cpp\" \/&gt;\r\n &lt;!-- ... --&gt;\r\n &lt;\/ItemGroup&gt;\r\n&lt;\/Project&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This allows opening the project on\u00a0different machines with different locations of the BSP and lets VisualGDB find the files without\u00a0hardcoding anything. On non-MSBuild projects VisualGDB explicitly inserts a reference to the file that defines those variables:<\/p>\n<pre class=\"\"> &lt;ImportGroup Label=\"VisualGDBFindComponents\"&gt;\r\n   &lt;Import Project=\"$(LOCALAPPDATA)\\VisualGDB\\FindComponents.props\" \/&gt;\r\n &lt;\/ImportGroup&gt;<\/pre>\n<p>VisualGDB 5.3 automatically maintains the <strong>FindComponents.props<\/strong> file to reflect the locations of all installed toolchains and BSPs. If you want to build VisualGDB 5.3 projects on VisualGDB 5.2, simply create the FindComponents.props file manually and define the\u00a0variables like BSP_ROOT conditionally:<\/p>\n<pre class=\"\">&lt;Project ToolsVersion=\"4.0\" xmlns=\"http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003\"&gt;\r\n &lt;PropertyGroup Condition=\"'$(BSP_ID)' != ''\"&gt;\r\n &lt;BSP_ROOT Condition=\"('$(BSP_ID)' == 'com.sysprogs.arm.stm32') and (('$(BSP_VERSION)' == '4.3') or ('$(BSP_VERSION)' == ''))\"&gt;C:\/Users\/virtual.SYSPROGS\/AppData\/Local\/VisualGDB\/EmbeddedBSPs\/arm-eabi\/com.sysprogs.arm.stm32&lt;\/BSP_ROOT&gt;\r\n &lt;\/PropertyGroup&gt;\r\n&lt;\/Project&gt;<\/pre>\n<p>Ensure you import if from your .vcxproj file, as pre-v5.3 VisualGDB won&#8217;t to this automatically.<\/p>\n<h2>Automatic\u00a0updating<\/h2>\n<p>You can\u00a0prevent VisualGDB 5.3 from automatically upgrading v5.2 projects by disabling the following setting under Tools-&gt;Options:<a href=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/pkg.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12545\" src=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/pkg.png\" alt=\"pkg\" width=\"881\" height=\"434\" srcset=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/pkg.png 881w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/pkg-300x148.png 300w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/pkg-768x378.png 768w\" sizes=\"(max-width: 881px) 100vw, 881px\" \/><\/a><\/p>\n<p>To disable\u00a0automatic toolchain definition upgrading use the setting shown below:<a href=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/oldtc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12546\" src=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/oldtc.png\" alt=\"oldtc\" width=\"881\" height=\"434\" srcset=\"https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/oldtc.png 881w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/oldtc-300x148.png 300w, https:\/\/sysprogs.com\/w\/wp-content\/uploads\/2017\/10\/oldtc-768x378.png 768w\" sizes=\"(max-width: 881px) 100vw, 881px\" \/><\/a><\/p>\n<p>If you haven&#8217;t tried VisualGDB 5.3 yet, give it a try. It includes numerous improvements to building and debugging experience, supports profiling and code coverage for Linux projects and many more features. You can find the detailed changelog here:\u00a0https:\/\/visualgdb.com\/history\/.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The latest VisualGDB 5.3 release introduces a few\u00a0improvements in the project format that avoid hardcoding of the paths and settings in the project files and make toolchain management on different machines easier. However\u00a0some of those changes are not backward compatible with VisualGDB 5.2 and earlier, making it harder to update to v5.3\u00a0if some of\u00a0the\u00a0developers in &hellip; <a href=\"https:\/\/sysprogs.com\/w\/explaining-project-format-changes-in-visualgdb-5-3\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Explaining project format changes in VisualGDB 5.3<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"categories":[1],"tags":[422],"_links":{"self":[{"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/posts\/12541"}],"collection":[{"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/comments?post=12541"}],"version-history":[{"count":2,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/posts\/12541\/revisions"}],"predecessor-version":[{"id":12547,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/posts\/12541\/revisions\/12547"}],"wp:attachment":[{"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/media?parent=12541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/categories?post=12541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sysprogs.com\/w\/wp-json\/wp\/v2\/tags?post=12541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}