KiCad PCB EDA Suite
Loading...
Searching...
No Matches
build_version.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2015-2024 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25// Date for KiCad build version
26#include <wx/wx.h>
27#include <config.h>
28#include <boost/version.hpp>
29#include <kiplatform/app.h>
30#include <font/version_info.h>
31#include <build_version.h>
32
33#include <tuple>
34
35// kicad_curl.h must be included before wx headers, to avoid
36// conflicts for some defines, at least on Windows
37// kicad_curl.h can create conflicts for some defines, at least on Windows
38// so we are using here 2 proxy functions to know Curl version to avoid
39// including kicad_curl.h to know Curl version
40extern std::string GetKicadCurlVersion();
41extern std::string GetCurlLibVersion();
42
43#include <Standard_Version.hxx>
44
45#include <ngspice/sharedspice.h>
46
47// The include file version.h is always created even if the repo version cannot be
48// determined. In this case KICAD_VERSION_FULL will default to the KICAD_VERSION
49// that is set in KiCadVersion.cmake.
50#define INCLUDE_KICAD_VERSION
51#include <kicad_build_version.h>
52#undef INCLUDE_KICAD_VERSION
53
54// Remember OpenGL info
55static wxString s_glVendor;
56static wxString s_glRenderer;
57static wxString s_glVersion;
58
59void SetOpenGLInfo( const char* aVendor, const char* aRenderer, const char* aVersion )
60{
61 s_glVendor = wxString::FromUTF8( aVendor );
62 s_glRenderer = wxString::FromUTF8( aRenderer );
63 s_glVersion = wxString::FromUTF8( aVersion );
64}
65
66
68{
69 wxPlatformInfo platform;
70 return platform.GetBitnessName();
71}
72
73
75{
76 return !!KICAD_IS_NIGHTLY;
77}
78
79
81{
82 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_VERSION_FULL ) );
83 return msg;
84}
85
86
88{
89 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_VERSION ) );
90 return msg;
91}
92
93
94wxString GetBuildDate()
95{
96 wxString msg = wxString::Format( wxT( "%s %s" ), wxT( __DATE__ ), wxT( __TIME__ ) );
97 return msg;
98}
99
100
102{
103 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_SEMANTIC_VERSION ) );
104 return msg;
105}
106
107
109{
110 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_MAJOR_MINOR_VERSION ) );
111 return msg;
112}
113
114
116{
117 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_COMMIT_HASH ) );
118 return msg;
119}
120
121
123{
124 wxString msg = wxString::Format( wxT( "%s" ), wxT( KICAD_MAJOR_MINOR_PATCH_VERSION ) );
125 return msg;
126}
127
128const std::tuple<int,int,int>& GetMajorMinorPatchTuple()
129{
130 static std::tuple<int, int, int> retval = KICAD_MAJOR_MINOR_PATCH_TUPLE;
131
132 return retval;
133}
134
135
136wxString GetVersionInfoData( const wxString& aTitle, bool aHtml, bool aBrief )
137{
138 wxString aMsg;
139 // DO NOT translate information in the msg_version string
140
141 wxString eol = aHtml ? "<br>" : "\n";
142
143 // Tabs instead of spaces for the plaintext version for shorter string length
144 wxString indent4 = aHtml ? "&nbsp;&nbsp;&nbsp;&nbsp;" : "\t";
145
146#define ON "ON" << eol
147#define OFF "OFF" << eol
148
149 wxString version;
150 version << ( KIPLATFORM::APP::IsOperatingSystemUnsupported() ? wxString( wxS( "(UNSUPPORTED)" ) )
151 : GetBuildVersion() )
152#ifdef DEBUG
153 << ", debug"
154#else
155 << ", release"
156#endif
157 << " build";
158
159 wxPlatformInfo platform;
160 aMsg << "Application: " << aTitle;
161 aMsg << " " << wxGetCpuArchitectureName() << " on " << wxGetNativeCpuArchitectureName();
162
163 aMsg << eol << eol;
164
165
166 aMsg << "Version: " << version << eol << eol;
167 aMsg << "Libraries:" << eol;
168
169 aMsg << indent4 << wxGetLibraryVersionInfo().GetVersionString() << eol;
170
171 aMsg << indent4 << "FreeType " << KIFONT::VERSION_INFO::FreeType() << eol;
172 aMsg << indent4 << "HarfBuzz " << KIFONT::VERSION_INFO::HarfBuzz() << eol;
173 aMsg << indent4 << "FontConfig " << KIFONT::VERSION_INFO::FontConfig() << eol;
174
175 if( !aBrief )
176 aMsg << indent4 << GetKicadCurlVersion() << eol;
177
178 aMsg << eol;
179
180 wxString osDescription;
181
182#if __LINUX__
183 osDescription = wxGetLinuxDistributionInfo().Description;
184#endif
185
186 // Linux uses the lsb-release program to get the description of the OS, if lsb-release
187 // isn't installed, then the string will be empty and we fallback to the method used on
188 // the other platforms (to at least get the kernel/uname info).
189 if( osDescription.empty() )
190 osDescription = wxGetOsDescription();
191
192 aMsg << "Platform: "
193 << osDescription << ", "
194 << GetPlatformGetBitnessName() << ", "
195 << platform.GetEndiannessName() << ", "
196 << platform.GetPortIdName();
197
198#ifdef __WXGTK__
199 if( wxTheApp && wxTheApp->IsGUI() )
200 {
201 aMsg << ", ";
202
203 switch( wxGetDisplayInfo().type )
204 {
205 case wxDisplayX11: aMsg << "X11"; break;
206 case wxDisplayWayland: aMsg << "Wayland"; break;
207 case wxDisplayNone: aMsg << "None"; break;
208 default: aMsg << "Unknown";
209 }
210 }
211
212 aMsg << ", " << wxGetenv( "XDG_SESSION_DESKTOP" )
213 << ", " << wxGetenv( "XDG_SESSION_TYPE" );
214#endif
215
216 if( !s_glVendor.empty() || !s_glRenderer.empty() || !s_glVersion.empty() )
217 {
218 aMsg << eol;
219 aMsg << "OpenGL: " << s_glVendor << ", " << s_glRenderer << ", " << s_glVersion;
220 }
221
222 aMsg << eol << eol;
223
224 if( !aBrief )
225 {
226 aMsg << "Build Info:" << eol;
227 aMsg << indent4 << "Date: " << GetBuildDate() << eol;
228 }
229
230 aMsg << indent4 << "wxWidgets: " << wxVERSION_NUM_DOT_STRING << " (";
231 aMsg << __WX_BO_UNICODE __WX_BO_STL;
232
233// wx changed compatibility macros in 3.3, adding the 3.0 macro and removing the 2.8 macro
234#if wxCHECK_VERSION( 3, 3, 0 )
235 aMsg << __WX_BO_WXWIN_COMPAT_3_0 ")";
236#else
237 aMsg << __WX_BO_WXWIN_COMPAT_2_8 ")";
238#endif
239
240 // Get the GTK+ version where possible.
241#ifdef __WXGTK__
242 int major, minor;
243
244 major = wxPlatformInfo().Get().GetToolkitMajorVersion();
245 minor = wxPlatformInfo().Get().GetToolkitMinorVersion();
246 aMsg << " GTK+ " << major << "." << minor;
247#endif
248
249 aMsg << eol;
250
251 aMsg << indent4 << "Boost: " << ( BOOST_VERSION / 100000 ) << wxT( "." )
252 << ( BOOST_VERSION / 100 % 1000 ) << wxT( "." )
253 << ( BOOST_VERSION % 100 ) << eol;
254
255 aMsg << indent4 << "OCC: " << OCC_VERSION_COMPLETE << eol;
256 aMsg << indent4 << "Curl: " << GetCurlLibVersion() << eol;
257
258#if defined( NGSPICE_BUILD_VERSION )
259 aMsg << indent4 << "ngspice: " << NGSPICE_BUILD_VERSION << eol;
260#elif defined( NGSPICE_HAVE_CONFIG_H )
261 #undef HAVE_STRNCASECMP /* is redefined in ngspice/config.h */
262 #include <ngspice/config.h>
263 aMsg << indent4 << "ngspice: " << PACKAGE_VERSION << eol;
264#elif defined( NGSPICE_PACKAGE_VERSION )
265 aMsg << indent4 << "ngspice: " << NGSPICE_PACKAGE_VERSION << eol;
266#else
267 aMsg << indent4 << "ngspice: " << "unknown" << eol;
268#endif
269
270 aMsg << indent4 << "Compiler: ";
271#if defined(__clang__)
272 aMsg << "Clang " << __clang_major__ << "." << __clang_minor__ << "." << __clang_patchlevel__;
273#elif defined(__GNUG__)
274 aMsg << "GCC " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__;
275#elif defined(_MSC_VER)
276 aMsg << "Visual C++ " << _MSC_VER;
277#elif defined(__INTEL_COMPILER)
278 aMsg << "Intel C++ " << __INTEL_COMPILER;
279#else
280 aMsg << "Other Compiler ";
281#endif
282
283#if defined(__GXX_ABI_VERSION)
284 aMsg << " with C++ ABI " << __GXX_ABI_VERSION << eol;
285#else
286 aMsg << " without C++ ABI" << eol;
287#endif
288
289 // Add build settings config (build options):
290#if defined( KICAD_USE_EGL ) || ! defined( NDEBUG )
291 aMsg << eol;
292 aMsg << "Build settings:" << eol;
293#endif
294
295#ifdef KICAD_USE_EGL
296 aMsg << indent4 << "KICAD_USE_EGL=" << ON;
297#endif
298
299#ifdef KICAD_IPC_API
300 aMsg << indent4 << "KICAD_IPC_API=" << ON;
301#else
302 aMsg << indent4 << "KICAD_IPC_API=" << OFF;
303#endif
304
305#ifndef NDEBUG
306 aMsg << indent4 << "KICAD_STDLIB_DEBUG=";
307#ifdef KICAD_STDLIB_DEBUG
308 aMsg << ON;
309#else
310 aMsg << OFF;
311 aMsg << indent4 << "KICAD_STDLIB_LIGHT_DEBUG=";
312#ifdef KICAD_STDLIB_LIGHT_DEBUG
313 aMsg << ON;
314#else
315 aMsg << OFF;
316#endif
317#endif
318
319 aMsg << indent4 << "KICAD_SANITIZE_ADDRESS=";
320#ifdef KICAD_SANITIZE_ADDRESS
321 aMsg << ON;
322#else
323 aMsg << OFF;
324#endif
325
326 aMsg << indent4 << "KICAD_SANITIZE_THREADS=";
327#ifdef KICAD_SANITIZE_THREADS
328 aMsg << ON;
329#else
330 aMsg << OFF;
331#endif
332#endif
333
334 wxLocale* locale = wxGetLocale();
335
336 if( locale )
337 {
338 aMsg << eol;
339 aMsg << "Locale: " << eol;
340 aMsg << indent4 << "Lang: " << locale->GetCanonicalName() << eol;
341 aMsg << indent4 << "Enc: " << locale->GetSystemEncodingName() << eol;
342 aMsg << indent4 << "Num: "
343 << wxString::Format( "%d%s%.1f", 1,
344 locale->GetInfo( wxLocaleInfo::wxLOCALE_THOUSANDS_SEP ), 234.5 )
345 << eol;
346
347 wxString testStr( wxS( "кΩ丈" ) );
348 wxString expectedUtf8Hex( wxS( "D0BACEA9E4B888" ) );
349 wxString sysHex, utf8Hex;
350 {
351 const char* asChar = testStr.c_str().AsChar();
352 size_t length = strlen( asChar );
353
354 for( size_t i = 0; i < length; i++ )
355 sysHex << wxString::Format( "%02X", (unsigned int) (uint8_t) asChar[i] );
356 }
357 {
358 const char* asChar = testStr.utf8_str().data();
359 size_t length = strlen( asChar );
360
361 for( size_t i = 0; i < length; i++ )
362 utf8Hex << wxString::Format( "%02X", (unsigned int) (uint8_t) asChar[i] );
363 }
364
365 aMsg << indent4 << "Encoded " << testStr << ": " << sysHex << " (sys), " << utf8Hex
366 << " (utf8)" << eol;
367
368 wxASSERT_MSG( utf8Hex == expectedUtf8Hex,
369 wxString::Format( "utf8_str string %s encoding bad result: %s, expected "
370 "%s, system enc %s, lang %s",
371 testStr, utf8Hex, expectedUtf8Hex,
372 locale->GetSystemEncodingName(),
373 locale->GetCanonicalName() ) );
374 }
375
376 return aMsg;
377}
wxString GetBaseVersion()
Get the KiCad version string without the information added by the packagers.
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
wxString GetVersionInfoData(const wxString &aTitle, bool aHtml, bool aBrief)
Create a version info string for bug reports and the about dialog.
#define OFF
static wxString s_glRenderer
wxString GetCommitHash()
Get the commit hash as a string.
void SetOpenGLInfo(const char *aVendor, const char *aRenderer, const char *aVersion)
A setter for OpenGL info when it's initialized.
std::string GetCurlLibVersion()
Definition: kicad_curl.cpp:77
std::string GetKicadCurlVersion()
Definition: kicad_curl.cpp:71
static wxString s_glVendor
wxString GetMajorMinorPatchVersion()
Get the major, minor and patch version in a string major.minor.patch This is extracted by CMake from ...
static wxString s_glVersion
const std::tuple< int, int, int > & GetMajorMinorPatchTuple()
Get the build version numbers as a tuple.
wxString GetBuildVersion()
Get the full KiCad version string.
wxString GetSemanticVersion()
Get the semantic version string for KiCad defined inside the KiCadVersion.cmake file in the variable ...
wxString GetPlatformGetBitnessName()
bool IsNightlyVersion()
Check if the build is meant to be nightly.
#define ON
wxString GetBuildDate()
Get the build date as a string.
static wxString FontConfig()
static wxString FreeType()
static wxString HarfBuzz()
bool IsOperatingSystemUnsupported()
Checks if the Operating System is explicitly unsupported and we want to prevent users from sending bu...
Definition: unix/app.cpp:58
< Package version metadata Package metadata
Definition: pcm_data.h:75