mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-01-24 08:44:44 +01:00
Bandplan system
This commit is contained in:
parent
cd7e5cf1bc
commit
022898c61d
141
bandplans/germany.json
Normal file
141
bandplans/germany.json
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
{
|
||||||
|
"name": "Germany",
|
||||||
|
"country_name": "Germany",
|
||||||
|
"country_code": "DE",
|
||||||
|
"author_name": "Tobias Mädel",
|
||||||
|
"author_url": "https://tbspace.de",
|
||||||
|
"bands": [
|
||||||
|
{
|
||||||
|
"name": "LW",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 135700,
|
||||||
|
"end": 137800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "630m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 472000,
|
||||||
|
"end": 479000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "160m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1810000,
|
||||||
|
"end": 2000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3500000,
|
||||||
|
"end": 3800000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "60m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 5351500,
|
||||||
|
"end": 5366500
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7000000,
|
||||||
|
"end": 7200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "30m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 10100000,
|
||||||
|
"end": 10150000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "20m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 14000000,
|
||||||
|
"end": 14350000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "17m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 18068000,
|
||||||
|
"end": 18168000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "15m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 21000000,
|
||||||
|
"end": 21450000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "12m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 24890000,
|
||||||
|
"end": 24990000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CB",
|
||||||
|
"type": "other",
|
||||||
|
"start": 26565000,
|
||||||
|
"end": 27405000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "10m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 28000000,
|
||||||
|
"end": 29700000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "6m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 50030000,
|
||||||
|
"end": 51000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "4m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 70150000,
|
||||||
|
"end": 70200000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FM",
|
||||||
|
"type": "broadcast",
|
||||||
|
"start": 87500000,
|
||||||
|
"end": 108000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "2m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 144000000,
|
||||||
|
"end": 146000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Freenet",
|
||||||
|
"type": "other",
|
||||||
|
"start": 149025000,
|
||||||
|
"end": 149115625
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "70cm",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 430000000,
|
||||||
|
"end": 440000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PMR446",
|
||||||
|
"type": "other",
|
||||||
|
"start": 446006250,
|
||||||
|
"end": 446196875
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "23cm",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1240000000,
|
||||||
|
"end": 1300000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "13cm",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 2320000000,
|
||||||
|
"end": 2450000000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
135
bandplans/russia.json
Normal file
135
bandplans/russia.json
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
{
|
||||||
|
"name": "Russia",
|
||||||
|
"country_name": "Russia",
|
||||||
|
"country_code": "RU",
|
||||||
|
"author_name": "Raov",
|
||||||
|
"author_url": "https://twitter.com/raov_birbtog",
|
||||||
|
"bands": [
|
||||||
|
{
|
||||||
|
"name": "160m CW",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1810000,
|
||||||
|
"end": 1838000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "160m NB",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1838000,
|
||||||
|
"end": 1840000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "160m + Digi",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1840000,
|
||||||
|
"end": 1843000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "160m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 1843000,
|
||||||
|
"end": 2000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m CW",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3500000,
|
||||||
|
"end": 3510000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m CW Contest",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3510000,
|
||||||
|
"end": 3560000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m CW",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3560000,
|
||||||
|
"end": 3570000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m NB, Digi 200Hz",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3570000,
|
||||||
|
"end": 3580000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m NB, Digi 500Hz",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3580000,
|
||||||
|
"end": 3600000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m SSB Contest",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3600000,
|
||||||
|
"end": 3650000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3650000,
|
||||||
|
"end": 3700000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "80m SSB Contest",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 3700000,
|
||||||
|
"end": 3800000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "60m CW 200Hz",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 5351500,
|
||||||
|
"end": 5354000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "60m USB",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 5354000,
|
||||||
|
"end": 5366000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "60m CW 20Hz",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 5356000,
|
||||||
|
"end": 5366500
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m CW",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7000000,
|
||||||
|
"end": 7040000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m NB, Digi 500Hz",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7040000,
|
||||||
|
"end": 7050000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7050000,
|
||||||
|
"end": 7060000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m SSB Contest",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7060000,
|
||||||
|
"end": 7100000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7100000,
|
||||||
|
"end": 7130000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "40m SSB Contest",
|
||||||
|
"type": "amateur",
|
||||||
|
"start": 7130000,
|
||||||
|
"end": 7200000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
119
build_test/ALL_BUILD.vcxproj
Normal file
119
build_test/ALL_BUILD.vcxproj
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="MinSizeRel|x64">
|
||||||
|
<Configuration>MinSizeRel</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="RelWithDebInfo|x64">
|
||||||
|
<Configuration>RelWithDebInfo</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
<ProjectName>ALL_BUILD</ProjectName>
|
||||||
|
<VCProjectUpgraderObjectName>NoUpgrade</VCProjectUpgraderObjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Utility</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Utility</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Utility</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Utility</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.20506.1</_ProjectFileVersion>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<AdditionalIncludeDirectories>D:\Documents\Code\sdrpp\sdrpp;C:\Program Files\PothosSDR\include\volk;C:\Program Files\PothosSDR\include;D:\Documents\Code\sdrpp\src;D:\Documents\Code\sdrpp\src\imgui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<OutputDirectory>$(ProjectDir)/$(IntDir)</OutputDirectory>
|
||||||
|
<HeaderFileName>%(Filename).h</HeaderFileName>
|
||||||
|
<TypeLibraryName>%(Filename).tlb</TypeLibraryName>
|
||||||
|
<InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
|
||||||
|
<ProxyFileName>%(Filename)_p.c</ProxyFileName>
|
||||||
|
</Midl>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<AdditionalIncludeDirectories>D:\Documents\Code\sdrpp\sdrpp;C:\Program Files\PothosSDR\include\volk;C:\Program Files\PothosSDR\include;D:\Documents\Code\sdrpp\src;D:\Documents\Code\sdrpp\src\imgui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<OutputDirectory>$(ProjectDir)/$(IntDir)</OutputDirectory>
|
||||||
|
<HeaderFileName>%(Filename).h</HeaderFileName>
|
||||||
|
<TypeLibraryName>%(Filename).tlb</TypeLibraryName>
|
||||||
|
<InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
|
||||||
|
<ProxyFileName>%(Filename)_p.c</ProxyFileName>
|
||||||
|
</Midl>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|x64'">
|
||||||
|
<Midl>
|
||||||
|
<AdditionalIncludeDirectories>D:\Documents\Code\sdrpp\sdrpp;C:\Program Files\PothosSDR\include\volk;C:\Program Files\PothosSDR\include;D:\Documents\Code\sdrpp\src;D:\Documents\Code\sdrpp\src\imgui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<OutputDirectory>$(ProjectDir)/$(IntDir)</OutputDirectory>
|
||||||
|
<HeaderFileName>%(Filename).h</HeaderFileName>
|
||||||
|
<TypeLibraryName>%(Filename).tlb</TypeLibraryName>
|
||||||
|
<InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
|
||||||
|
<ProxyFileName>%(Filename)_p.c</ProxyFileName>
|
||||||
|
</Midl>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'">
|
||||||
|
<Midl>
|
||||||
|
<AdditionalIncludeDirectories>D:\Documents\Code\sdrpp\sdrpp;C:\Program Files\PothosSDR\include\volk;C:\Program Files\PothosSDR\include;D:\Documents\Code\sdrpp\src;D:\Documents\Code\sdrpp\src\imgui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<OutputDirectory>$(ProjectDir)/$(IntDir)</OutputDirectory>
|
||||||
|
<HeaderFileName>%(Filename).h</HeaderFileName>
|
||||||
|
<TypeLibraryName>%(Filename).tlb</TypeLibraryName>
|
||||||
|
<InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
|
||||||
|
<ProxyFileName>%(Filename)_p.c</ProxyFileName>
|
||||||
|
</Midl>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="D:\Documents\Code\sdrpp\build_test\ZERO_CHECK.vcxproj">
|
||||||
|
<Project>{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}</Project>
|
||||||
|
<Name>ZERO_CHECK</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="D:\Documents\Code\sdrpp\build_test\sdrpp.vcxproj">
|
||||||
|
<Project>{DD63A504-584E-36F8-BFCC-57C2EBA9085B}</Project>
|
||||||
|
<Name>sdrpp</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
5
build_test/ALL_BUILD.vcxproj.filters
Normal file
5
build_test/ALL_BUILD.vcxproj.filters
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
338
build_test/CMakeCache.txt
Normal file
338
build_test/CMakeCache.txt
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
# This is the CMakeCache file.
|
||||||
|
# For build in directory: d:/Documents/Code/sdrpp/build_test
|
||||||
|
# It was generated by CMake: C:/Program Files/CMake/bin/cmake.exe
|
||||||
|
# You can edit this file to change values found and used by cmake.
|
||||||
|
# If you do not want to change any of the values, simply exit the editor.
|
||||||
|
# If you do want to change a value, simply edit, save, and exit the editor.
|
||||||
|
# The syntax for the file is as follows:
|
||||||
|
# KEY:TYPE=VALUE
|
||||||
|
# KEY is the name of a variable in the cache.
|
||||||
|
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
|
||||||
|
# VALUE is the current value for the KEY.
|
||||||
|
|
||||||
|
########################
|
||||||
|
# EXTERNAL cache entries
|
||||||
|
########################
|
||||||
|
|
||||||
|
//Semicolon separated list of supported configuration types, only
|
||||||
|
// supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything
|
||||||
|
// else will be ignored.
|
||||||
|
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
|
||||||
|
|
||||||
|
//Flags used by the CXX compiler during all build types.
|
||||||
|
CMAKE_CXX_FLAGS:STRING=/DWIN32 /D_WINDOWS /W3 /GR /EHsc
|
||||||
|
|
||||||
|
//Flags used by the CXX compiler during DEBUG builds.
|
||||||
|
CMAKE_CXX_FLAGS_DEBUG:STRING=/MDd /Zi /Ob0 /Od /RTC1
|
||||||
|
|
||||||
|
//Flags used by the CXX compiler during MINSIZEREL builds.
|
||||||
|
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=/MD /O1 /Ob1 /DNDEBUG
|
||||||
|
|
||||||
|
//Flags used by the CXX compiler during RELEASE builds.
|
||||||
|
CMAKE_CXX_FLAGS_RELEASE:STRING=/MD /O2 /Ob2 /DNDEBUG
|
||||||
|
|
||||||
|
//Flags used by the CXX compiler during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=/MD /Zi /O2 /Ob1 /DNDEBUG
|
||||||
|
|
||||||
|
//Libraries linked by default with all C++ applications.
|
||||||
|
CMAKE_CXX_STANDARD_LIBRARIES:STRING=kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
|
||||||
|
|
||||||
|
//Flags used by the C compiler during all build types.
|
||||||
|
CMAKE_C_FLAGS:STRING=/DWIN32 /D_WINDOWS /W3
|
||||||
|
|
||||||
|
//Flags used by the C compiler during DEBUG builds.
|
||||||
|
CMAKE_C_FLAGS_DEBUG:STRING=/MDd /Zi /Ob0 /Od /RTC1
|
||||||
|
|
||||||
|
//Flags used by the C compiler during MINSIZEREL builds.
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL:STRING=/MD /O1 /Ob1 /DNDEBUG
|
||||||
|
|
||||||
|
//Flags used by the C compiler during RELEASE builds.
|
||||||
|
CMAKE_C_FLAGS_RELEASE:STRING=/MD /O2 /Ob2 /DNDEBUG
|
||||||
|
|
||||||
|
//Flags used by the C compiler during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=/MD /Zi /O2 /Ob1 /DNDEBUG
|
||||||
|
|
||||||
|
//Libraries linked by default with all C applications.
|
||||||
|
CMAKE_C_STANDARD_LIBRARIES:STRING=kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
|
||||||
|
|
||||||
|
//Flags used by the linker during all build types.
|
||||||
|
CMAKE_EXE_LINKER_FLAGS:STRING=/machine:x64
|
||||||
|
|
||||||
|
//Flags used by the linker during DEBUG builds.
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//Flags used by the linker during MINSIZEREL builds.
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during RELEASE builds.
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//Install path prefix, prepended onto install directories.
|
||||||
|
CMAKE_INSTALL_PREFIX:PATH=C:/Program Files/sdrpp
|
||||||
|
|
||||||
|
//Path to a program.
|
||||||
|
CMAKE_LINKER:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of modules during
|
||||||
|
// all build types.
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of modules during
|
||||||
|
// DEBUG builds.
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of modules during
|
||||||
|
// MINSIZEREL builds.
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of modules during
|
||||||
|
// RELEASE builds.
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of modules during
|
||||||
|
// RELWITHDEBINFO builds.
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//Value Computed by CMake
|
||||||
|
CMAKE_PROJECT_NAME:STATIC=sdrpp
|
||||||
|
|
||||||
|
//RC compiler
|
||||||
|
CMAKE_RC_COMPILER:FILEPATH=rc
|
||||||
|
|
||||||
|
//Flags for Windows Resource Compiler during all build types.
|
||||||
|
CMAKE_RC_FLAGS:STRING=/DWIN32
|
||||||
|
|
||||||
|
//Flags for Windows Resource Compiler during DEBUG builds.
|
||||||
|
CMAKE_RC_FLAGS_DEBUG:STRING=/D_DEBUG
|
||||||
|
|
||||||
|
//Flags for Windows Resource Compiler during MINSIZEREL builds.
|
||||||
|
CMAKE_RC_FLAGS_MINSIZEREL:STRING=
|
||||||
|
|
||||||
|
//Flags for Windows Resource Compiler during RELEASE builds.
|
||||||
|
CMAKE_RC_FLAGS_RELEASE:STRING=
|
||||||
|
|
||||||
|
//Flags for Windows Resource Compiler during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_RC_FLAGS_RELWITHDEBINFO:STRING=
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of shared libraries
|
||||||
|
// during all build types.
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS:STRING=/machine:x64
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of shared libraries
|
||||||
|
// during DEBUG builds.
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of shared libraries
|
||||||
|
// during MINSIZEREL builds.
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of shared libraries
|
||||||
|
// during RELEASE builds.
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of shared libraries
|
||||||
|
// during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug /INCREMENTAL
|
||||||
|
|
||||||
|
//If set, runtime paths are not added when installing shared libraries,
|
||||||
|
// but are added when building.
|
||||||
|
CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
|
||||||
|
|
||||||
|
//If set, runtime paths are not added when using shared libraries.
|
||||||
|
CMAKE_SKIP_RPATH:BOOL=NO
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of static libraries
|
||||||
|
// during all build types.
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS:STRING=/machine:x64
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of static libraries
|
||||||
|
// during DEBUG builds.
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of static libraries
|
||||||
|
// during MINSIZEREL builds.
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of static libraries
|
||||||
|
// during RELEASE builds.
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
|
||||||
|
|
||||||
|
//Flags used by the linker during the creation of static libraries
|
||||||
|
// during RELWITHDEBINFO builds.
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
|
||||||
|
|
||||||
|
//The CMake toolchain file
|
||||||
|
CMAKE_TOOLCHAIN_FILE:FILEPATH=C:/Users/Alex/vcpkg/scripts/buildsystems/vcpkg.cmake
|
||||||
|
|
||||||
|
//If this value is on, makefiles will be generated without the
|
||||||
|
// .SILENT directive, and all commands will be echoed to the console
|
||||||
|
// during the make. This is useful for debugging only. With Visual
|
||||||
|
// Studio IDE projects all commands are done without /nologo.
|
||||||
|
CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
|
||||||
|
|
||||||
|
//The directory containing a CMake configuration file for FFTW3.
|
||||||
|
FFTW3_DIR:PATH=C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3
|
||||||
|
|
||||||
|
//The directory containing a CMake configuration file for FFTW3f.
|
||||||
|
FFTW3f_DIR:PATH=C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f
|
||||||
|
|
||||||
|
//The directory containing a CMake configuration file for GLEW.
|
||||||
|
GLEW_DIR:PATH=C:/Users/Alex/vcpkg/installed/x64-windows/share/glew
|
||||||
|
|
||||||
|
//Automatically copy dependencies into the output directory for
|
||||||
|
// executables.
|
||||||
|
VCPKG_APPLOCAL_DEPS:BOOL=ON
|
||||||
|
|
||||||
|
//Vcpkg target triplet (ex. x86-windows)
|
||||||
|
VCPKG_TARGET_TRIPLET:STRING=x64-windows
|
||||||
|
|
||||||
|
//Enables messages from the VCPKG toolchain for debugging purposes.
|
||||||
|
VCPKG_VERBOSE:BOOL=OFF
|
||||||
|
|
||||||
|
//The directory containing a CMake configuration file for glfw3.
|
||||||
|
glfw3_DIR:PATH=C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3
|
||||||
|
|
||||||
|
//The directory containing a CMake configuration file for portaudio.
|
||||||
|
portaudio_DIR:PATH=C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio
|
||||||
|
|
||||||
|
//Value Computed by CMake
|
||||||
|
sdrpp_BINARY_DIR:STATIC=D:/Documents/Code/sdrpp/build_test
|
||||||
|
|
||||||
|
//Value Computed by CMake
|
||||||
|
sdrpp_SOURCE_DIR:STATIC=D:/Documents/Code/sdrpp
|
||||||
|
|
||||||
|
|
||||||
|
########################
|
||||||
|
# INTERNAL cache entries
|
||||||
|
########################
|
||||||
|
|
||||||
|
//This is the directory where this CMakeCache.txt was created
|
||||||
|
CMAKE_CACHEFILE_DIR:INTERNAL=d:/Documents/Code/sdrpp/build_test
|
||||||
|
//Major version of cmake used to create the current loaded cache
|
||||||
|
CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3
|
||||||
|
//Minor version of cmake used to create the current loaded cache
|
||||||
|
CMAKE_CACHE_MINOR_VERSION:INTERNAL=12
|
||||||
|
//Patch version of cmake used to create the current loaded cache
|
||||||
|
CMAKE_CACHE_PATCH_VERSION:INTERNAL=1
|
||||||
|
//Path to CMake executable.
|
||||||
|
CMAKE_COMMAND:INTERNAL=C:/Program Files/CMake/bin/cmake.exe
|
||||||
|
//Path to cpack program executable.
|
||||||
|
CMAKE_CPACK_COMMAND:INTERNAL=C:/Program Files/CMake/bin/cpack.exe
|
||||||
|
//Path to ctest program executable.
|
||||||
|
CMAKE_CTEST_COMMAND:INTERNAL=C:/Program Files/CMake/bin/ctest.exe
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_FLAGS
|
||||||
|
CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
|
||||||
|
CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
|
||||||
|
CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES
|
||||||
|
CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_FLAGS
|
||||||
|
CMAKE_C_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG
|
||||||
|
CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES
|
||||||
|
CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1
|
||||||
|
//Executable file format
|
||||||
|
CMAKE_EXECUTABLE_FORMAT:INTERNAL=Unknown
|
||||||
|
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
|
||||||
|
CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//Name of external makefile project generator.
|
||||||
|
CMAKE_EXTRA_GENERATOR:INTERNAL=
|
||||||
|
//Name of generator.
|
||||||
|
CMAKE_GENERATOR:INTERNAL=Visual Studio 15 2017 Win64
|
||||||
|
//Generator instance identifier.
|
||||||
|
CMAKE_GENERATOR_INSTANCE:INTERNAL=C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise
|
||||||
|
//Name of generator platform.
|
||||||
|
CMAKE_GENERATOR_PLATFORM:INTERNAL=
|
||||||
|
//Name of generator toolset.
|
||||||
|
CMAKE_GENERATOR_TOOLSET:INTERNAL=
|
||||||
|
//Source directory with the top level CMakeLists.txt file for this
|
||||||
|
// project
|
||||||
|
CMAKE_HOME_DIRECTORY:INTERNAL=D:/Documents/Code/sdrpp
|
||||||
|
//ADVANCED property for variable: CMAKE_LINKER
|
||||||
|
CMAKE_LINKER-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//number of local generators
|
||||||
|
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1
|
||||||
|
//Platform information initialized
|
||||||
|
CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_COMPILER
|
||||||
|
CMAKE_RC_COMPILER-ADVANCED:INTERNAL=1
|
||||||
|
CMAKE_RC_COMPILER_WORKS:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_FLAGS
|
||||||
|
CMAKE_RC_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_FLAGS_DEBUG
|
||||||
|
CMAKE_RC_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_RC_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELEASE
|
||||||
|
CMAKE_RC_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_RC_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_RC_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//Path to CMake installation.
|
||||||
|
CMAKE_ROOT:INTERNAL=C:/Program Files/CMake/share/cmake-3.12
|
||||||
|
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
|
||||||
|
CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_SKIP_RPATH
|
||||||
|
CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_TOOLCHAIN_FILE
|
||||||
|
CMAKE_TOOLCHAIN_FILE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
|
||||||
|
CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
|
||||||
|
//ADVANCED property for variable: VCPKG_VERBOSE
|
||||||
|
VCPKG_VERBOSE-ADVANCED:INTERNAL=1
|
||||||
|
//Vcpkg root directory
|
||||||
|
_VCPKG_ROOT_DIR:INTERNAL=C:/Users/Alex/vcpkg
|
||||||
|
|
73
build_test/CMakeFiles/3.12.1/CMakeCCompiler.cmake
Normal file
73
build_test/CMakeFiles/3.12.1/CMakeCCompiler.cmake
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
set(CMAKE_C_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/cl.exe")
|
||||||
|
set(CMAKE_C_COMPILER_ARG1 "")
|
||||||
|
set(CMAKE_C_COMPILER_ID "MSVC")
|
||||||
|
set(CMAKE_C_COMPILER_VERSION "19.15.26730.0")
|
||||||
|
set(CMAKE_C_COMPILER_VERSION_INTERNAL "")
|
||||||
|
set(CMAKE_C_COMPILER_WRAPPER "")
|
||||||
|
set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "90")
|
||||||
|
set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_std_99;c_std_11;c_function_prototypes;c_variadic_macros")
|
||||||
|
set(CMAKE_C90_COMPILE_FEATURES "")
|
||||||
|
set(CMAKE_C99_COMPILE_FEATURES "")
|
||||||
|
set(CMAKE_C11_COMPILE_FEATURES "")
|
||||||
|
|
||||||
|
set(CMAKE_C_PLATFORM_ID "Windows")
|
||||||
|
set(CMAKE_C_SIMULATE_ID "")
|
||||||
|
set(CMAKE_C_SIMULATE_VERSION "")
|
||||||
|
set(CMAKE_C_COMPILER_ARCHITECTURE_ID x64)
|
||||||
|
set(MSVC_C_ARCHITECTURE_ID x64)
|
||||||
|
|
||||||
|
set(CMAKE_AR "")
|
||||||
|
set(CMAKE_C_COMPILER_AR "")
|
||||||
|
set(CMAKE_RANLIB "")
|
||||||
|
set(CMAKE_C_COMPILER_RANLIB "")
|
||||||
|
set(CMAKE_LINKER "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe")
|
||||||
|
set(CMAKE_COMPILER_IS_GNUCC )
|
||||||
|
set(CMAKE_C_COMPILER_LOADED 1)
|
||||||
|
set(CMAKE_C_COMPILER_WORKS TRUE)
|
||||||
|
set(CMAKE_C_ABI_COMPILED TRUE)
|
||||||
|
set(CMAKE_COMPILER_IS_MINGW )
|
||||||
|
set(CMAKE_COMPILER_IS_CYGWIN )
|
||||||
|
if(CMAKE_COMPILER_IS_CYGWIN)
|
||||||
|
set(CYGWIN 1)
|
||||||
|
set(UNIX 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER_ENV_VAR "CC")
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_MINGW)
|
||||||
|
set(MINGW 1)
|
||||||
|
endif()
|
||||||
|
set(CMAKE_C_COMPILER_ID_RUN 1)
|
||||||
|
set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m)
|
||||||
|
set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
|
||||||
|
set(CMAKE_C_LINKER_PREFERENCE 10)
|
||||||
|
|
||||||
|
# Save compiler ABI information.
|
||||||
|
set(CMAKE_C_SIZEOF_DATA_PTR "8")
|
||||||
|
set(CMAKE_C_COMPILER_ABI "")
|
||||||
|
set(CMAKE_C_LIBRARY_ARCHITECTURE "")
|
||||||
|
|
||||||
|
if(CMAKE_C_SIZEOF_DATA_PTR)
|
||||||
|
set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_ABI)
|
||||||
|
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_LIBRARY_ARCHITECTURE)
|
||||||
|
set(CMAKE_LIBRARY_ARCHITECTURE "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "")
|
||||||
|
if(CMAKE_C_CL_SHOWINCLUDES_PREFIX)
|
||||||
|
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "")
|
||||||
|
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "")
|
||||||
|
set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
|
76
build_test/CMakeFiles/3.12.1/CMakeCXXCompiler.cmake
Normal file
76
build_test/CMakeFiles/3.12.1/CMakeCXXCompiler.cmake
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
set(CMAKE_CXX_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/cl.exe")
|
||||||
|
set(CMAKE_CXX_COMPILER_ARG1 "")
|
||||||
|
set(CMAKE_CXX_COMPILER_ID "MSVC")
|
||||||
|
set(CMAKE_CXX_COMPILER_VERSION "19.15.26730.0")
|
||||||
|
set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
|
||||||
|
set(CMAKE_CXX_COMPILER_WRAPPER "")
|
||||||
|
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14")
|
||||||
|
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_11;cxx_std_98;cxx_aggregate_default_initializers;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_attribute_deprecated;cxx_auto_type;cxx_binary_literals;cxx_constexpr;cxx_contextual_conversions;cxx_decltype;cxx_decltype_auto;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_digit_separators;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_generic_lambdas;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_lambda_init_captures;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_return_type_deduction;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_template_template_parameters;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variable_templates;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_std_17;cxx_std_20")
|
||||||
|
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_11;cxx_std_98;cxx_aggregate_default_initializers;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_attribute_deprecated;cxx_auto_type;cxx_binary_literals;cxx_constexpr;cxx_contextual_conversions;cxx_decltype;cxx_decltype_auto;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_digit_separators;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_generic_lambdas;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_lambda_init_captures;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_return_type_deduction;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_template_template_parameters;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variable_templates;cxx_variadic_macros;cxx_variadic_templates")
|
||||||
|
set(CMAKE_CXX11_COMPILE_FEATURES "")
|
||||||
|
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14")
|
||||||
|
set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17")
|
||||||
|
set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_PLATFORM_ID "Windows")
|
||||||
|
set(CMAKE_CXX_SIMULATE_ID "")
|
||||||
|
set(CMAKE_CXX_SIMULATE_VERSION "")
|
||||||
|
set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID x64)
|
||||||
|
set(MSVC_CXX_ARCHITECTURE_ID x64)
|
||||||
|
|
||||||
|
set(CMAKE_AR "")
|
||||||
|
set(CMAKE_CXX_COMPILER_AR "")
|
||||||
|
set(CMAKE_RANLIB "")
|
||||||
|
set(CMAKE_CXX_COMPILER_RANLIB "")
|
||||||
|
set(CMAKE_LINKER "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/link.exe")
|
||||||
|
set(CMAKE_COMPILER_IS_GNUCXX )
|
||||||
|
set(CMAKE_CXX_COMPILER_LOADED 1)
|
||||||
|
set(CMAKE_CXX_COMPILER_WORKS TRUE)
|
||||||
|
set(CMAKE_CXX_ABI_COMPILED TRUE)
|
||||||
|
set(CMAKE_COMPILER_IS_MINGW )
|
||||||
|
set(CMAKE_COMPILER_IS_CYGWIN )
|
||||||
|
if(CMAKE_COMPILER_IS_CYGWIN)
|
||||||
|
set(CYGWIN 1)
|
||||||
|
set(UNIX 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_MINGW)
|
||||||
|
set(MINGW 1)
|
||||||
|
endif()
|
||||||
|
set(CMAKE_CXX_COMPILER_ID_RUN 1)
|
||||||
|
set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
|
||||||
|
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP)
|
||||||
|
set(CMAKE_CXX_LINKER_PREFERENCE 30)
|
||||||
|
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
|
||||||
|
|
||||||
|
# Save compiler ABI information.
|
||||||
|
set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
|
||||||
|
set(CMAKE_CXX_COMPILER_ABI "")
|
||||||
|
set(CMAKE_CXX_LIBRARY_ARCHITECTURE "")
|
||||||
|
|
||||||
|
if(CMAKE_CXX_SIZEOF_DATA_PTR)
|
||||||
|
set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_ABI)
|
||||||
|
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
|
||||||
|
set(CMAKE_LIBRARY_ARCHITECTURE "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "")
|
||||||
|
if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX)
|
||||||
|
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
|
||||||
|
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
|
||||||
|
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
|
BIN
build_test/CMakeFiles/3.12.1/CMakeDetermineCompilerABI_C.bin
Normal file
BIN
build_test/CMakeFiles/3.12.1/CMakeDetermineCompilerABI_C.bin
Normal file
Binary file not shown.
BIN
build_test/CMakeFiles/3.12.1/CMakeDetermineCompilerABI_CXX.bin
Normal file
BIN
build_test/CMakeFiles/3.12.1/CMakeDetermineCompilerABI_CXX.bin
Normal file
Binary file not shown.
6
build_test/CMakeFiles/3.12.1/CMakeRCCompiler.cmake
Normal file
6
build_test/CMakeFiles/3.12.1/CMakeRCCompiler.cmake
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
set(CMAKE_RC_COMPILER "rc")
|
||||||
|
set(CMAKE_RC_COMPILER_ARG1 "")
|
||||||
|
set(CMAKE_RC_COMPILER_LOADED 1)
|
||||||
|
set(CMAKE_RC_SOURCE_FILE_EXTENSIONS rc;RC)
|
||||||
|
set(CMAKE_RC_OUTPUT_EXTENSION .res)
|
||||||
|
set(CMAKE_RC_COMPILER_ENV_VAR "RC")
|
15
build_test/CMakeFiles/3.12.1/CMakeSystem.cmake
Normal file
15
build_test/CMakeFiles/3.12.1/CMakeSystem.cmake
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
set(CMAKE_HOST_SYSTEM "Windows-10.0.18362")
|
||||||
|
set(CMAKE_HOST_SYSTEM_NAME "Windows")
|
||||||
|
set(CMAKE_HOST_SYSTEM_VERSION "10.0.18362")
|
||||||
|
set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64")
|
||||||
|
|
||||||
|
include("C:/Users/Alex/vcpkg/scripts/buildsystems/vcpkg.cmake")
|
||||||
|
|
||||||
|
set(CMAKE_SYSTEM "Windows-10.0.18362")
|
||||||
|
set(CMAKE_SYSTEM_NAME "Windows")
|
||||||
|
set(CMAKE_SYSTEM_VERSION "10.0.18362")
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR "AMD64")
|
||||||
|
|
||||||
|
set(CMAKE_CROSSCOMPILING "FALSE")
|
||||||
|
|
||||||
|
set(CMAKE_SYSTEM_LOADED 1)
|
623
build_test/CMakeFiles/3.12.1/CompilerIdC/CMakeCCompilerId.c
Normal file
623
build_test/CMakeFiles/3.12.1/CompilerIdC/CMakeCCompilerId.c
Normal file
@ -0,0 +1,623 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
# error "A C++ compiler has been selected for C."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__18CXX)
|
||||||
|
# define ID_VOID_MAIN
|
||||||
|
#endif
|
||||||
|
#if defined(__CLASSIC_C__)
|
||||||
|
/* cv-qualifiers did not exist in K&R C */
|
||||||
|
# define const
|
||||||
|
# define volatile
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Version number components: V=Version, R=Revision, P=Patch
|
||||||
|
Version date components: YYYY=Year, MM=Month, DD=Day */
|
||||||
|
|
||||||
|
#if defined(__INTEL_COMPILER) || defined(__ICC)
|
||||||
|
# define COMPILER_ID "Intel"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
/* __INTEL_COMPILER = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
|
||||||
|
# if defined(__INTEL_COMPILER_UPDATE)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
|
||||||
|
# else
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
|
||||||
|
# endif
|
||||||
|
# if defined(__INTEL_COMPILER_BUILD_DATE)
|
||||||
|
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
|
||||||
|
# endif
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__PATHCC__)
|
||||||
|
# define COMPILER_ID "PathScale"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
|
||||||
|
# if defined(__PATHCC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
|
||||||
|
# define COMPILER_ID "Embarcadero"
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
# define COMPILER_ID "Borland"
|
||||||
|
/* __BORLANDC__ = 0xVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
|
||||||
|
# define COMPILER_ID "Watcom"
|
||||||
|
/* __WATCOMC__ = VVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
|
||||||
|
# if (__WATCOMC__ % 10) > 0
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# define COMPILER_ID "OpenWatcom"
|
||||||
|
/* __WATCOMC__ = VVRP + 1100 */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
|
||||||
|
# if (__WATCOMC__ % 10) > 0
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__SUNPRO_C)
|
||||||
|
# define COMPILER_ID "SunPro"
|
||||||
|
# if __SUNPRO_C >= 0x5100
|
||||||
|
/* __SUNPRO_C = 0xVRRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
|
||||||
|
# else
|
||||||
|
/* __SUNPRO_CC = 0xVRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__HP_cc)
|
||||||
|
# define COMPILER_ID "HP"
|
||||||
|
/* __HP_cc = VVRRPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
|
||||||
|
|
||||||
|
#elif defined(__DECC)
|
||||||
|
# define COMPILER_ID "Compaq"
|
||||||
|
/* __DECC_VER = VVRRTPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
|
||||||
|
|
||||||
|
#elif defined(__IBMC__) && defined(__COMPILER_VER__)
|
||||||
|
# define COMPILER_ID "zOS"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMC__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)
|
||||||
|
# define COMPILER_ID "XL"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMC__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
|
||||||
|
# define COMPILER_ID "VisualAge"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMC__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__PGI)
|
||||||
|
# define COMPILER_ID "PGI"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
|
||||||
|
# if defined(__PGIC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(_CRAYC)
|
||||||
|
# define COMPILER_ID "Cray"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
|
||||||
|
|
||||||
|
#elif defined(__TI_COMPILER_VERSION__)
|
||||||
|
# define COMPILER_ID "TI"
|
||||||
|
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
|
||||||
|
|
||||||
|
#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
|
||||||
|
# define COMPILER_ID "Fujitsu"
|
||||||
|
|
||||||
|
#elif defined(__TINYC__)
|
||||||
|
# define COMPILER_ID "TinyCC"
|
||||||
|
|
||||||
|
#elif defined(__BCC__)
|
||||||
|
# define COMPILER_ID "Bruce"
|
||||||
|
|
||||||
|
#elif defined(__SCO_VERSION__)
|
||||||
|
# define COMPILER_ID "SCO"
|
||||||
|
|
||||||
|
#elif defined(__clang__) && defined(__apple_build_version__)
|
||||||
|
# define COMPILER_ID "AppleClang"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
|
||||||
|
|
||||||
|
#elif defined(__clang__)
|
||||||
|
# define COMPILER_ID "Clang"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
# define COMPILER_ID "GNU"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
|
||||||
|
# if defined(__GNUC_MINOR__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
|
||||||
|
# endif
|
||||||
|
# if defined(__GNUC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# define COMPILER_ID "MSVC"
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# if defined(_MSC_FULL_VER)
|
||||||
|
# if _MSC_VER >= 1400
|
||||||
|
/* _MSC_FULL_VER = VVRRPPPPP */
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
|
||||||
|
# else
|
||||||
|
/* _MSC_FULL_VER = VVRRPPPP */
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if defined(_MSC_BUILD)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
|
||||||
|
# define COMPILER_ID "ADSP"
|
||||||
|
#if defined(__VISUALDSPVERSION__)
|
||||||
|
/* __VISUALDSPVERSION__ = 0xVVRRPP00 */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
|
||||||
|
# define COMPILER_ID "IAR"
|
||||||
|
# if defined(__VER__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
|
||||||
|
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__ARMCC_VERSION)
|
||||||
|
# define COMPILER_ID "ARMCC"
|
||||||
|
#if __ARMCC_VERSION >= 1000000
|
||||||
|
/* __ARMCC_VERSION = VRRPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
|
||||||
|
#else
|
||||||
|
/* __ARMCC_VERSION = VRPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
|
||||||
|
# define COMPILER_ID "SDCC"
|
||||||
|
# if defined(__SDCC_VERSION_MAJOR)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
|
||||||
|
# else
|
||||||
|
/* SDCC = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(SDCC/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(SDCC % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
|
||||||
|
# define COMPILER_ID "MIPSpro"
|
||||||
|
# if defined(_SGI_COMPILER_VERSION)
|
||||||
|
/* _SGI_COMPILER_VERSION = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
|
||||||
|
# else
|
||||||
|
/* _COMPILER_VERSION = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
/* These compilers are either not known or too old to define an
|
||||||
|
identification macro. Try to identify the platform and guess that
|
||||||
|
it is the native compiler. */
|
||||||
|
#elif defined(__sgi)
|
||||||
|
# define COMPILER_ID "MIPSpro"
|
||||||
|
|
||||||
|
#elif defined(__hpux) || defined(__hpua)
|
||||||
|
# define COMPILER_ID "HP"
|
||||||
|
|
||||||
|
#else /* unknown compiler */
|
||||||
|
# define COMPILER_ID ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the string literal in pieces to prevent the source from
|
||||||
|
getting matched. Store it in a pointer rather than an array
|
||||||
|
because some compilers will just produce instructions to fill the
|
||||||
|
array rather than assigning a pointer to a static array. */
|
||||||
|
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
|
||||||
|
#ifdef SIMULATE_ID
|
||||||
|
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
char const* qnxnto = "INFO" ":" "qnxnto[]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CRAYXE) || defined(__CRAYXC)
|
||||||
|
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STRINGIFY_HELPER(X) #X
|
||||||
|
#define STRINGIFY(X) STRINGIFY_HELPER(X)
|
||||||
|
|
||||||
|
/* Identify known platforms by name. */
|
||||||
|
#if defined(__linux) || defined(__linux__) || defined(linux)
|
||||||
|
# define PLATFORM_ID "Linux"
|
||||||
|
|
||||||
|
#elif defined(__CYGWIN__)
|
||||||
|
# define PLATFORM_ID "Cygwin"
|
||||||
|
|
||||||
|
#elif defined(__MINGW32__)
|
||||||
|
# define PLATFORM_ID "MinGW"
|
||||||
|
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# define PLATFORM_ID "Darwin"
|
||||||
|
|
||||||
|
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
|
||||||
|
# define PLATFORM_ID "Windows"
|
||||||
|
|
||||||
|
#elif defined(__FreeBSD__) || defined(__FreeBSD)
|
||||||
|
# define PLATFORM_ID "FreeBSD"
|
||||||
|
|
||||||
|
#elif defined(__NetBSD__) || defined(__NetBSD)
|
||||||
|
# define PLATFORM_ID "NetBSD"
|
||||||
|
|
||||||
|
#elif defined(__OpenBSD__) || defined(__OPENBSD)
|
||||||
|
# define PLATFORM_ID "OpenBSD"
|
||||||
|
|
||||||
|
#elif defined(__sun) || defined(sun)
|
||||||
|
# define PLATFORM_ID "SunOS"
|
||||||
|
|
||||||
|
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
|
||||||
|
# define PLATFORM_ID "AIX"
|
||||||
|
|
||||||
|
#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
|
||||||
|
# define PLATFORM_ID "IRIX"
|
||||||
|
|
||||||
|
#elif defined(__hpux) || defined(__hpux__)
|
||||||
|
# define PLATFORM_ID "HP-UX"
|
||||||
|
|
||||||
|
#elif defined(__HAIKU__)
|
||||||
|
# define PLATFORM_ID "Haiku"
|
||||||
|
|
||||||
|
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
|
||||||
|
# define PLATFORM_ID "BeOS"
|
||||||
|
|
||||||
|
#elif defined(__QNX__) || defined(__QNXNTO__)
|
||||||
|
# define PLATFORM_ID "QNX"
|
||||||
|
|
||||||
|
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
|
||||||
|
# define PLATFORM_ID "Tru64"
|
||||||
|
|
||||||
|
#elif defined(__riscos) || defined(__riscos__)
|
||||||
|
# define PLATFORM_ID "RISCos"
|
||||||
|
|
||||||
|
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
|
||||||
|
# define PLATFORM_ID "SINIX"
|
||||||
|
|
||||||
|
#elif defined(__UNIX_SV__)
|
||||||
|
# define PLATFORM_ID "UNIX_SV"
|
||||||
|
|
||||||
|
#elif defined(__bsdos__)
|
||||||
|
# define PLATFORM_ID "BSDOS"
|
||||||
|
|
||||||
|
#elif defined(_MPRAS) || defined(MPRAS)
|
||||||
|
# define PLATFORM_ID "MP-RAS"
|
||||||
|
|
||||||
|
#elif defined(__osf) || defined(__osf__)
|
||||||
|
# define PLATFORM_ID "OSF1"
|
||||||
|
|
||||||
|
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
|
||||||
|
# define PLATFORM_ID "SCO_SV"
|
||||||
|
|
||||||
|
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
|
||||||
|
# define PLATFORM_ID "ULTRIX"
|
||||||
|
|
||||||
|
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
|
||||||
|
# define PLATFORM_ID "Xenix"
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(__LINUX__)
|
||||||
|
# define PLATFORM_ID "Linux"
|
||||||
|
|
||||||
|
# elif defined(__DOS__)
|
||||||
|
# define PLATFORM_ID "DOS"
|
||||||
|
|
||||||
|
# elif defined(__OS2__)
|
||||||
|
# define PLATFORM_ID "OS2"
|
||||||
|
|
||||||
|
# elif defined(__WINDOWS__)
|
||||||
|
# define PLATFORM_ID "Windows3x"
|
||||||
|
|
||||||
|
# else /* unknown platform */
|
||||||
|
# define PLATFORM_ID
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else /* unknown platform */
|
||||||
|
# define PLATFORM_ID
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For windows compilers MSVC and Intel we can determine
|
||||||
|
the architecture of the compiler being used. This is because
|
||||||
|
the compilers do not have flags that can change the architecture,
|
||||||
|
but rather depend on which compiler is being used
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
|
# if defined(_M_IA64)
|
||||||
|
# define ARCHITECTURE_ID "IA64"
|
||||||
|
|
||||||
|
# elif defined(_M_X64) || defined(_M_AMD64)
|
||||||
|
# define ARCHITECTURE_ID "x64"
|
||||||
|
|
||||||
|
# elif defined(_M_IX86)
|
||||||
|
# define ARCHITECTURE_ID "X86"
|
||||||
|
|
||||||
|
# elif defined(_M_ARM64)
|
||||||
|
# define ARCHITECTURE_ID "ARM64"
|
||||||
|
|
||||||
|
# elif defined(_M_ARM)
|
||||||
|
# if _M_ARM == 4
|
||||||
|
# define ARCHITECTURE_ID "ARMV4I"
|
||||||
|
# elif _M_ARM == 5
|
||||||
|
# define ARCHITECTURE_ID "ARMV5I"
|
||||||
|
# else
|
||||||
|
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# elif defined(_M_MIPS)
|
||||||
|
# define ARCHITECTURE_ID "MIPS"
|
||||||
|
|
||||||
|
# elif defined(_M_SH)
|
||||||
|
# define ARCHITECTURE_ID "SHx"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(_M_I86)
|
||||||
|
# define ARCHITECTURE_ID "I86"
|
||||||
|
|
||||||
|
# elif defined(_M_IX86)
|
||||||
|
# define ARCHITECTURE_ID "X86"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
|
||||||
|
# if defined(__ICCARM__)
|
||||||
|
# define ARCHITECTURE_ID "ARM"
|
||||||
|
|
||||||
|
# elif defined(__ICCAVR__)
|
||||||
|
# define ARCHITECTURE_ID "AVR"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define ARCHITECTURE_ID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Convert integer to decimal digit literals. */
|
||||||
|
#define DEC(n) \
|
||||||
|
('0' + (((n) / 10000000)%10)), \
|
||||||
|
('0' + (((n) / 1000000)%10)), \
|
||||||
|
('0' + (((n) / 100000)%10)), \
|
||||||
|
('0' + (((n) / 10000)%10)), \
|
||||||
|
('0' + (((n) / 1000)%10)), \
|
||||||
|
('0' + (((n) / 100)%10)), \
|
||||||
|
('0' + (((n) / 10)%10)), \
|
||||||
|
('0' + ((n) % 10))
|
||||||
|
|
||||||
|
/* Convert integer to hex digit literals. */
|
||||||
|
#define HEX(n) \
|
||||||
|
('0' + ((n)>>28 & 0xF)), \
|
||||||
|
('0' + ((n)>>24 & 0xF)), \
|
||||||
|
('0' + ((n)>>20 & 0xF)), \
|
||||||
|
('0' + ((n)>>16 & 0xF)), \
|
||||||
|
('0' + ((n)>>12 & 0xF)), \
|
||||||
|
('0' + ((n)>>8 & 0xF)), \
|
||||||
|
('0' + ((n)>>4 & 0xF)), \
|
||||||
|
('0' + ((n) & 0xF))
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the version number components. */
|
||||||
|
#ifdef COMPILER_VERSION_MAJOR
|
||||||
|
char const info_version[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
|
||||||
|
COMPILER_VERSION_MAJOR,
|
||||||
|
# ifdef COMPILER_VERSION_MINOR
|
||||||
|
'.', COMPILER_VERSION_MINOR,
|
||||||
|
# ifdef COMPILER_VERSION_PATCH
|
||||||
|
'.', COMPILER_VERSION_PATCH,
|
||||||
|
# ifdef COMPILER_VERSION_TWEAK
|
||||||
|
'.', COMPILER_VERSION_TWEAK,
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the internal version number. */
|
||||||
|
#ifdef COMPILER_VERSION_INTERNAL
|
||||||
|
char const info_version_internal[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
|
||||||
|
'i','n','t','e','r','n','a','l','[',
|
||||||
|
COMPILER_VERSION_INTERNAL,']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the version number components. */
|
||||||
|
#ifdef SIMULATE_VERSION_MAJOR
|
||||||
|
char const info_simulate_version[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
|
||||||
|
SIMULATE_VERSION_MAJOR,
|
||||||
|
# ifdef SIMULATE_VERSION_MINOR
|
||||||
|
'.', SIMULATE_VERSION_MINOR,
|
||||||
|
# ifdef SIMULATE_VERSION_PATCH
|
||||||
|
'.', SIMULATE_VERSION_PATCH,
|
||||||
|
# ifdef SIMULATE_VERSION_TWEAK
|
||||||
|
'.', SIMULATE_VERSION_TWEAK,
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the string literal in pieces to prevent the source from
|
||||||
|
getting matched. Store it in a pointer rather than an array
|
||||||
|
because some compilers will just produce instructions to fill the
|
||||||
|
array rather than assigning a pointer to a static array. */
|
||||||
|
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
|
||||||
|
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(__STDC__)
|
||||||
|
# if (defined(_MSC_VER) && !defined(__clang__)) \
|
||||||
|
|| (defined(__ibmxl__) || defined(__IBMC__))
|
||||||
|
# define C_DIALECT "90"
|
||||||
|
# else
|
||||||
|
# define C_DIALECT
|
||||||
|
# endif
|
||||||
|
#elif __STDC_VERSION__ >= 201000L
|
||||||
|
# define C_DIALECT "11"
|
||||||
|
#elif __STDC_VERSION__ >= 199901L
|
||||||
|
# define C_DIALECT "99"
|
||||||
|
#else
|
||||||
|
# define C_DIALECT "90"
|
||||||
|
#endif
|
||||||
|
const char* info_language_dialect_default =
|
||||||
|
"INFO" ":" "dialect_default[" C_DIALECT "]";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef ID_VOID_MAIN
|
||||||
|
void main() {}
|
||||||
|
#else
|
||||||
|
# if defined(__CLASSIC_C__)
|
||||||
|
int main(argc, argv) int argc; char *argv[];
|
||||||
|
# else
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
int require = 0;
|
||||||
|
require += info_compiler[argc];
|
||||||
|
require += info_platform[argc];
|
||||||
|
require += info_arch[argc];
|
||||||
|
#ifdef COMPILER_VERSION_MAJOR
|
||||||
|
require += info_version[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef COMPILER_VERSION_INTERNAL
|
||||||
|
require += info_version_internal[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef SIMULATE_ID
|
||||||
|
require += info_simulate[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef SIMULATE_VERSION_MAJOR
|
||||||
|
require += info_simulate_version[argc];
|
||||||
|
#endif
|
||||||
|
#if defined(__CRAYXE) || defined(__CRAYXC)
|
||||||
|
require += info_cray[argc];
|
||||||
|
#endif
|
||||||
|
require += info_language_dialect_default[argc];
|
||||||
|
(void)argv;
|
||||||
|
return require;
|
||||||
|
}
|
||||||
|
#endif
|
BIN
build_test/CMakeFiles/3.12.1/CompilerIdC/CompilerIdC.exe
Normal file
BIN
build_test/CMakeFiles/3.12.1/CompilerIdC/CompilerIdC.exe
Normal file
Binary file not shown.
68
build_test/CMakeFiles/3.12.1/CompilerIdC/CompilerIdC.vcxproj
Normal file
68
build_test/CMakeFiles/3.12.1/CompilerIdC/CompilerIdC.vcxproj
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{CAE07175-D007-4FC3-BFE8-47B392814159}</ProjectGuid>
|
||||||
|
<RootNamespace>CompilerIdC</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
|
||||||
|
|
||||||
|
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
|
||||||
|
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup>
|
||||||
|
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Configuration)\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>false</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||||
|
<DebugInformationFormat>
|
||||||
|
</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>for %%i in (cl.exe) do %40echo CMAKE_C_COMPILER=%%~$PATH:i</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="CMakeCCompilerId.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
|
|||||||
|
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.18362.0
|
||||||
|
Debug|x64|D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdC\|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
|
@ -0,0 +1,602 @@
|
|||||||
|
/* This source file must have a .cpp extension so that all C++ compilers
|
||||||
|
recognize the extension without flags. Borland does not know .cxx for
|
||||||
|
example. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# error "A C compiler has been selected for C++."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Version number components: V=Version, R=Revision, P=Patch
|
||||||
|
Version date components: YYYY=Year, MM=Month, DD=Day */
|
||||||
|
|
||||||
|
#if defined(__COMO__)
|
||||||
|
# define COMPILER_ID "Comeau"
|
||||||
|
/* __COMO_VERSION__ = VRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
|
||||||
|
|
||||||
|
#elif defined(__INTEL_COMPILER) || defined(__ICC)
|
||||||
|
# define COMPILER_ID "Intel"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
/* __INTEL_COMPILER = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
|
||||||
|
# if defined(__INTEL_COMPILER_UPDATE)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
|
||||||
|
# else
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
|
||||||
|
# endif
|
||||||
|
# if defined(__INTEL_COMPILER_BUILD_DATE)
|
||||||
|
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
|
||||||
|
# endif
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__PATHCC__)
|
||||||
|
# define COMPILER_ID "PathScale"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
|
||||||
|
# if defined(__PATHCC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
|
||||||
|
# define COMPILER_ID "Embarcadero"
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
# define COMPILER_ID "Borland"
|
||||||
|
/* __BORLANDC__ = 0xVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
|
||||||
|
# define COMPILER_ID "Watcom"
|
||||||
|
/* __WATCOMC__ = VVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
|
||||||
|
# if (__WATCOMC__ % 10) > 0
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# define COMPILER_ID "OpenWatcom"
|
||||||
|
/* __WATCOMC__ = VVRP + 1100 */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
|
||||||
|
# if (__WATCOMC__ % 10) > 0
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__SUNPRO_CC)
|
||||||
|
# define COMPILER_ID "SunPro"
|
||||||
|
# if __SUNPRO_CC >= 0x5100
|
||||||
|
/* __SUNPRO_CC = 0xVRRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
|
||||||
|
# else
|
||||||
|
/* __SUNPRO_CC = 0xVRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__HP_aCC)
|
||||||
|
# define COMPILER_ID "HP"
|
||||||
|
/* __HP_aCC = VVRRPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
|
||||||
|
|
||||||
|
#elif defined(__DECCXX)
|
||||||
|
# define COMPILER_ID "Compaq"
|
||||||
|
/* __DECCXX_VER = VVRRTPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
|
||||||
|
|
||||||
|
#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
|
||||||
|
# define COMPILER_ID "zOS"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMCPP__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)
|
||||||
|
# define COMPILER_ID "XL"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMCPP__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
|
||||||
|
# define COMPILER_ID "VisualAge"
|
||||||
|
# if defined(__ibmxl__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
|
||||||
|
# else
|
||||||
|
/* __IBMCPP__ = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__PGI)
|
||||||
|
# define COMPILER_ID "PGI"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
|
||||||
|
# if defined(__PGIC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(_CRAYC)
|
||||||
|
# define COMPILER_ID "Cray"
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
|
||||||
|
|
||||||
|
#elif defined(__TI_COMPILER_VERSION__)
|
||||||
|
# define COMPILER_ID "TI"
|
||||||
|
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
|
||||||
|
|
||||||
|
#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
|
||||||
|
# define COMPILER_ID "Fujitsu"
|
||||||
|
|
||||||
|
#elif defined(__SCO_VERSION__)
|
||||||
|
# define COMPILER_ID "SCO"
|
||||||
|
|
||||||
|
#elif defined(__clang__) && defined(__apple_build_version__)
|
||||||
|
# define COMPILER_ID "AppleClang"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
|
||||||
|
|
||||||
|
#elif defined(__clang__)
|
||||||
|
# define COMPILER_ID "Clang"
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define SIMULATE_ID "MSVC"
|
||||||
|
# endif
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) || defined(__GNUG__)
|
||||||
|
# define COMPILER_ID "GNU"
|
||||||
|
# if defined(__GNUC__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
|
||||||
|
# else
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__GNUG__)
|
||||||
|
# endif
|
||||||
|
# if defined(__GNUC_MINOR__)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
|
||||||
|
# endif
|
||||||
|
# if defined(__GNUC_PATCHLEVEL__)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# define COMPILER_ID "MSVC"
|
||||||
|
/* _MSC_VER = VVRR */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
|
||||||
|
# if defined(_MSC_FULL_VER)
|
||||||
|
# if _MSC_VER >= 1400
|
||||||
|
/* _MSC_FULL_VER = VVRRPPPPP */
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
|
||||||
|
# else
|
||||||
|
/* _MSC_FULL_VER = VVRRPPPP */
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if defined(_MSC_BUILD)
|
||||||
|
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
|
||||||
|
# define COMPILER_ID "ADSP"
|
||||||
|
#if defined(__VISUALDSPVERSION__)
|
||||||
|
/* __VISUALDSPVERSION__ = 0xVVRRPP00 */
|
||||||
|
# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
|
||||||
|
# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
|
||||||
|
# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
|
||||||
|
# define COMPILER_ID "IAR"
|
||||||
|
# if defined(__VER__)
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
|
||||||
|
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__ARMCC_VERSION)
|
||||||
|
# define COMPILER_ID "ARMCC"
|
||||||
|
#if __ARMCC_VERSION >= 1000000
|
||||||
|
/* __ARMCC_VERSION = VRRPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
|
||||||
|
#else
|
||||||
|
/* __ARMCC_VERSION = VRPPPP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
|
||||||
|
# define COMPILER_ID "MIPSpro"
|
||||||
|
# if defined(_SGI_COMPILER_VERSION)
|
||||||
|
/* _SGI_COMPILER_VERSION = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
|
||||||
|
# else
|
||||||
|
/* _COMPILER_VERSION = VRP */
|
||||||
|
# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
|
||||||
|
# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
|
||||||
|
# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
/* These compilers are either not known or too old to define an
|
||||||
|
identification macro. Try to identify the platform and guess that
|
||||||
|
it is the native compiler. */
|
||||||
|
#elif defined(__sgi)
|
||||||
|
# define COMPILER_ID "MIPSpro"
|
||||||
|
|
||||||
|
#elif defined(__hpux) || defined(__hpua)
|
||||||
|
# define COMPILER_ID "HP"
|
||||||
|
|
||||||
|
#else /* unknown compiler */
|
||||||
|
# define COMPILER_ID ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the string literal in pieces to prevent the source from
|
||||||
|
getting matched. Store it in a pointer rather than an array
|
||||||
|
because some compilers will just produce instructions to fill the
|
||||||
|
array rather than assigning a pointer to a static array. */
|
||||||
|
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
|
||||||
|
#ifdef SIMULATE_ID
|
||||||
|
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
char const* qnxnto = "INFO" ":" "qnxnto[]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CRAYXE) || defined(__CRAYXC)
|
||||||
|
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STRINGIFY_HELPER(X) #X
|
||||||
|
#define STRINGIFY(X) STRINGIFY_HELPER(X)
|
||||||
|
|
||||||
|
/* Identify known platforms by name. */
|
||||||
|
#if defined(__linux) || defined(__linux__) || defined(linux)
|
||||||
|
# define PLATFORM_ID "Linux"
|
||||||
|
|
||||||
|
#elif defined(__CYGWIN__)
|
||||||
|
# define PLATFORM_ID "Cygwin"
|
||||||
|
|
||||||
|
#elif defined(__MINGW32__)
|
||||||
|
# define PLATFORM_ID "MinGW"
|
||||||
|
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# define PLATFORM_ID "Darwin"
|
||||||
|
|
||||||
|
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
|
||||||
|
# define PLATFORM_ID "Windows"
|
||||||
|
|
||||||
|
#elif defined(__FreeBSD__) || defined(__FreeBSD)
|
||||||
|
# define PLATFORM_ID "FreeBSD"
|
||||||
|
|
||||||
|
#elif defined(__NetBSD__) || defined(__NetBSD)
|
||||||
|
# define PLATFORM_ID "NetBSD"
|
||||||
|
|
||||||
|
#elif defined(__OpenBSD__) || defined(__OPENBSD)
|
||||||
|
# define PLATFORM_ID "OpenBSD"
|
||||||
|
|
||||||
|
#elif defined(__sun) || defined(sun)
|
||||||
|
# define PLATFORM_ID "SunOS"
|
||||||
|
|
||||||
|
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
|
||||||
|
# define PLATFORM_ID "AIX"
|
||||||
|
|
||||||
|
#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
|
||||||
|
# define PLATFORM_ID "IRIX"
|
||||||
|
|
||||||
|
#elif defined(__hpux) || defined(__hpux__)
|
||||||
|
# define PLATFORM_ID "HP-UX"
|
||||||
|
|
||||||
|
#elif defined(__HAIKU__)
|
||||||
|
# define PLATFORM_ID "Haiku"
|
||||||
|
|
||||||
|
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
|
||||||
|
# define PLATFORM_ID "BeOS"
|
||||||
|
|
||||||
|
#elif defined(__QNX__) || defined(__QNXNTO__)
|
||||||
|
# define PLATFORM_ID "QNX"
|
||||||
|
|
||||||
|
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
|
||||||
|
# define PLATFORM_ID "Tru64"
|
||||||
|
|
||||||
|
#elif defined(__riscos) || defined(__riscos__)
|
||||||
|
# define PLATFORM_ID "RISCos"
|
||||||
|
|
||||||
|
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
|
||||||
|
# define PLATFORM_ID "SINIX"
|
||||||
|
|
||||||
|
#elif defined(__UNIX_SV__)
|
||||||
|
# define PLATFORM_ID "UNIX_SV"
|
||||||
|
|
||||||
|
#elif defined(__bsdos__)
|
||||||
|
# define PLATFORM_ID "BSDOS"
|
||||||
|
|
||||||
|
#elif defined(_MPRAS) || defined(MPRAS)
|
||||||
|
# define PLATFORM_ID "MP-RAS"
|
||||||
|
|
||||||
|
#elif defined(__osf) || defined(__osf__)
|
||||||
|
# define PLATFORM_ID "OSF1"
|
||||||
|
|
||||||
|
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
|
||||||
|
# define PLATFORM_ID "SCO_SV"
|
||||||
|
|
||||||
|
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
|
||||||
|
# define PLATFORM_ID "ULTRIX"
|
||||||
|
|
||||||
|
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
|
||||||
|
# define PLATFORM_ID "Xenix"
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(__LINUX__)
|
||||||
|
# define PLATFORM_ID "Linux"
|
||||||
|
|
||||||
|
# elif defined(__DOS__)
|
||||||
|
# define PLATFORM_ID "DOS"
|
||||||
|
|
||||||
|
# elif defined(__OS2__)
|
||||||
|
# define PLATFORM_ID "OS2"
|
||||||
|
|
||||||
|
# elif defined(__WINDOWS__)
|
||||||
|
# define PLATFORM_ID "Windows3x"
|
||||||
|
|
||||||
|
# else /* unknown platform */
|
||||||
|
# define PLATFORM_ID
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else /* unknown platform */
|
||||||
|
# define PLATFORM_ID
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For windows compilers MSVC and Intel we can determine
|
||||||
|
the architecture of the compiler being used. This is because
|
||||||
|
the compilers do not have flags that can change the architecture,
|
||||||
|
but rather depend on which compiler is being used
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
|
# if defined(_M_IA64)
|
||||||
|
# define ARCHITECTURE_ID "IA64"
|
||||||
|
|
||||||
|
# elif defined(_M_X64) || defined(_M_AMD64)
|
||||||
|
# define ARCHITECTURE_ID "x64"
|
||||||
|
|
||||||
|
# elif defined(_M_IX86)
|
||||||
|
# define ARCHITECTURE_ID "X86"
|
||||||
|
|
||||||
|
# elif defined(_M_ARM64)
|
||||||
|
# define ARCHITECTURE_ID "ARM64"
|
||||||
|
|
||||||
|
# elif defined(_M_ARM)
|
||||||
|
# if _M_ARM == 4
|
||||||
|
# define ARCHITECTURE_ID "ARMV4I"
|
||||||
|
# elif _M_ARM == 5
|
||||||
|
# define ARCHITECTURE_ID "ARMV5I"
|
||||||
|
# else
|
||||||
|
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# elif defined(_M_MIPS)
|
||||||
|
# define ARCHITECTURE_ID "MIPS"
|
||||||
|
|
||||||
|
# elif defined(_M_SH)
|
||||||
|
# define ARCHITECTURE_ID "SHx"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
# if defined(_M_I86)
|
||||||
|
# define ARCHITECTURE_ID "I86"
|
||||||
|
|
||||||
|
# elif defined(_M_IX86)
|
||||||
|
# define ARCHITECTURE_ID "X86"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
|
||||||
|
# if defined(__ICCARM__)
|
||||||
|
# define ARCHITECTURE_ID "ARM"
|
||||||
|
|
||||||
|
# elif defined(__ICCAVR__)
|
||||||
|
# define ARCHITECTURE_ID "AVR"
|
||||||
|
|
||||||
|
# else /* unknown architecture */
|
||||||
|
# define ARCHITECTURE_ID ""
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define ARCHITECTURE_ID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Convert integer to decimal digit literals. */
|
||||||
|
#define DEC(n) \
|
||||||
|
('0' + (((n) / 10000000)%10)), \
|
||||||
|
('0' + (((n) / 1000000)%10)), \
|
||||||
|
('0' + (((n) / 100000)%10)), \
|
||||||
|
('0' + (((n) / 10000)%10)), \
|
||||||
|
('0' + (((n) / 1000)%10)), \
|
||||||
|
('0' + (((n) / 100)%10)), \
|
||||||
|
('0' + (((n) / 10)%10)), \
|
||||||
|
('0' + ((n) % 10))
|
||||||
|
|
||||||
|
/* Convert integer to hex digit literals. */
|
||||||
|
#define HEX(n) \
|
||||||
|
('0' + ((n)>>28 & 0xF)), \
|
||||||
|
('0' + ((n)>>24 & 0xF)), \
|
||||||
|
('0' + ((n)>>20 & 0xF)), \
|
||||||
|
('0' + ((n)>>16 & 0xF)), \
|
||||||
|
('0' + ((n)>>12 & 0xF)), \
|
||||||
|
('0' + ((n)>>8 & 0xF)), \
|
||||||
|
('0' + ((n)>>4 & 0xF)), \
|
||||||
|
('0' + ((n) & 0xF))
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the version number components. */
|
||||||
|
#ifdef COMPILER_VERSION_MAJOR
|
||||||
|
char const info_version[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
|
||||||
|
COMPILER_VERSION_MAJOR,
|
||||||
|
# ifdef COMPILER_VERSION_MINOR
|
||||||
|
'.', COMPILER_VERSION_MINOR,
|
||||||
|
# ifdef COMPILER_VERSION_PATCH
|
||||||
|
'.', COMPILER_VERSION_PATCH,
|
||||||
|
# ifdef COMPILER_VERSION_TWEAK
|
||||||
|
'.', COMPILER_VERSION_TWEAK,
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the internal version number. */
|
||||||
|
#ifdef COMPILER_VERSION_INTERNAL
|
||||||
|
char const info_version_internal[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
|
||||||
|
'i','n','t','e','r','n','a','l','[',
|
||||||
|
COMPILER_VERSION_INTERNAL,']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct a string literal encoding the version number components. */
|
||||||
|
#ifdef SIMULATE_VERSION_MAJOR
|
||||||
|
char const info_simulate_version[] = {
|
||||||
|
'I', 'N', 'F', 'O', ':',
|
||||||
|
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
|
||||||
|
SIMULATE_VERSION_MAJOR,
|
||||||
|
# ifdef SIMULATE_VERSION_MINOR
|
||||||
|
'.', SIMULATE_VERSION_MINOR,
|
||||||
|
# ifdef SIMULATE_VERSION_PATCH
|
||||||
|
'.', SIMULATE_VERSION_PATCH,
|
||||||
|
# ifdef SIMULATE_VERSION_TWEAK
|
||||||
|
'.', SIMULATE_VERSION_TWEAK,
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
']','\0'};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the string literal in pieces to prevent the source from
|
||||||
|
getting matched. Store it in a pointer rather than an array
|
||||||
|
because some compilers will just produce instructions to fill the
|
||||||
|
array rather than assigning a pointer to a static array. */
|
||||||
|
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
|
||||||
|
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && defined(_MSVC_LANG)
|
||||||
|
#define CXX_STD _MSVC_LANG
|
||||||
|
#else
|
||||||
|
#define CXX_STD __cplusplus
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char* info_language_dialect_default = "INFO" ":" "dialect_default["
|
||||||
|
#if CXX_STD > 201703L
|
||||||
|
"20"
|
||||||
|
#elif CXX_STD >= 201703L
|
||||||
|
"17"
|
||||||
|
#elif CXX_STD >= 201402L
|
||||||
|
"14"
|
||||||
|
#elif CXX_STD >= 201103L
|
||||||
|
"11"
|
||||||
|
#else
|
||||||
|
"98"
|
||||||
|
#endif
|
||||||
|
"]";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int require = 0;
|
||||||
|
require += info_compiler[argc];
|
||||||
|
require += info_platform[argc];
|
||||||
|
#ifdef COMPILER_VERSION_MAJOR
|
||||||
|
require += info_version[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef COMPILER_VERSION_INTERNAL
|
||||||
|
require += info_version_internal[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef SIMULATE_ID
|
||||||
|
require += info_simulate[argc];
|
||||||
|
#endif
|
||||||
|
#ifdef SIMULATE_VERSION_MAJOR
|
||||||
|
require += info_simulate_version[argc];
|
||||||
|
#endif
|
||||||
|
#if defined(__CRAYXE) || defined(__CRAYXC)
|
||||||
|
require += info_cray[argc];
|
||||||
|
#endif
|
||||||
|
require += info_language_dialect_default[argc];
|
||||||
|
(void)argv;
|
||||||
|
return require;
|
||||||
|
}
|
BIN
build_test/CMakeFiles/3.12.1/CompilerIdCXX/CompilerIdCXX.exe
Normal file
BIN
build_test/CMakeFiles/3.12.1/CompilerIdCXX/CompilerIdCXX.exe
Normal file
Binary file not shown.
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{CAE07175-D007-4FC3-BFE8-47B392814159}</ProjectGuid>
|
||||||
|
<RootNamespace>CompilerIdCXX</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
|
||||||
|
|
||||||
|
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
|
||||||
|
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup>
|
||||||
|
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Configuration)\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>false</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||||
|
<DebugInformationFormat>
|
||||||
|
</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
|
||||||
|
</Link>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>for %%i in (cl.exe) do %40echo CMAKE_CXX_COMPILER=%%~$PATH:i</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="CMakeCXXCompilerId.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
|
|||||||
|
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.18362.0
|
||||||
|
Debug|x64|D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdCXX\|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
|
1
build_test/CMakeFiles/3.12.1/VCTargetsPath.txt
Normal file
1
build_test/CMakeFiles/3.12.1/VCTargetsPath.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/Common7/IDE/VC/VCTargets
|
28
build_test/CMakeFiles/3.12.1/VCTargetsPath.vcxproj
Normal file
28
build_test/CMakeFiles/3.12.1/VCTargetsPath.vcxproj
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{F3FC6D86-508D-3FB1-96D2-995F08B142EC}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
|
||||||
|
<PropertyGroup Label="Configuration">
|
||||||
|
<ConfigurationType>Utility</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
|
||||||
|
<ItemDefinitionGroup>
|
||||||
|
<PostBuildEvent>
|
||||||
|
<Command>echo VCTargetsPath=$(VCTargetsPath)</Command>
|
||||||
|
</PostBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
|
||||||
|
</Project>
|
@ -0,0 +1,2 @@
|
|||||||
|
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.18362.0
|
||||||
|
Debug|x64|D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\|
|
@ -0,0 +1 @@
|
|||||||
|
# generated from CMake
|
467
build_test/CMakeFiles/CMakeOutput.log
Normal file
467
build_test/CMakeFiles/CMakeOutput.log
Normal file
@ -0,0 +1,467 @@
|
|||||||
|
The system is: Windows - 10.0.18362 - AMD64
|
||||||
|
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
|
||||||
|
Compiler:
|
||||||
|
Build flags:
|
||||||
|
Id flags:
|
||||||
|
|
||||||
|
The output was:
|
||||||
|
0
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:54:58.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdC\CompilerIdC.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "Debug\".
|
||||||
|
Creating directory "Debug\CompilerIdC.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "Debug\CompilerIdC.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Using triplet "x64-windows" from "C:\Users\Alex\vcpkg\installed\x64-windows\"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /I"C:\Users\Alex\vcpkg\installed\x64-windows\include" /nologo /W0 /WX- /diagnostics:classic /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue CMakeCCompilerId.c
|
||||||
|
CMakeCCompilerId.c
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdC.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib" /LIBPATH:"C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib\manual-link" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib\*.lib" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdC.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdC.lib" /MACHINE:X64 Debug\CMakeCCompilerId.obj
|
||||||
|
CompilerIdC.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdC\.\CompilerIdC.exe
|
||||||
|
AppLocalFromInstalled:
|
||||||
|
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\Alex\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdC\.\CompilerIdC.exe" "C:\Users\Alex\vcpkg\installed\x64-windows\debug\bin" "Debug\CompilerIdC.tlog\CompilerIdC.write.1u.tlog" "Debug\vcpkg.applocal.log"
|
||||||
|
PostBuildEvent:
|
||||||
|
for %%i in (cl.exe) do @echo CMAKE_C_COMPILER=%%~$PATH:i
|
||||||
|
:VCEnd
|
||||||
|
CMAKE_C_COMPILER=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\Hostx86\x64\cl.exe
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "Debug\CompilerIdC.tlog\unsuccessfulbuild".
|
||||||
|
Touching "Debug\CompilerIdC.tlog\CompilerIdC.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdC\CompilerIdC.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.86
|
||||||
|
|
||||||
|
|
||||||
|
Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CompilerIdC.exe"
|
||||||
|
|
||||||
|
Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CompilerIdC.vcxproj"
|
||||||
|
|
||||||
|
The C compiler identification is MSVC, found in "D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CompilerIdC/CompilerIdC.exe"
|
||||||
|
|
||||||
|
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
|
||||||
|
Compiler:
|
||||||
|
Build flags:
|
||||||
|
Id flags:
|
||||||
|
|
||||||
|
The output was:
|
||||||
|
0
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:01.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdCXX\CompilerIdCXX.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "Debug\".
|
||||||
|
Creating directory "Debug\CompilerIdCXX.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "Debug\CompilerIdCXX.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Using triplet "x64-windows" from "C:\Users\Alex\vcpkg\installed\x64-windows\"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /I"C:\Users\Alex\vcpkg\installed\x64-windows\include" /nologo /W0 /WX- /diagnostics:classic /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue CMakeCXXCompilerId.cpp
|
||||||
|
CMakeCXXCompilerId.cpp
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdCXX.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib" /LIBPATH:"C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib\manual-link" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "C:\Users\Alex\vcpkg\installed\x64-windows\debug\lib\*.lib" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdCXX.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdCXX.lib" /MACHINE:X64 Debug\CMakeCXXCompilerId.obj
|
||||||
|
CompilerIdCXX.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdCXX\.\CompilerIdCXX.exe
|
||||||
|
AppLocalFromInstalled:
|
||||||
|
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\Alex\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdCXX\.\CompilerIdCXX.exe" "C:\Users\Alex\vcpkg\installed\x64-windows\debug\bin" "Debug\CompilerIdCXX.tlog\CompilerIdCXX.write.1u.tlog" "Debug\vcpkg.applocal.log"
|
||||||
|
PostBuildEvent:
|
||||||
|
for %%i in (cl.exe) do @echo CMAKE_CXX_COMPILER=%%~$PATH:i
|
||||||
|
:VCEnd
|
||||||
|
CMAKE_CXX_COMPILER=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\Hostx86\x64\cl.exe
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "Debug\CompilerIdCXX.tlog\unsuccessfulbuild".
|
||||||
|
Touching "Debug\CompilerIdCXX.tlog\CompilerIdCXX.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\3.12.1\CompilerIdCXX\CompilerIdCXX.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.48
|
||||||
|
|
||||||
|
|
||||||
|
Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CompilerIdCXX.exe"
|
||||||
|
|
||||||
|
Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CompilerIdCXX.vcxproj"
|
||||||
|
|
||||||
|
The CXX compiler identification is MSVC, found in "D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CompilerIdCXX/CompilerIdCXX.exe"
|
||||||
|
|
||||||
|
Determining if the C compiler works passed with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_17f24.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:04.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_17f24.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_17f24.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_17f24.dir\Debug\cmTC_17f24.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_17f24.dir\Debug\cmTC_17f24.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_17f24.dir\Debug\\" /Fd"cmTC_17f24.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\testCCompiler.c
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
testCCompiler.c
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_17f24.dir\Debug\\" /Fd"cmTC_17f24.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\testCCompiler.c
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_17f24.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_17f24.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_17f24.lib" /MACHINE:X64 /machine:x64 cmTC_17f24.dir\Debug\testCCompiler.obj
|
||||||
|
cmTC_17f24.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_17f24.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_17f24.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_17f24.dir\Debug\cmTC_17f24.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_17f24.dir\Debug\cmTC_17f24.tlog\cmTC_17f24.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_17f24.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.83
|
||||||
|
|
||||||
|
|
||||||
|
Detecting C compiler ABI info compiled with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_e02e3.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:07.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_e02e3.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_e02e3.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_e02e3.dir\Debug\cmTC_e02e3.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_e02e3.dir\Debug\cmTC_e02e3.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_e02e3.dir\Debug\\" /Fd"cmTC_e02e3.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue "C:\Program Files\CMake\share\cmake-3.12\Modules\CMakeCCompilerABI.c"
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
CMakeCCompilerABI.c
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_e02e3.dir\Debug\\" /Fd"cmTC_e02e3.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue "C:\Program Files\CMake\share\cmake-3.12\Modules\CMakeCCompilerABI.c"
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_e02e3.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_e02e3.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_e02e3.lib" /MACHINE:X64 /machine:x64 cmTC_e02e3.dir\Debug\CMakeCCompilerABI.obj
|
||||||
|
cmTC_e02e3.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_e02e3.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_e02e3.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_e02e3.dir\Debug\cmTC_e02e3.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_e02e3.dir\Debug\cmTC_e02e3.tlog\cmTC_e02e3.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_e02e3.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.41
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Detecting C [] compiler features compiled with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_67477.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:10.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_67477.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_67477.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_67477.dir\Debug\cmTC_67477.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_67477.dir\Debug\cmTC_67477.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_67477.dir\Debug\\" /Fd"cmTC_67477.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\feature_tests.c
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
feature_tests.c
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_67477.dir\Debug\\" /Fd"cmTC_67477.dir\Debug\vc141.pdb" /Gd /TC /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\feature_tests.c
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_67477.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_67477.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_67477.lib" /MACHINE:X64 /machine:x64 cmTC_67477.dir\Debug\feature_tests.obj
|
||||||
|
cmTC_67477.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_67477.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_67477.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_67477.dir\Debug\cmTC_67477.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_67477.dir\Debug\cmTC_67477.tlog\cmTC_67477.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_67477.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.42
|
||||||
|
|
||||||
|
|
||||||
|
Feature record: C_FEATURE:1c_function_prototypes
|
||||||
|
Feature record: C_FEATURE:1c_variadic_macros
|
||||||
|
Determining if the CXX compiler works passed with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_62738.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:13.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_62738.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_62738.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_62738.dir\Debug\cmTC_62738.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_62738.dir\Debug\cmTC_62738.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_62738.dir\Debug\\" /Fd"cmTC_62738.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\testCXXCompiler.cxx
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
testCXXCompiler.cxx
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_62738.dir\Debug\\" /Fd"cmTC_62738.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\testCXXCompiler.cxx
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_62738.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_62738.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_62738.lib" /MACHINE:X64 /machine:x64 cmTC_62738.dir\Debug\testCXXCompiler.obj
|
||||||
|
cmTC_62738.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_62738.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_62738.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_62738.dir\Debug\cmTC_62738.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_62738.dir\Debug\cmTC_62738.tlog\cmTC_62738.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_62738.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.42
|
||||||
|
|
||||||
|
|
||||||
|
Detecting CXX compiler ABI info compiled with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_0e3de.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:16.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_0e3de.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_0e3de.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_0e3de.dir\Debug\cmTC_0e3de.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_0e3de.dir\Debug\cmTC_0e3de.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_0e3de.dir\Debug\\" /Fd"cmTC_0e3de.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue "C:\Program Files\CMake\share\cmake-3.12\Modules\CMakeCXXCompilerABI.cpp"
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
CMakeCXXCompilerABI.cpp
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_0e3de.dir\Debug\\" /Fd"cmTC_0e3de.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue "C:\Program Files\CMake\share\cmake-3.12\Modules\CMakeCXXCompilerABI.cpp"
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_0e3de.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_0e3de.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_0e3de.lib" /MACHINE:X64 /machine:x64 cmTC_0e3de.dir\Debug\CMakeCXXCompilerABI.obj
|
||||||
|
cmTC_0e3de.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_0e3de.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_0e3de.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_0e3de.dir\Debug\cmTC_0e3de.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_0e3de.dir\Debug\cmTC_0e3de.tlog\cmTC_0e3de.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_0e3de.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.54
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Detecting CXX [] compiler features compiled with the following output:
|
||||||
|
Change Dir: D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp
|
||||||
|
|
||||||
|
Run Build Command:"C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe" "cmTC_3354c.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=15.0"
|
||||||
|
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Build started 04/08/2020 16:55:19.
|
||||||
|
Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_3354c.vcxproj" on node 1 (default targets).
|
||||||
|
PrepareForBuild:
|
||||||
|
Creating directory "cmTC_3354c.dir\Debug\".
|
||||||
|
Creating directory "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\".
|
||||||
|
Creating directory "cmTC_3354c.dir\Debug\cmTC_3354c.tlog\".
|
||||||
|
InitializeBuildStatus:
|
||||||
|
Creating "cmTC_3354c.dir\Debug\cmTC_3354c.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
|
||||||
|
VcpkgTripletSelection:
|
||||||
|
Not using Vcpkg because VcpkgEnabled is "false"
|
||||||
|
ClCompile:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_3354c.dir\Debug\\" /Fd"cmTC_3354c.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\feature_tests.cxx
|
||||||
|
Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
|
||||||
|
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
feature_tests.cxx
|
||||||
|
cl /c /Zi /W3 /WX- /diagnostics:classic /Od /Ob0 /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"cmTC_3354c.dir\Debug\\" /Fd"cmTC_3354c.dir\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue D:\Documents\Code\sdrpp\build_test\CMakeFiles\feature_tests.cxx
|
||||||
|
|
||||||
|
Link:
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_3354c.exe" /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_3354c.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_3354c.lib" /MACHINE:X64 /machine:x64 cmTC_3354c.dir\Debug\feature_tests.obj
|
||||||
|
cmTC_3354c.vcxproj -> D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\Debug\cmTC_3354c.exe
|
||||||
|
PostBuildEvent:
|
||||||
|
setlocal
|
||||||
|
powershell -noprofile -executionpolicy Bypass -file C:/Users/Alex/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Documents/Code/sdrpp/build_test/CMakeFiles/CMakeTmp/Debug/cmTC_3354c.exe -installedDir C:/Users/Alex/vcpkg/installed/x64-windows/debug/bin -OutVariable out
|
||||||
|
if %errorlevel% neq 0 goto :cmEnd
|
||||||
|
:cmEnd
|
||||||
|
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
||||||
|
:cmErrorLevel
|
||||||
|
exit /b %1
|
||||||
|
:cmDone
|
||||||
|
if %errorlevel% neq 0 goto :VCEnd
|
||||||
|
:VCEnd
|
||||||
|
FinalizeBuildStatus:
|
||||||
|
Deleting file "cmTC_3354c.dir\Debug\cmTC_3354c.tlog\unsuccessfulbuild".
|
||||||
|
Touching "cmTC_3354c.dir\Debug\cmTC_3354c.tlog\cmTC_3354c.lastbuildstate".
|
||||||
|
Done Building Project "D:\Documents\Code\sdrpp\build_test\CMakeFiles\CMakeTmp\cmTC_3354c.vcxproj" (default targets).
|
||||||
|
|
||||||
|
Build succeeded.
|
||||||
|
0 Warning(s)
|
||||||
|
0 Error(s)
|
||||||
|
|
||||||
|
Time Elapsed 00:00:02.49
|
||||||
|
|
||||||
|
|
||||||
|
Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers
|
||||||
|
Feature record: CXX_FEATURE:1cxx_alias_templates
|
||||||
|
Feature record: CXX_FEATURE:1cxx_alignas
|
||||||
|
Feature record: CXX_FEATURE:1cxx_alignof
|
||||||
|
Feature record: CXX_FEATURE:1cxx_attributes
|
||||||
|
Feature record: CXX_FEATURE:1cxx_attribute_deprecated
|
||||||
|
Feature record: CXX_FEATURE:1cxx_auto_type
|
||||||
|
Feature record: CXX_FEATURE:1cxx_binary_literals
|
||||||
|
Feature record: CXX_FEATURE:1cxx_constexpr
|
||||||
|
Feature record: CXX_FEATURE:1cxx_contextual_conversions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_decltype
|
||||||
|
Feature record: CXX_FEATURE:1cxx_decltype_auto
|
||||||
|
Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types
|
||||||
|
Feature record: CXX_FEATURE:1cxx_default_function_template_args
|
||||||
|
Feature record: CXX_FEATURE:1cxx_defaulted_functions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers
|
||||||
|
Feature record: CXX_FEATURE:1cxx_delegating_constructors
|
||||||
|
Feature record: CXX_FEATURE:1cxx_deleted_functions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_digit_separators
|
||||||
|
Feature record: CXX_FEATURE:1cxx_enum_forward_declarations
|
||||||
|
Feature record: CXX_FEATURE:1cxx_explicit_conversions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_extended_friend_declarations
|
||||||
|
Feature record: CXX_FEATURE:1cxx_extern_templates
|
||||||
|
Feature record: CXX_FEATURE:1cxx_final
|
||||||
|
Feature record: CXX_FEATURE:1cxx_func_identifier
|
||||||
|
Feature record: CXX_FEATURE:1cxx_generalized_initializers
|
||||||
|
Feature record: CXX_FEATURE:1cxx_generic_lambdas
|
||||||
|
Feature record: CXX_FEATURE:1cxx_inheriting_constructors
|
||||||
|
Feature record: CXX_FEATURE:1cxx_inline_namespaces
|
||||||
|
Feature record: CXX_FEATURE:1cxx_lambdas
|
||||||
|
Feature record: CXX_FEATURE:1cxx_lambda_init_captures
|
||||||
|
Feature record: CXX_FEATURE:1cxx_local_type_template_args
|
||||||
|
Feature record: CXX_FEATURE:1cxx_long_long_type
|
||||||
|
Feature record: CXX_FEATURE:1cxx_noexcept
|
||||||
|
Feature record: CXX_FEATURE:1cxx_nonstatic_member_init
|
||||||
|
Feature record: CXX_FEATURE:1cxx_nullptr
|
||||||
|
Feature record: CXX_FEATURE:1cxx_override
|
||||||
|
Feature record: CXX_FEATURE:1cxx_range_for
|
||||||
|
Feature record: CXX_FEATURE:1cxx_raw_string_literals
|
||||||
|
Feature record: CXX_FEATURE:1cxx_reference_qualified_functions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_return_type_deduction
|
||||||
|
Feature record: CXX_FEATURE:1cxx_right_angle_brackets
|
||||||
|
Feature record: CXX_FEATURE:1cxx_rvalue_references
|
||||||
|
Feature record: CXX_FEATURE:1cxx_sizeof_member
|
||||||
|
Feature record: CXX_FEATURE:1cxx_static_assert
|
||||||
|
Feature record: CXX_FEATURE:1cxx_strong_enums
|
||||||
|
Feature record: CXX_FEATURE:1cxx_template_template_parameters
|
||||||
|
Feature record: CXX_FEATURE:1cxx_thread_local
|
||||||
|
Feature record: CXX_FEATURE:1cxx_trailing_return_types
|
||||||
|
Feature record: CXX_FEATURE:1cxx_unicode_literals
|
||||||
|
Feature record: CXX_FEATURE:1cxx_uniform_initialization
|
||||||
|
Feature record: CXX_FEATURE:1cxx_unrestricted_unions
|
||||||
|
Feature record: CXX_FEATURE:1cxx_user_literals
|
||||||
|
Feature record: CXX_FEATURE:1cxx_variable_templates
|
||||||
|
Feature record: CXX_FEATURE:1cxx_variadic_macros
|
||||||
|
Feature record: CXX_FEATURE:1cxx_variadic_templates
|
3
build_test/CMakeFiles/TargetDirectories.txt
Normal file
3
build_test/CMakeFiles/TargetDirectories.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/sdrpp.dir
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/ALL_BUILD.dir
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/ZERO_CHECK.dir
|
1
build_test/CMakeFiles/cmake.check_cache
Normal file
1
build_test/CMakeFiles/cmake.check_cache
Normal file
@ -0,0 +1 @@
|
|||||||
|
# This file is generated by cmake for dependency checking of the CMakeCache.txt file
|
BIN
build_test/CMakeFiles/feature_tests.bin
Normal file
BIN
build_test/CMakeFiles/feature_tests.bin
Normal file
Binary file not shown.
20
build_test/CMakeFiles/feature_tests.c
Normal file
20
build_test/CMakeFiles/feature_tests.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
const char features[] = {"\n"
|
||||||
|
"C_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"c_function_prototypes\n"
|
||||||
|
"C_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"c_variadic_macros\n"
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char** argv) { (void)argv; return features[argc]; }
|
398
build_test/CMakeFiles/feature_tests.cxx
Normal file
398
build_test/CMakeFiles/feature_tests.cxx
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
|
||||||
|
const char features[] = {"\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_FULL_VER >= 190024406
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_aggregate_default_initializers\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_alias_templates\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_alignas\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_alignof\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_attributes\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_attribute_deprecated\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_auto_type\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_binary_literals\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_constexpr\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_contextual_conversions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_decltype\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_decltype_auto\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1911
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_decltype_incomplete_return_types\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_default_function_template_args\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_defaulted_functions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_defaulted_move_initializers\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_delegating_constructors\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_deleted_functions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_digit_separators\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1700
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_enum_forward_declarations\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_explicit_conversions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_extended_friend_declarations\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_extern_templates\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1700
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_final\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_func_identifier\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_FULL_VER >= 180030723
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_generalized_initializers\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_generic_lambdas\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_inheriting_constructors\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_inline_namespaces\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_lambdas\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_lambda_init_captures\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_local_type_template_args\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_long_long_type\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_noexcept\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_nonstatic_member_init\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_nullptr\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_override\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1700
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_range_for\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_raw_string_literals\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_reference_qualified_functions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_return_type_deduction\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_right_angle_brackets\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_rvalue_references\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_sizeof_member\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_static_assert\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1700
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_strong_enums\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_template_template_parameters\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_thread_local\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_trailing_return_types\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_unicode_literals\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_uniform_initialization\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_unrestricted_unions\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1900
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_user_literals\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_FULL_VER >= 190023918
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_variable_templates\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1600
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_variadic_macros\n"
|
||||||
|
"CXX_FEATURE:"
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
"1"
|
||||||
|
#else
|
||||||
|
"0"
|
||||||
|
#endif
|
||||||
|
"cxx_variadic_templates\n"
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char** argv) { (void)argv; return features[argc]; }
|
1
build_test/CMakeFiles/generate.stamp
Normal file
1
build_test/CMakeFiles/generate.stamp
Normal file
@ -0,0 +1 @@
|
|||||||
|
# CMake generation timestamp file for this directory.
|
120
build_test/CMakeFiles/generate.stamp.depend
Normal file
120
build_test/CMakeFiles/generate.stamp.depend
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
# CMake generation dependency list for this directory.
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCCompiler.cmake.in
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCCompilerABI.c
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCInformation.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCXXCompiler.cmake.in
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCXXCompilerABI.cpp
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCXXInformation.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCommonLanguageInclude.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeCompilerIdDetection.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCXXCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCompileFeatures.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCompilerABI.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineCompilerId.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineRCCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeDetermineSystem.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeFindBinUtils.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeGenericSystem.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeInitializeConfigs.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeLanguageInformation.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeParseImplicitLinkInfo.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeRCCompiler.cmake.in
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeRCInformation.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeSystem.cmake.in
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeSystemSpecificInformation.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeSystemSpecificInitialize.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCXXCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCompilerCommon.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestRCCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/ADSP-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/ARMCC-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/AppleClang-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Borland-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Bruce-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/CMakeCommonCompilerMacros.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Clang-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Clang-DetermineCompilerInternal.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Compaq-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Cray-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Embarcadero-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Fujitsu-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/GHS-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/GNU-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/HP-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/HP-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/IAR-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Intel-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MIPSpro-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MSVC-C-FeatureTests.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MSVC-C.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MSVC-CXX-FeatureTests.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MSVC-CXX.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/MSVC-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/NVIDIA-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/PGI-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/PathScale-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/SCO-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/SDCC-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/SunPro-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/TI-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/Watcom-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/XL-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/XL-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/zOS-C-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/CompilerId/VS-10.vcxproj.in
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Internal/FeatureTesting.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/Windows-Determine-CXX.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/Windows-MSVC-C.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/Windows-MSVC-CXX.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/Windows-MSVC.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/Windows.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/Platform/WindowsPaths.cmake
|
||||||
|
C:/Program Files/CMake/share/cmake-3.12/Modules/SelectLibraryConfigurations.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3/FFTW3Config.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3/FFTW3ConfigVersion.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3/FFTW3LibraryDepends-debug.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3/FFTW3LibraryDepends-release.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3/FFTW3LibraryDepends.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f/FFTW3fConfig.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f/FFTW3fConfigVersion.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f/FFTW3fLibraryDepends-debug.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f/FFTW3fLibraryDepends-release.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/fftw3f/FFTW3fLibraryDepends.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/CopyImportedTargetProperties.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/glew-config.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/glew-targets-debug.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/glew-targets-release.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/glew-targets.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glew/vcpkg-cmake-wrapper.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3/glfw3Config.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3/glfw3ConfigVersion.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3/glfw3Targets-debug.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3/glfw3Targets-release.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/glfw3/glfw3Targets.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio/portaudioConfig.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio/portaudioConfigVersion.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio/portaudioTargets-debug.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio/portaudioTargets-release.cmake
|
||||||
|
C:/Users/Alex/vcpkg/installed/x64-windows/share/portaudio/portaudioTargets.cmake
|
||||||
|
C:/Users/Alex/vcpkg/scripts/buildsystems/vcpkg.cmake
|
||||||
|
D:/Documents/Code/sdrpp/CMakeLists.txt
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CMakeCCompiler.cmake
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CMakeCXXCompiler.cmake
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CMakeRCCompiler.cmake
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/3.12.1/CMakeSystem.cmake
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/feature_tests.c
|
||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/feature_tests.cxx
|
1
build_test/CMakeFiles/generate.stamp.list
Normal file
1
build_test/CMakeFiles/generate.stamp.list
Normal file
@ -0,0 +1 @@
|
|||||||
|
D:/Documents/Code/sdrpp/build_test/CMakeFiles/generate.stamp
|
167
build_test/ZERO_CHECK.vcxproj
Normal file
167
build_test/ZERO_CHECK.vcxproj
Normal file
File diff suppressed because one or more lines are too long
13
build_test/ZERO_CHECK.vcxproj.filters
Normal file
13
build_test/ZERO_CHECK.vcxproj.filters
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="D:\Documents\Code\sdrpp\build_test\CMakeFiles\931a7b42c3f2b3e572170c2b78d21b93\generate.stamp.rule">
|
||||||
|
<Filter>CMake Rules</Filter>
|
||||||
|
</CustomBuild>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="CMake Rules">
|
||||||
|
<UniqueIdentifier>{04547170-F8AB-35A0-A886-249AC8CCF004}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
44
build_test/cmake_install.cmake
Normal file
44
build_test/cmake_install.cmake
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Install script for directory: D:/Documents/Code/sdrpp
|
||||||
|
|
||||||
|
# Set the install prefix
|
||||||
|
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||||
|
set(CMAKE_INSTALL_PREFIX "C:/Program Files/sdrpp")
|
||||||
|
endif()
|
||||||
|
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
|
||||||
|
# Set the install configuration name.
|
||||||
|
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
|
||||||
|
if(BUILD_TYPE)
|
||||||
|
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
|
||||||
|
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_CONFIG_NAME "Release")
|
||||||
|
endif()
|
||||||
|
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set the component getting installed.
|
||||||
|
if(NOT CMAKE_INSTALL_COMPONENT)
|
||||||
|
if(COMPONENT)
|
||||||
|
message(STATUS "Install component: \"${COMPONENT}\"")
|
||||||
|
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_COMPONENT)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Is this installation the result of a crosscompile?
|
||||||
|
if(NOT DEFINED CMAKE_CROSSCOMPILING)
|
||||||
|
set(CMAKE_CROSSCOMPILING "FALSE")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_COMPONENT)
|
||||||
|
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
|
||||||
|
"${CMAKE_INSTALL_MANIFEST_FILES}")
|
||||||
|
file(WRITE "D:/Documents/Code/sdrpp/build_test/${CMAKE_INSTALL_MANIFEST}"
|
||||||
|
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
|
52
build_test/sdrpp.sln
Normal file
52
build_test/sdrpp.sln
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ALL_BUILD", "ALL_BUILD.vcxproj", "{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B} = {13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B} = {DD63A504-584E-36F8-BFCC-57C2EBA9085B}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZERO_CHECK", "ZERO_CHECK.vcxproj", "{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdrpp", "sdrpp.vcxproj", "{DD63A504-584E-36F8-BFCC-57C2EBA9085B}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B} = {13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
MinSizeRel|x64 = MinSizeRel|x64
|
||||||
|
RelWithDebInfo|x64 = RelWithDebInfo|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||||
|
{9B34C6EB-1510-35D6-A657-742C6A7B8CB6}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.Release|x64.Build.0 = Release|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||||
|
{13F861A1-C2DD-369D-A6BD-C94EDE20FB9B}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.Release|x64.Build.0 = Release|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
|
||||||
|
{DD63A504-584E-36F8-BFCC-57C2EBA9085B}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {DDF64D1B-B664-37FA-8211-351127B390E9}
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
384
build_test/sdrpp.vcxproj
Normal file
384
build_test/sdrpp.vcxproj
Normal file
File diff suppressed because one or more lines are too long
52
build_test/sdrpp.vcxproj.filters
Normal file
52
build_test/sdrpp.vcxproj.filters
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\frequency_select.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\icons.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\main.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\main_window.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\signal_path.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\waterfall.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_demo.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_draw.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_impl_glfw.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_impl_opengl3.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_plot.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="D:\Documents\Code\sdrpp\src\imgui\imgui_widgets.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="D:\Documents\Code\sdrpp\CMakeLists.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{7C75FAF6-698C-36A1-9FF6-550B7CCCA3C6}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
78
src/bandplan.cpp
Normal file
78
src/bandplan.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include <bandplan.h>
|
||||||
|
|
||||||
|
namespace bandplan {
|
||||||
|
std::map<std::string, BandPlan_t> bandplans;
|
||||||
|
std::vector<std::string> bandplanNames;
|
||||||
|
std::string bandplanNameTxt;
|
||||||
|
|
||||||
|
void generateTxt() {
|
||||||
|
bandplanNameTxt = "";
|
||||||
|
for (int i = 0; i < bandplanNames.size(); i++) {
|
||||||
|
bandplanNameTxt += bandplanNames[i];
|
||||||
|
bandplanNameTxt += '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void to_json(json& j, const Band_t& b) {
|
||||||
|
j = json{
|
||||||
|
{"name", b.name},
|
||||||
|
{"type", b.type},
|
||||||
|
{"start", b.start},
|
||||||
|
{"end", b.end},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void from_json(const json& j, Band_t& b) {
|
||||||
|
j.at("name").get_to(b.name);
|
||||||
|
j.at("type").get_to(b.type);
|
||||||
|
j.at("start").get_to(b.start);
|
||||||
|
j.at("end").get_to(b.end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void to_json(json& j, const BandPlan_t& b) {
|
||||||
|
j = json{
|
||||||
|
{"name", b.name},
|
||||||
|
{"country_name", b.countryName},
|
||||||
|
{"country_code", b.countryCode},
|
||||||
|
{"author_name", b.authorName},
|
||||||
|
{"author_url", b.authorURL},
|
||||||
|
{"bands", b.bands}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void from_json(const json& j, BandPlan_t& b) {
|
||||||
|
j.at("name").get_to(b.name);
|
||||||
|
j.at("country_name").get_to(b.countryName);
|
||||||
|
j.at("country_code").get_to(b.countryCode);
|
||||||
|
j.at("author_name").get_to(b.authorName);
|
||||||
|
j.at("author_url").get_to(b.authorURL);
|
||||||
|
j.at("bands").get_to(b.bands);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadBandPlan(std::string path) {
|
||||||
|
std::ifstream file(path.c_str());
|
||||||
|
json data;
|
||||||
|
data << file;
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
BandPlan_t plan = data.get<BandPlan_t>();
|
||||||
|
if (bandplans.find(plan.name) != bandplans.end()) {
|
||||||
|
spdlog::error("Duplicate band plan name ({0}), not loading.", plan.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bandplans[plan.name] = plan;
|
||||||
|
bandplanNames.push_back(plan.name);
|
||||||
|
generateTxt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadFromDir(std::string path) {
|
||||||
|
bandplans.clear();
|
||||||
|
for (const auto & file : std::filesystem::directory_iterator(path)) {
|
||||||
|
std::string path = file.path().generic_string();
|
||||||
|
if (file.path().extension().generic_string() != ".json") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
loadBandPlan(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
38
src/bandplan.h
Normal file
38
src/bandplan.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <json.hpp>
|
||||||
|
#include <fstream>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
using nlohmann::json;
|
||||||
|
|
||||||
|
namespace bandplan {
|
||||||
|
struct Band_t {
|
||||||
|
std::string name;
|
||||||
|
std::string type;
|
||||||
|
float start;
|
||||||
|
float end;
|
||||||
|
};
|
||||||
|
|
||||||
|
void to_json(json& j, const Band_t& b);
|
||||||
|
void from_json(const json& j, Band_t& b);
|
||||||
|
|
||||||
|
struct BandPlan_t {
|
||||||
|
std::string name;
|
||||||
|
std::string countryName;
|
||||||
|
std::string countryCode;
|
||||||
|
std::string authorName;
|
||||||
|
std::string authorURL;
|
||||||
|
std::vector<Band_t> bands;
|
||||||
|
};
|
||||||
|
|
||||||
|
void to_json(json& j, const BandPlan_t& b);
|
||||||
|
void from_json(const json& j, BandPlan_t& b);
|
||||||
|
|
||||||
|
void loadBandPlan(std::string path);
|
||||||
|
void loadFromDir(std::string path);
|
||||||
|
|
||||||
|
extern std::map<std::string, BandPlan_t> bandplans;
|
||||||
|
extern std::vector<std::string> bandplanNames;
|
||||||
|
extern std::string bandplanNameTxt;
|
||||||
|
};
|
@ -144,7 +144,6 @@ namespace dsp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setBlockSize(int blockSize) {
|
void setBlockSize(int blockSize) {
|
||||||
printf("%d\n", blockSize);
|
|
||||||
if (running) {
|
if (running) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -243,8 +242,6 @@ namespace dsp {
|
|||||||
_interp = _outputSampleRate / _gcd;
|
_interp = _outputSampleRate / _gcd;
|
||||||
_decim = inputSampleRate / _gcd;
|
_decim = inputSampleRate / _gcd;
|
||||||
|
|
||||||
printf("FIRResampler.setInputSampleRate(): %d %d\n", _interp, _decim);
|
|
||||||
|
|
||||||
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
||||||
if (passBand > 0.0f && transWidth > 0.0f) {
|
if (passBand > 0.0f && transWidth > 0.0f) {
|
||||||
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
||||||
@ -270,8 +267,6 @@ namespace dsp {
|
|||||||
outputBlockSize = (_blockSize * _interp) / _decim;
|
outputBlockSize = (_blockSize * _interp) / _decim;
|
||||||
output.setMaxLatency(outputBlockSize * 2);
|
output.setMaxLatency(outputBlockSize * 2);
|
||||||
|
|
||||||
printf("FIRResampler.setOutputSampleRate(): %d %d\n", _interp, _decim);
|
|
||||||
|
|
||||||
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
||||||
if (passBand > 0.0f && transWidth > 0.0f) {
|
if (passBand > 0.0f && transWidth > 0.0f) {
|
||||||
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
||||||
@ -333,11 +328,9 @@ namespace dsp {
|
|||||||
|
|
||||||
float correction = (float)sqrt((float)interp);
|
float correction = (float)sqrt((float)interp);
|
||||||
|
|
||||||
printf("Resamp: %d %d", inCount, _this->outputBlockSize);
|
|
||||||
|
|
||||||
int afterInterp = inCount * interp;
|
int afterInterp = inCount * interp;
|
||||||
int outIndex = 0;
|
int outIndex = 0;
|
||||||
while (true) {q
|
while (true) {
|
||||||
if (_this->_input->read(inBuf, inCount) < 0) { break; };
|
if (_this->_input->read(inBuf, inCount) < 0) { break; };
|
||||||
for (int i = 0; outIndex < outCount; i += decim) {
|
for (int i = 0; outIndex < outCount; i += decim) {
|
||||||
outBuf[outIndex].i = 0;
|
outBuf[outIndex].i = 0;
|
||||||
@ -437,8 +430,6 @@ namespace dsp {
|
|||||||
_interp = _outputSampleRate / _gcd;
|
_interp = _outputSampleRate / _gcd;
|
||||||
_decim = inputSampleRate / _gcd;
|
_decim = inputSampleRate / _gcd;
|
||||||
|
|
||||||
printf("FloatFIRResampler.setInputSampleRate(): %d %d\n", _interp, _decim);
|
|
||||||
|
|
||||||
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
||||||
if (passBand > 0.0f && transWidth > 0.0f) {
|
if (passBand > 0.0f && transWidth > 0.0f) {
|
||||||
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
||||||
@ -464,8 +455,6 @@ namespace dsp {
|
|||||||
outputBlockSize = (_blockSize * _interp) / _decim;
|
outputBlockSize = (_blockSize * _interp) / _decim;
|
||||||
output.setMaxLatency(outputBlockSize * 2);
|
output.setMaxLatency(outputBlockSize * 2);
|
||||||
|
|
||||||
printf("FloatResampler.setOutputSampleRate(): %d %d\n", _interp, _decim);
|
|
||||||
|
|
||||||
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
float cutoff = std::min<float>(_outputSampleRate / 2.0f, _inputSampleRate / 2.0f);
|
||||||
if (passBand > 0.0f && transWidth > 0.0f) {
|
if (passBand > 0.0f && transWidth > 0.0f) {
|
||||||
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
dsp::BlackmanWindow(_taps, _inputSampleRate * _interp, passBand, transWidth);
|
||||||
@ -527,8 +516,6 @@ namespace dsp {
|
|||||||
|
|
||||||
float correction = (float)sqrt((float)interp);
|
float correction = (float)sqrt((float)interp);
|
||||||
|
|
||||||
printf("FloatResamp: %d %d", inCount, _this->outputBlockSize);
|
|
||||||
|
|
||||||
int afterInterp = inCount * interp;
|
int afterInterp = inCount * interp;
|
||||||
int outIndex = 0;
|
int outIndex = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <dsp/types.h>
|
#include <dsp/types.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <portaudio.h>
|
#include <portaudio.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace io {
|
namespace io {
|
||||||
class AudioSink {
|
class AudioSink {
|
||||||
@ -40,9 +41,16 @@ namespace io {
|
|||||||
outputParams.device = Pa_GetDefaultOutputDevice();
|
outputParams.device = Pa_GetDefaultOutputDevice();
|
||||||
outputParams.suggestedLatency = Pa_GetDeviceInfo(outputParams.device)->defaultLowOutputLatency;
|
outputParams.suggestedLatency = Pa_GetDeviceInfo(outputParams.device)->defaultLowOutputLatency;
|
||||||
PaError err = Pa_OpenStream(&stream, NULL, &outputParams, 48000.0f, _bufferSize, paClipOff, _callback, this);
|
PaError err = Pa_OpenStream(&stream, NULL, &outputParams, 48000.0f, _bufferSize, paClipOff, _callback, this);
|
||||||
printf("%s\n", Pa_GetErrorText(err));
|
if (err != 0) {
|
||||||
|
spdlog::error("Error while opening audio stream: ({0}) => {1}", err, Pa_GetErrorText(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
err = Pa_StartStream(stream);
|
err = Pa_StartStream(stream);
|
||||||
printf("%s\n", Pa_GetErrorText(err));
|
if (err != 0) {
|
||||||
|
spdlog::error("Error while starting audio stream: ({0}) => {1}", err, Pa_GetErrorText(err));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spdlog::info("Audio device open.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <SoapySDR/Device.hpp>
|
#include <SoapySDR/Device.hpp>
|
||||||
#include <SoapySDR/Modules.hpp>
|
#include <SoapySDR/Modules.hpp>
|
||||||
|
#include <SoapySDR/Logger.hpp>
|
||||||
#include <dsp/stream.h>
|
#include <dsp/stream.h>
|
||||||
#include <dsp/types.h>
|
#include <dsp/types.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace io {
|
namespace io {
|
||||||
class SoapyWrapper {
|
class SoapyWrapper {
|
||||||
public:
|
public:
|
||||||
SoapyWrapper() {
|
SoapyWrapper() {
|
||||||
|
SoapySDR::registerLogHandler(_logHandler);
|
||||||
output.init(64000);
|
output.init(64000);
|
||||||
currentGains = new float[1];
|
currentGains = new float[1];
|
||||||
refresh();
|
refresh();
|
||||||
@ -131,10 +134,21 @@ namespace io {
|
|||||||
}
|
}
|
||||||
_this->output.write(buf, res);
|
_this->output.write(buf, res);
|
||||||
}
|
}
|
||||||
printf("Read worker terminated\n");
|
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _logHandler(const SoapySDRLogLevel lvl, const char* message) {
|
||||||
|
if (lvl == SOAPY_SDR_FATAL || lvl == SOAPY_SDR_CRITICAL || lvl == SOAPY_SDR_ERROR) {
|
||||||
|
spdlog::error(message);
|
||||||
|
}
|
||||||
|
else if (lvl == SOAPY_SDR_WARNING) {
|
||||||
|
spdlog::warn(message);
|
||||||
|
}
|
||||||
|
else if (lvl == SOAPY_SDR_NOTICE | SOAPY_SDR_INFO) {
|
||||||
|
spdlog::info(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SoapySDR::Kwargs args;
|
SoapySDR::Kwargs args;
|
||||||
SoapySDR::Device* dev;
|
SoapySDR::Device* dev;
|
||||||
SoapySDR::Stream* _stream;
|
SoapySDR::Stream* _stream;
|
||||||
|
25347
src/json.hpp
Normal file
25347
src/json.hpp
Normal file
File diff suppressed because it is too large
Load Diff
16
src/main.cpp
16
src/main.cpp
@ -8,14 +8,15 @@
|
|||||||
#include <styles.h>
|
#include <styles.h>
|
||||||
#include <icons.h>
|
#include <icons.h>
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
#include <bandplan.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void glfw_error_callback(int error, const char* description) {
|
static void glfw_error_callback(int error, const char* description) {
|
||||||
fprintf(stderr, "Glfw Error %d: %s\n", error, description);
|
spdlog::error("Glfw Error {0}: {1}", error, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
@ -23,6 +24,8 @@ int main() {
|
|||||||
//FreeConsole();
|
//FreeConsole();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
spdlog::info("SDR++ v" VERSION_STR);
|
||||||
|
|
||||||
// Setup window
|
// Setup window
|
||||||
glfwSetErrorCallback(glfw_error_callback);
|
glfwSetErrorCallback(glfw_error_callback);
|
||||||
if (!glfwInit()) {
|
if (!glfwInit()) {
|
||||||
@ -42,7 +45,7 @@ int main() {
|
|||||||
glfwSwapInterval(1); // Enable vsync
|
glfwSwapInterval(1); // Enable vsync
|
||||||
|
|
||||||
if (glewInit() != GLEW_OK) {
|
if (glewInit() != GLEW_OK) {
|
||||||
fprintf(stderr, "Failed to initialize OpenGL loader!\n");
|
spdlog::error("Failed to initialize OpenGL loader!");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,9 +63,14 @@ int main() {
|
|||||||
|
|
||||||
windowInit();
|
windowInit();
|
||||||
|
|
||||||
printf("Loading icons...\n");
|
spdlog::info("Loading icons");
|
||||||
icons::load();
|
icons::load();
|
||||||
|
|
||||||
|
spdlog::info("Loading band plans");
|
||||||
|
bandplan::loadFromDir("../bandplans");
|
||||||
|
|
||||||
|
spdlog::info("Ready.");
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
while (!glfwWindowShouldClose(window)) {
|
while (!glfwWindowShouldClose(window)) {
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include <signal_path.h>
|
#include <signal_path.h>
|
||||||
#include <io/soapy.h>
|
#include <io/soapy.h>
|
||||||
#include <icons.h>
|
#include <icons.h>
|
||||||
|
#include <bandplan.h>
|
||||||
|
#include <watcher.h>
|
||||||
|
|
||||||
std::thread worker;
|
std::thread worker;
|
||||||
std::mutex fft_mtx;
|
std::mutex fft_mtx;
|
||||||
@ -64,50 +66,26 @@ void windowInit() {
|
|||||||
fft_out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize);
|
fft_out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize);
|
||||||
p = fftwf_plan_dft_1d(fftSize, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);
|
p = fftwf_plan_dft_1d(fftSize, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);
|
||||||
|
|
||||||
printf("Starting DSP Thread!\n");
|
|
||||||
|
|
||||||
sigPath.init(sampleRate, 20, fftSize, &soapy.output, (dsp::complex_t*)fft_in, fftHandler);
|
sigPath.init(sampleRate, 20, fftSize, &soapy.output, (dsp::complex_t*)fft_in, fftHandler);
|
||||||
sigPath.start();
|
sigPath.start();
|
||||||
|
|
||||||
uiGains = new float[1];
|
uiGains = new float[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
int devId = 0;
|
watcher<int> devId(0, true);
|
||||||
int _devId = -1;
|
watcher<int> srId(0, true);
|
||||||
|
watcher<int> bandplanId(0);
|
||||||
int srId = 0;
|
watcher<long> freq(90500000L);
|
||||||
int _srId = -1;
|
|
||||||
|
|
||||||
bool showExample = false;
|
|
||||||
|
|
||||||
long freq = 90500000;
|
|
||||||
long _freq = 90500000;
|
|
||||||
|
|
||||||
int demod = 1;
|
int demod = 1;
|
||||||
|
watcher<float> vfoFreq(92000000.0f);
|
||||||
bool state = false;
|
watcher<float> volume(1.0f);
|
||||||
bool mulstate = true;
|
|
||||||
|
|
||||||
float vfoFreq = 92000000.0f;
|
|
||||||
float lastVfoFreq = 92000000.0f;
|
|
||||||
|
|
||||||
float volume = 1.0f;
|
|
||||||
float lastVolume = 1.0f;
|
|
||||||
|
|
||||||
float fftMin = -70.0f;
|
float fftMin = -70.0f;
|
||||||
float fftMax = 0.0f;
|
float fftMax = 0.0f;
|
||||||
|
watcher<float> offset(0.0f, true);
|
||||||
float offset = 0.0f;
|
watcher<float> bw(8000000.0f, true);
|
||||||
float lastOffset = -1.0f;
|
|
||||||
float bw = 8000000.0f;
|
|
||||||
float lastBW = -1.0f;
|
|
||||||
|
|
||||||
int sampleRate = 1000000;
|
int sampleRate = 1000000;
|
||||||
|
|
||||||
bool playing = false;
|
bool playing = false;
|
||||||
|
watcher<bool> dcbias(false, false);
|
||||||
bool dcbias = false;
|
|
||||||
bool _dcbias = false;
|
|
||||||
|
|
||||||
void setVFO(float freq) {
|
void setVFO(float freq) {
|
||||||
float currentOff = wtf.getVFOOfset();
|
float currentOff = wtf.getVFOOfset();
|
||||||
@ -216,17 +194,14 @@ void drawWindow() {
|
|||||||
fSel.setFrequency(wtf.getCenterFrequency() + wtf.getVFOOfset());
|
fSel.setFrequency(wtf.getCenterFrequency() + wtf.getVFOOfset());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (volume != lastVolume) {
|
if (volume.changed()) {
|
||||||
lastVolume = volume;
|
sigPath.setVolume(volume.val);
|
||||||
sigPath.setVolume(volume);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (devId != _devId && soapy.devList.size() > 0) {
|
if (devId.changed() && soapy.devList.size() > 0) {
|
||||||
_devId = devId;
|
spdlog::info("Changed input device: {0}", devId.val);
|
||||||
soapy.setDevice(soapy.devList[devId]);
|
soapy.setDevice(soapy.devList[devId.val]);
|
||||||
srId = 0;
|
srId.markAsChanged();
|
||||||
_srId = -1;
|
|
||||||
soapy.setSampleRate(soapy.sampleRates[0]);
|
|
||||||
if (soapy.gainList.size() == 0) {
|
if (soapy.gainList.size() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -237,20 +212,22 @@ void drawWindow() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srId != _srId && soapy.devList.size() > 0) {
|
if (srId.changed() && soapy.devList.size() > 0) {
|
||||||
_srId = srId;
|
spdlog::info("Changed sample rate: {0}", srId.val);
|
||||||
sampleRate = soapy.sampleRates[srId];
|
sampleRate = soapy.sampleRates[srId.val];
|
||||||
printf("Setting sample rate to %f\n", (float)soapy.sampleRates[srId]);
|
|
||||||
soapy.setSampleRate(sampleRate);
|
soapy.setSampleRate(sampleRate);
|
||||||
wtf.setBandwidth(sampleRate);
|
wtf.setBandwidth(sampleRate);
|
||||||
wtf.setViewBandwidth(sampleRate);
|
wtf.setViewBandwidth(sampleRate);
|
||||||
sigPath.setSampleRate(sampleRate);
|
sigPath.setSampleRate(sampleRate);
|
||||||
bw = sampleRate;
|
bw.val = sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dcbias != _dcbias) {
|
if (dcbias.changed()) {
|
||||||
_dcbias = dcbias;
|
sigPath.setDCBiasCorrection(dcbias.val);
|
||||||
sigPath.setDCBiasCorrection(dcbias);
|
}
|
||||||
|
|
||||||
|
if (bandplanId.changed()) {
|
||||||
|
spdlog::info("BANDPLAN CHANGED!!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImVec2 vMin = ImGui::GetWindowContentRegionMin();
|
ImVec2 vMin = ImGui::GetWindowContentRegionMin();
|
||||||
@ -278,7 +255,7 @@ void drawWindow() {
|
|||||||
|
|
||||||
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 8);
|
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 8);
|
||||||
ImGui::SetNextItemWidth(200);
|
ImGui::SetNextItemWidth(200);
|
||||||
ImGui::SliderFloat("##_2_", &volume, 0.0f, 1.0f, "");
|
ImGui::SliderFloat("##_2_", &volume.val, 0.0f, 1.0f, "");
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
@ -295,14 +272,14 @@ void drawWindow() {
|
|||||||
|
|
||||||
if (ImGui::CollapsingHeader("Source")) {
|
if (ImGui::CollapsingHeader("Source")) {
|
||||||
ImGui::PushItemWidth(ImGui::GetWindowSize().x);
|
ImGui::PushItemWidth(ImGui::GetWindowSize().x);
|
||||||
ImGui::Combo("##_0_", &devId, soapy.txtDevList.c_str());
|
ImGui::Combo("##_0_", &devId.val, soapy.txtDevList.c_str());
|
||||||
|
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
if (!playing) {
|
if (!playing) {
|
||||||
ImGui::Combo("##_1_", &srId, soapy.txtSampleRateList.c_str());
|
ImGui::Combo("##_1_", &srId.val, soapy.txtSampleRateList.c_str());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ImGui::Text("%.0f Samples/s", soapy.sampleRates[srId]);
|
ImGui::Text("%.0f Samples/s", soapy.sampleRates[srId.val]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@ -316,11 +293,6 @@ void drawWindow() {
|
|||||||
sprintf(buf, "##_gain_slide_%d_", i);
|
sprintf(buf, "##_gain_slide_%d_", i);
|
||||||
ImGui::SliderFloat(buf, &uiGains[i], soapy.gainRanges[i].minimum(), soapy.gainRanges[i].maximum());
|
ImGui::SliderFloat(buf, &uiGains[i], soapy.gainRanges[i].minimum(), soapy.gainRanges[i].maximum());
|
||||||
|
|
||||||
// float step = soapy.gainRanges[i].step();
|
|
||||||
// printf("%f\n", step);
|
|
||||||
|
|
||||||
// uiGains[i] = roundf(uiGains[i] / soapy.gainRanges[i].step()) * soapy.gainRanges[i].step();
|
|
||||||
|
|
||||||
if (uiGains[i] != soapy.currentGains[i]) {
|
if (uiGains[i] != soapy.currentGains[i]) {
|
||||||
soapy.setGain(i, uiGains[i]);
|
soapy.setGain(i, uiGains[i]);
|
||||||
}
|
}
|
||||||
@ -369,13 +341,19 @@ void drawWindow() {
|
|||||||
ImGui::Columns(1, "EndRadioModeColumns", false);
|
ImGui::Columns(1, "EndRadioModeColumns", false);
|
||||||
|
|
||||||
//ImGui::InputInt("Frequency (kHz)", &freq);
|
//ImGui::InputInt("Frequency (kHz)", &freq);
|
||||||
ImGui::Checkbox("DC Bias Removal", &dcbias);
|
ImGui::Checkbox("DC Bias Removal", &dcbias.val);
|
||||||
|
|
||||||
ImGui::EndGroup();
|
ImGui::EndGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::CollapsingHeader("Audio");
|
ImGui::CollapsingHeader("Audio");
|
||||||
|
|
||||||
|
if (ImGui::CollapsingHeader("Band Plan")) {
|
||||||
|
ImGui::PushItemWidth(ImGui::GetWindowSize().x);
|
||||||
|
ImGui::Combo("##_4_", &bandplanId.val, bandplan::bandplanNameTxt.c_str());
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::CollapsingHeader("Display");
|
ImGui::CollapsingHeader("Display");
|
||||||
|
|
||||||
ImGui::CollapsingHeader("Recording");
|
ImGui::CollapsingHeader("Recording");
|
||||||
@ -397,7 +375,7 @@ void drawWindow() {
|
|||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
|
|
||||||
ImGui::Text("Zoom");
|
ImGui::Text("Zoom");
|
||||||
ImGui::VSliderFloat("##_7_", ImVec2(20.0f, 150.0f), &bw, sampleRate, 1000.0f, "");
|
ImGui::VSliderFloat("##_7_", ImVec2(20.0f, 150.0f), &bw.val, sampleRate, 1000.0f, "");
|
||||||
|
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
@ -409,14 +387,11 @@ void drawWindow() {
|
|||||||
ImGui::Text("Min");
|
ImGui::Text("Min");
|
||||||
ImGui::VSliderFloat("##_9_", ImVec2(20.0f, 150.0f), &fftMin, 0.0f, -100.0f, "");
|
ImGui::VSliderFloat("##_9_", ImVec2(20.0f, 150.0f), &fftMin, 0.0f, -100.0f, "");
|
||||||
|
|
||||||
if (bw != lastBW) {
|
if (bw.changed()) {
|
||||||
lastBW = bw;
|
wtf.setViewBandwidth(bw.val);
|
||||||
wtf.setViewBandwidth(bw);
|
|
||||||
wtf.setViewOffset(wtf.getVFOOfset());
|
wtf.setViewOffset(wtf.getVFOOfset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
wtf.setFFTMin(fftMin);
|
wtf.setFFTMin(fftMin);
|
||||||
wtf.setFFTMax(fftMax);
|
wtf.setFFTMax(fftMax);
|
||||||
wtf.setWaterfallMin(fftMin);
|
wtf.setWaterfallMin(fftMin);
|
||||||
|
@ -9,10 +9,6 @@ void SignalPath::init(uint64_t sampleRate, int fftRate, int fftSize, dsp::stream
|
|||||||
this->fftRate = fftRate;
|
this->fftRate = fftRate;
|
||||||
this->fftSize = fftSize;
|
this->fftSize = fftSize;
|
||||||
|
|
||||||
// for (int i = 0; i < iftaps.size(); i++) {
|
|
||||||
// printf("%f\n", iftaps[i]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
_demod = DEMOD_FM;
|
_demod = DEMOD_FM;
|
||||||
|
|
||||||
dcBiasRemover.init(input, 32000);
|
dcBiasRemover.init(input, 32000);
|
||||||
@ -76,30 +72,24 @@ void SignalPath::setDemodulator(int demId) {
|
|||||||
|
|
||||||
// Stop current demodulator
|
// Stop current demodulator
|
||||||
if (_demod == DEMOD_FM) {
|
if (_demod == DEMOD_FM) {
|
||||||
printf("Stopping FM demodulator\n");
|
|
||||||
demod.stop();
|
demod.stop();
|
||||||
}
|
}
|
||||||
else if (_demod == DEMOD_NFM) {
|
else if (_demod == DEMOD_NFM) {
|
||||||
printf("Stopping NFM demodulator\n");
|
|
||||||
demod.stop();
|
demod.stop();
|
||||||
}
|
}
|
||||||
else if (_demod == DEMOD_AM) {
|
else if (_demod == DEMOD_AM) {
|
||||||
printf("Stopping AM demodulator\n");
|
|
||||||
amDemod.stop();
|
amDemod.stop();
|
||||||
}
|
}
|
||||||
else if (_demod == DEMOD_USB) {
|
else if (_demod == DEMOD_USB) {
|
||||||
printf("Stopping USB demodulator\n");
|
|
||||||
ssbDemod.stop();
|
ssbDemod.stop();
|
||||||
}
|
}
|
||||||
else if (_demod == DEMOD_LSB) {
|
else if (_demod == DEMOD_LSB) {
|
||||||
printf("Stopping LSB demodulator\n");
|
|
||||||
ssbDemod.stop();
|
ssbDemod.stop();
|
||||||
}
|
}
|
||||||
_demod = demId;
|
_demod = demId;
|
||||||
|
|
||||||
// Set input of the audio resampler
|
// Set input of the audio resampler
|
||||||
if (demId == DEMOD_FM) {
|
if (demId == DEMOD_FM) {
|
||||||
printf("Starting FM demodulator\n");
|
|
||||||
mainVFO.setOutputSampleRate(200000, 200000);
|
mainVFO.setOutputSampleRate(200000, 200000);
|
||||||
demod.setBlockSize(mainVFO.getOutputBlockSize());
|
demod.setBlockSize(mainVFO.getOutputBlockSize());
|
||||||
demod.setSampleRate(200000);
|
demod.setSampleRate(200000);
|
||||||
@ -109,7 +99,6 @@ void SignalPath::setDemodulator(int demId) {
|
|||||||
demod.start();
|
demod.start();
|
||||||
}
|
}
|
||||||
if (demId == DEMOD_NFM) {
|
if (demId == DEMOD_NFM) {
|
||||||
printf("Starting NFM demodulator\n");
|
|
||||||
mainVFO.setOutputSampleRate(12500, 12500);
|
mainVFO.setOutputSampleRate(12500, 12500);
|
||||||
demod.setBlockSize(mainVFO.getOutputBlockSize());
|
demod.setBlockSize(mainVFO.getOutputBlockSize());
|
||||||
demod.setSampleRate(12500);
|
demod.setSampleRate(12500);
|
||||||
@ -119,7 +108,6 @@ void SignalPath::setDemodulator(int demId) {
|
|||||||
demod.start();
|
demod.start();
|
||||||
}
|
}
|
||||||
else if (demId == DEMOD_AM) {
|
else if (demId == DEMOD_AM) {
|
||||||
printf("Starting AM demodulator\n");
|
|
||||||
mainVFO.setOutputSampleRate(12500, 12500);
|
mainVFO.setOutputSampleRate(12500, 12500);
|
||||||
amDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
amDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
||||||
audioResamp.setInput(&amDemod.output);
|
audioResamp.setInput(&amDemod.output);
|
||||||
@ -127,7 +115,6 @@ void SignalPath::setDemodulator(int demId) {
|
|||||||
amDemod.start();
|
amDemod.start();
|
||||||
}
|
}
|
||||||
else if (demId == DEMOD_USB) {
|
else if (demId == DEMOD_USB) {
|
||||||
printf("Starting USB demodulator\n");
|
|
||||||
mainVFO.setOutputSampleRate(6000, 3000);
|
mainVFO.setOutputSampleRate(6000, 3000);
|
||||||
ssbDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
ssbDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
||||||
ssbDemod.setMode(dsp::SSBDemod::MODE_USB);
|
ssbDemod.setMode(dsp::SSBDemod::MODE_USB);
|
||||||
@ -136,7 +123,6 @@ void SignalPath::setDemodulator(int demId) {
|
|||||||
ssbDemod.start();
|
ssbDemod.start();
|
||||||
}
|
}
|
||||||
else if (demId == DEMOD_LSB) {
|
else if (demId == DEMOD_LSB) {
|
||||||
printf("Starting LSB demodulator\n");
|
|
||||||
mainVFO.setOutputSampleRate(6000, 3000);
|
mainVFO.setOutputSampleRate(6000, 3000);
|
||||||
ssbDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
ssbDemod.setBlockSize(mainVFO.getOutputBlockSize());
|
||||||
ssbDemod.setMode(dsp::SSBDemod::MODE_LSB);
|
ssbDemod.setMode(dsp::SSBDemod::MODE_LSB);
|
||||||
@ -157,7 +143,6 @@ void SignalPath::start() {
|
|||||||
|
|
||||||
mainVFO.start();
|
mainVFO.start();
|
||||||
demod.start();
|
demod.start();
|
||||||
//ns.start();
|
|
||||||
|
|
||||||
audioResamp.start();
|
audioResamp.start();
|
||||||
audio.start();
|
audio.start();
|
||||||
|
93
src/spdlog/async.h
Normal file
93
src/spdlog/async.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//
|
||||||
|
// Async logging using global thread pool
|
||||||
|
// All loggers created here share same global thread pool.
|
||||||
|
// Each log message is pushed to a queue along with a shared pointer to the
|
||||||
|
// logger.
|
||||||
|
// If a logger deleted while having pending messages in the queue, it's actual
|
||||||
|
// destruction will defer
|
||||||
|
// until all its messages are processed by the thread pool.
|
||||||
|
// This is because each message in the queue holds a shared_ptr to the
|
||||||
|
// originating logger.
|
||||||
|
|
||||||
|
#include <spdlog/async_logger.h>
|
||||||
|
#include <spdlog/details/registry.h>
|
||||||
|
#include <spdlog/details/thread_pool.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
static const size_t default_async_q_size = 8192;
|
||||||
|
}
|
||||||
|
|
||||||
|
// async logger factory - creates async loggers backed with thread pool.
|
||||||
|
// if a global thread pool doesn't already exist, create it with default queue
|
||||||
|
// size of 8192 items and single thread.
|
||||||
|
template<async_overflow_policy OverflowPolicy = async_overflow_policy::block>
|
||||||
|
struct async_factory_impl
|
||||||
|
{
|
||||||
|
template<typename Sink, typename... SinkArgs>
|
||||||
|
static std::shared_ptr<async_logger> create(std::string logger_name, SinkArgs &&... args)
|
||||||
|
{
|
||||||
|
auto ®istry_inst = details::registry::instance();
|
||||||
|
|
||||||
|
// create global thread pool if not already exists..
|
||||||
|
|
||||||
|
auto &mutex = registry_inst.tp_mutex();
|
||||||
|
std::lock_guard<std::recursive_mutex> tp_lock(mutex);
|
||||||
|
auto tp = registry_inst.get_tp();
|
||||||
|
if (tp == nullptr)
|
||||||
|
{
|
||||||
|
tp = std::make_shared<details::thread_pool>(details::default_async_q_size, 1);
|
||||||
|
registry_inst.set_tp(tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...);
|
||||||
|
auto new_logger = std::make_shared<async_logger>(std::move(logger_name), std::move(sink), std::move(tp), OverflowPolicy);
|
||||||
|
registry_inst.initialize_logger(new_logger);
|
||||||
|
return new_logger;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
using async_factory = async_factory_impl<async_overflow_policy::block>;
|
||||||
|
using async_factory_nonblock = async_factory_impl<async_overflow_policy::overrun_oldest>;
|
||||||
|
|
||||||
|
template<typename Sink, typename... SinkArgs>
|
||||||
|
inline std::shared_ptr<spdlog::logger> create_async(std::string logger_name, SinkArgs &&... sink_args)
|
||||||
|
{
|
||||||
|
return async_factory::create<Sink>(std::move(logger_name), std::forward<SinkArgs>(sink_args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Sink, typename... SinkArgs>
|
||||||
|
inline std::shared_ptr<spdlog::logger> create_async_nb(std::string logger_name, SinkArgs &&... sink_args)
|
||||||
|
{
|
||||||
|
return async_factory_nonblock::create<Sink>(std::move(logger_name), std::forward<SinkArgs>(sink_args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set global thread pool.
|
||||||
|
inline void init_thread_pool(size_t q_size, size_t thread_count, std::function<void()> on_thread_start)
|
||||||
|
{
|
||||||
|
auto tp = std::make_shared<details::thread_pool>(q_size, thread_count, on_thread_start);
|
||||||
|
details::registry::instance().set_tp(std::move(tp));
|
||||||
|
}
|
||||||
|
|
||||||
|
// set global thread pool.
|
||||||
|
inline void init_thread_pool(size_t q_size, size_t thread_count)
|
||||||
|
{
|
||||||
|
init_thread_pool(q_size, thread_count, [] {});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the global thread pool.
|
||||||
|
inline std::shared_ptr<spdlog::details::thread_pool> thread_pool()
|
||||||
|
{
|
||||||
|
return details::registry::instance().get_tp();
|
||||||
|
}
|
||||||
|
} // namespace spdlog
|
92
src/spdlog/async_logger-inl.h
Normal file
92
src/spdlog/async_logger-inl.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/async_logger.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/sinks/sink.h>
|
||||||
|
#include <spdlog/details/thread_pool.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog::async_logger::async_logger(
|
||||||
|
std::string logger_name, sinks_init_list sinks_list, std::weak_ptr<details::thread_pool> tp, async_overflow_policy overflow_policy)
|
||||||
|
: async_logger(std::move(logger_name), sinks_list.begin(), sinks_list.end(), std::move(tp), overflow_policy)
|
||||||
|
{}
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog::async_logger::async_logger(
|
||||||
|
std::string logger_name, sink_ptr single_sink, std::weak_ptr<details::thread_pool> tp, async_overflow_policy overflow_policy)
|
||||||
|
: async_logger(std::move(logger_name), {std::move(single_sink)}, std::move(tp), overflow_policy)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// send the log message to the thread pool
|
||||||
|
SPDLOG_INLINE void spdlog::async_logger::sink_it_(const details::log_msg &msg)
|
||||||
|
{
|
||||||
|
if (auto pool_ptr = thread_pool_.lock())
|
||||||
|
{
|
||||||
|
pool_ptr->post_log(shared_from_this(), msg, overflow_policy_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("async log: thread pool doesn't exist anymore");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// send flush request to the thread pool
|
||||||
|
SPDLOG_INLINE void spdlog::async_logger::flush_()
|
||||||
|
{
|
||||||
|
if (auto pool_ptr = thread_pool_.lock())
|
||||||
|
{
|
||||||
|
pool_ptr->post_flush(shared_from_this(), overflow_policy_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("async flush: thread pool doesn't exist anymore");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// backend functions - called from the thread pool to do the actual job
|
||||||
|
//
|
||||||
|
SPDLOG_INLINE void spdlog::async_logger::backend_sink_it_(const details::log_msg &msg)
|
||||||
|
{
|
||||||
|
for (auto &sink : sinks_)
|
||||||
|
{
|
||||||
|
if (sink->should_log(msg.level))
|
||||||
|
{
|
||||||
|
SPDLOG_TRY
|
||||||
|
{
|
||||||
|
sink->log(msg);
|
||||||
|
}
|
||||||
|
SPDLOG_LOGGER_CATCH()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (should_flush_(msg))
|
||||||
|
{
|
||||||
|
backend_flush_();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void spdlog::async_logger::backend_flush_()
|
||||||
|
{
|
||||||
|
for (auto &sink : sinks_)
|
||||||
|
{
|
||||||
|
SPDLOG_TRY
|
||||||
|
{
|
||||||
|
sink->flush();
|
||||||
|
}
|
||||||
|
SPDLOG_LOGGER_CATCH()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::shared_ptr<spdlog::logger> spdlog::async_logger::clone(std::string new_name)
|
||||||
|
{
|
||||||
|
auto cloned = std::make_shared<spdlog::async_logger>(*this);
|
||||||
|
cloned->name_ = std::move(new_name);
|
||||||
|
return cloned;
|
||||||
|
}
|
68
src/spdlog/async_logger.h
Normal file
68
src/spdlog/async_logger.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Fast asynchronous logger.
|
||||||
|
// Uses pre allocated queue.
|
||||||
|
// Creates a single back thread to pop messages from the queue and log them.
|
||||||
|
//
|
||||||
|
// Upon each log write the logger:
|
||||||
|
// 1. Checks if its log level is enough to log the message
|
||||||
|
// 2. Push a new copy of the message to a queue (or block the caller until
|
||||||
|
// space is available in the queue)
|
||||||
|
// Upon destruction, logs all remaining messages in the queue before
|
||||||
|
// destructing..
|
||||||
|
|
||||||
|
#include <spdlog/logger.h>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
|
||||||
|
// Async overflow policy - block by default.
|
||||||
|
enum class async_overflow_policy
|
||||||
|
{
|
||||||
|
block, // Block until message can be enqueued
|
||||||
|
overrun_oldest // Discard oldest message in the queue if full when trying to
|
||||||
|
// add new item.
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
class thread_pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SPDLOG_API async_logger final : public std::enable_shared_from_this<async_logger>, public logger
|
||||||
|
{
|
||||||
|
friend class details::thread_pool;
|
||||||
|
|
||||||
|
public:
|
||||||
|
template<typename It>
|
||||||
|
async_logger(std::string logger_name, It begin, It end, std::weak_ptr<details::thread_pool> tp,
|
||||||
|
async_overflow_policy overflow_policy = async_overflow_policy::block)
|
||||||
|
: logger(std::move(logger_name), begin, end)
|
||||||
|
, thread_pool_(std::move(tp))
|
||||||
|
, overflow_policy_(overflow_policy)
|
||||||
|
{}
|
||||||
|
|
||||||
|
async_logger(std::string logger_name, sinks_init_list sinks_list, std::weak_ptr<details::thread_pool> tp,
|
||||||
|
async_overflow_policy overflow_policy = async_overflow_policy::block);
|
||||||
|
|
||||||
|
async_logger(std::string logger_name, sink_ptr single_sink, std::weak_ptr<details::thread_pool> tp,
|
||||||
|
async_overflow_policy overflow_policy = async_overflow_policy::block);
|
||||||
|
|
||||||
|
std::shared_ptr<logger> clone(std::string new_name) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void sink_it_(const details::log_msg &msg) override;
|
||||||
|
void flush_() override;
|
||||||
|
void backend_sink_it_(const details::log_msg &incoming_log_msg);
|
||||||
|
void backend_flush_();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::weak_ptr<details::thread_pool> thread_pool_;
|
||||||
|
async_overflow_policy overflow_policy_;
|
||||||
|
};
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "async_logger-inl.h"
|
||||||
|
#endif
|
45
src/spdlog/cfg/argv.h
Normal file
45
src/spdlog/cfg/argv.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <spdlog/cfg/helpers.h>
|
||||||
|
#include <spdlog/details/registry.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Init log levels using each argv entry that starts with "SPDLOG_LEVEL="
|
||||||
|
//
|
||||||
|
// set all loggers to debug level:
|
||||||
|
// example.exe "SPDLOG_LEVEL=debug"
|
||||||
|
|
||||||
|
// set logger1 to trace level
|
||||||
|
// example.exe "SPDLOG_LEVEL=logger1=trace"
|
||||||
|
|
||||||
|
// turn off all logging except for logger1 and logger2:
|
||||||
|
// example.exe "SPDLOG_LEVEL=off,logger1=debug,logger2=info"
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace cfg {
|
||||||
|
|
||||||
|
// search for SPDLOG_LEVEL= in the args and use it to init the levels
|
||||||
|
void load_argv_levels(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
const std::string spdlog_level_prefix = "SPDLOG_LEVEL=";
|
||||||
|
for (int i = 1; i < argc; i++)
|
||||||
|
{
|
||||||
|
std::string arg = argv[i];
|
||||||
|
if (arg.find(spdlog_level_prefix) == 0)
|
||||||
|
{
|
||||||
|
auto levels_string = arg.substr(spdlog_level_prefix.size());
|
||||||
|
auto levels = helpers::extract_levels(levels_string);
|
||||||
|
details::registry::instance().update_levels(std::move(levels));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_argv_levels(int argc, char **argv)
|
||||||
|
{
|
||||||
|
load_argv_levels(argc, const_cast<const char **>(argv));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cfg
|
||||||
|
} // namespace spdlog
|
36
src/spdlog/cfg/env.h
Normal file
36
src/spdlog/cfg/env.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <spdlog/cfg/helpers.h>
|
||||||
|
#include <spdlog/details/registry.h>
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Init levels and patterns from env variables SPDLOG_LEVEL
|
||||||
|
// Inspired from Rust's "env_logger" crate (https://crates.io/crates/env_logger).
|
||||||
|
// Note - fallback to "info" level on unrecognized levels
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// set global level to debug:
|
||||||
|
// export SPDLOG_LEVEL=debug
|
||||||
|
//
|
||||||
|
// turn off all logging except for logger1:
|
||||||
|
// export SPDLOG_LEVEL="off,logger1=debug"
|
||||||
|
//
|
||||||
|
|
||||||
|
// turn off all logging except for logger1 and logger2:
|
||||||
|
// export SPDLOG_LEVEL="off,logger1=debug,logger2=info"
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace cfg {
|
||||||
|
void load_env_levels()
|
||||||
|
{
|
||||||
|
auto env_val = details::os::getenv("SPDLOG_LEVEL");
|
||||||
|
auto levels = helpers::extract_levels(env_val);
|
||||||
|
details::registry::instance().update_levels(std::move(levels));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cfg
|
||||||
|
} // namespace spdlog
|
103
src/spdlog/cfg/helpers-inl.h
Normal file
103
src/spdlog/cfg/helpers-inl.h
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/cfg/helpers.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
#include <spdlog/details/registry.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace cfg {
|
||||||
|
namespace helpers {
|
||||||
|
|
||||||
|
// inplace convert to lowercase
|
||||||
|
inline std::string &to_lower_(std::string &str)
|
||||||
|
{
|
||||||
|
std::transform(
|
||||||
|
str.begin(), str.end(), str.begin(), [](char ch) { return static_cast<char>((ch >= 'A' && ch <= 'Z') ? ch + ('a' - 'A') : ch); });
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// inplace trim spaces
|
||||||
|
inline std::string &trim_(std::string &str)
|
||||||
|
{
|
||||||
|
const char *spaces = " \n\r\t";
|
||||||
|
str.erase(str.find_last_not_of(spaces) + 1);
|
||||||
|
str.erase(0, str.find_first_not_of(spaces));
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return (name,value) trimmed pair from given "name=value" string.
|
||||||
|
// return empty string on missing parts
|
||||||
|
// "key=val" => ("key", "val")
|
||||||
|
// " key = val " => ("key", "val")
|
||||||
|
// "key=" => ("key", "")
|
||||||
|
// "val" => ("", "val")
|
||||||
|
|
||||||
|
inline std::pair<std::string, std::string> extract_kv_(char sep, const std::string &str)
|
||||||
|
{
|
||||||
|
auto n = str.find(sep);
|
||||||
|
std::string k, v;
|
||||||
|
if (n == std::string::npos)
|
||||||
|
{
|
||||||
|
v = str;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = str.substr(0, n);
|
||||||
|
v = str.substr(n + 1);
|
||||||
|
}
|
||||||
|
return std::make_pair(trim_(k), trim_(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
// return vector of key/value pairs from sequence of "K1=V1,K2=V2,.."
|
||||||
|
// "a=AAA,b=BBB,c=CCC,.." => {("a","AAA"),("b","BBB"),("c", "CCC"),...}
|
||||||
|
inline std::unordered_map<std::string, std::string> extract_key_vals_(const std::string &str)
|
||||||
|
{
|
||||||
|
std::string token;
|
||||||
|
std::istringstream token_stream(str);
|
||||||
|
std::unordered_map<std::string, std::string> rv{};
|
||||||
|
while (std::getline(token_stream, token, ','))
|
||||||
|
{
|
||||||
|
if (token.empty())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto kv = extract_kv_('=', token);
|
||||||
|
rv[kv.first] = kv.second;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_levels extract_levels(const std::string &input)
|
||||||
|
{
|
||||||
|
auto key_vals = extract_key_vals_(input);
|
||||||
|
log_levels rv;
|
||||||
|
|
||||||
|
for (auto &name_level : key_vals)
|
||||||
|
{
|
||||||
|
auto &logger_name = name_level.first;
|
||||||
|
auto level_name = to_lower_(name_level.second);
|
||||||
|
auto level = level::from_str(level_name);
|
||||||
|
// fallback to "info" if unrecognized level name
|
||||||
|
if (level == level::off && level_name != "off")
|
||||||
|
{
|
||||||
|
level = level::info;
|
||||||
|
}
|
||||||
|
rv.set(logger_name, level);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace helpers
|
||||||
|
} // namespace cfg
|
||||||
|
} // namespace spdlog
|
28
src/spdlog/cfg/helpers.h
Normal file
28
src/spdlog/cfg/helpers.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/cfg/log_levels.h>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace cfg {
|
||||||
|
namespace helpers {
|
||||||
|
//
|
||||||
|
// Init levels from given string
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// set global level to debug: "debug"
|
||||||
|
// turn off all logging except for logger1: "off,logger1=debug"
|
||||||
|
// turn off all logging except for logger1 and logger2: "off,logger1=debug,logger2=info"
|
||||||
|
//
|
||||||
|
SPDLOG_API log_levels extract_levels(const std::string &txt);
|
||||||
|
} // namespace helpers
|
||||||
|
|
||||||
|
} // namespace cfg
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "helpers-inl.h"
|
||||||
|
#endif // SPDLOG_HEADER_ONLY
|
47
src/spdlog/cfg/log_levels.h
Normal file
47
src/spdlog/cfg/log_levels.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace cfg {
|
||||||
|
class log_levels
|
||||||
|
{
|
||||||
|
std::unordered_map<std::string, spdlog::level::level_enum> levels_;
|
||||||
|
spdlog::level::level_enum default_level_ = level::info;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void set(const std::string &logger_name, level::level_enum lvl)
|
||||||
|
{
|
||||||
|
if (logger_name.empty())
|
||||||
|
{
|
||||||
|
default_level_ = lvl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
levels_[logger_name] = lvl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_default(level::level_enum lvl)
|
||||||
|
{
|
||||||
|
default_level_ = lvl;
|
||||||
|
}
|
||||||
|
|
||||||
|
level::level_enum get(const std::string &logger_name)
|
||||||
|
{
|
||||||
|
auto it = levels_.find(logger_name);
|
||||||
|
return it != levels_.end() ? it->second : default_level_;
|
||||||
|
}
|
||||||
|
|
||||||
|
level::level_enum default_level()
|
||||||
|
{
|
||||||
|
return default_level_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace cfg
|
||||||
|
} // namespace spdlog
|
76
src/spdlog/common-inl.h
Normal file
76
src/spdlog/common-inl.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace level {
|
||||||
|
static string_view_t level_string_views[] SPDLOG_LEVEL_NAMES;
|
||||||
|
|
||||||
|
static const char *short_level_names[] SPDLOG_SHORT_LEVEL_NAMES;
|
||||||
|
|
||||||
|
SPDLOG_INLINE string_view_t &to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return level_string_views[l];
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return short_level_names[l];
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
int level = 0;
|
||||||
|
for (const auto &level_str : level_string_views)
|
||||||
|
{
|
||||||
|
if (level_str == name)
|
||||||
|
{
|
||||||
|
return static_cast<level::level_enum>(level);
|
||||||
|
}
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
// check also for "warn" and "err" before giving up..
|
||||||
|
if (name == "warn")
|
||||||
|
{
|
||||||
|
return level::warn;
|
||||||
|
}
|
||||||
|
if (name == "err")
|
||||||
|
{
|
||||||
|
return level::err;
|
||||||
|
}
|
||||||
|
return level::off;
|
||||||
|
}
|
||||||
|
} // namespace level
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog_ex::spdlog_ex(std::string msg)
|
||||||
|
: msg_(std::move(msg))
|
||||||
|
{}
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog_ex::spdlog_ex(const std::string &msg, int last_errno)
|
||||||
|
{
|
||||||
|
memory_buf_t outbuf;
|
||||||
|
fmt::format_system_error(outbuf, last_errno, msg);
|
||||||
|
msg_ = fmt::to_string(outbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE const char *spdlog_ex::what() const SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return msg_.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno)
|
||||||
|
{
|
||||||
|
SPDLOG_THROW(spdlog_ex(msg, last_errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void throw_spdlog_ex(std::string msg)
|
||||||
|
{
|
||||||
|
SPDLOG_THROW(spdlog_ex(std::move(msg)));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace spdlog
|
246
src/spdlog/common.h
Normal file
246
src/spdlog/common.h
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/tweakme.h>
|
||||||
|
#include <spdlog/details/null_mutex.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <initializer_list>
|
||||||
|
#include <memory>
|
||||||
|
#include <exception>
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#ifdef SPDLOG_COMPILED_LIB
|
||||||
|
#undef SPDLOG_HEADER_ONLY
|
||||||
|
#if defined(_WIN32) && defined(SPDLOG_SHARED_LIB)
|
||||||
|
#ifdef spdlog_EXPORTS
|
||||||
|
#define SPDLOG_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define SPDLOG_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
#else // !defined(_WIN32) || !defined(SPDLOG_SHARED_LIB)
|
||||||
|
#define SPDLOG_API
|
||||||
|
#endif
|
||||||
|
#define SPDLOG_INLINE
|
||||||
|
#else // !defined(SPDLOG_COMPILED_LIB)
|
||||||
|
#define SPDLOG_API
|
||||||
|
#define SPDLOG_HEADER_ONLY
|
||||||
|
#define SPDLOG_INLINE inline
|
||||||
|
#endif // #ifdef SPDLOG_COMPILED_LIB
|
||||||
|
|
||||||
|
#include <spdlog/fmt/fmt.h>
|
||||||
|
|
||||||
|
// visual studio upto 2013 does not support noexcept nor constexpr
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER < 1900)
|
||||||
|
#define SPDLOG_NOEXCEPT _NOEXCEPT
|
||||||
|
#define SPDLOG_CONSTEXPR
|
||||||
|
#else
|
||||||
|
#define SPDLOG_NOEXCEPT noexcept
|
||||||
|
#define SPDLOG_CONSTEXPR constexpr
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define SPDLOG_DEPRECATED __attribute__((deprecated))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define SPDLOG_DEPRECATED __declspec(deprecated)
|
||||||
|
#else
|
||||||
|
#define SPDLOG_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// disable thread local on msvc 2013
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
|
#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__cplusplus_winrt)
|
||||||
|
#define SPDLOG_NO_TLS 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPDLOG_FUNCTION
|
||||||
|
#define SPDLOG_FUNCTION static_cast<const char *>(__FUNCTION__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SPDLOG_NO_EXCEPTIONS
|
||||||
|
#define SPDLOG_TRY
|
||||||
|
#define SPDLOG_THROW(ex) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
printf("spdlog fatal error: %s\n", ex.what()); \
|
||||||
|
std::abort(); \
|
||||||
|
} while (0)
|
||||||
|
#define SPDLOG_CATCH_ALL()
|
||||||
|
#else
|
||||||
|
#define SPDLOG_TRY try
|
||||||
|
#define SPDLOG_THROW(ex) throw(ex)
|
||||||
|
#define SPDLOG_CATCH_ALL() catch (...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
|
||||||
|
class formatter;
|
||||||
|
|
||||||
|
namespace sinks {
|
||||||
|
class sink;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
|
||||||
|
using filename_t = std::wstring;
|
||||||
|
#define SPDLOG_FILENAME_T(s) L##s
|
||||||
|
#else
|
||||||
|
using filename_t = std::string;
|
||||||
|
#define SPDLOG_FILENAME_T(s) s
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using log_clock = std::chrono::system_clock;
|
||||||
|
using sink_ptr = std::shared_ptr<sinks::sink>;
|
||||||
|
using sinks_init_list = std::initializer_list<sink_ptr>;
|
||||||
|
using err_handler = std::function<void(const std::string &err_msg)>;
|
||||||
|
using string_view_t = fmt::basic_string_view<char>;
|
||||||
|
using wstring_view_t = fmt::basic_string_view<wchar_t>;
|
||||||
|
using memory_buf_t = fmt::basic_memory_buffer<char, 250>;
|
||||||
|
|
||||||
|
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
|
||||||
|
#ifndef _WIN32
|
||||||
|
#error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows
|
||||||
|
#else
|
||||||
|
template<typename T>
|
||||||
|
struct is_convertible_to_wstring_view : std::is_convertible<T, wstring_view_t>
|
||||||
|
{};
|
||||||
|
#endif // _WIN32
|
||||||
|
#else
|
||||||
|
template<typename>
|
||||||
|
struct is_convertible_to_wstring_view : std::false_type
|
||||||
|
{};
|
||||||
|
#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
|
||||||
|
|
||||||
|
#if defined(SPDLOG_NO_ATOMIC_LEVELS)
|
||||||
|
using level_t = details::null_atomic_int;
|
||||||
|
#else
|
||||||
|
using level_t = std::atomic<int>;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SPDLOG_LEVEL_TRACE 0
|
||||||
|
#define SPDLOG_LEVEL_DEBUG 1
|
||||||
|
#define SPDLOG_LEVEL_INFO 2
|
||||||
|
#define SPDLOG_LEVEL_WARN 3
|
||||||
|
#define SPDLOG_LEVEL_ERROR 4
|
||||||
|
#define SPDLOG_LEVEL_CRITICAL 5
|
||||||
|
#define SPDLOG_LEVEL_OFF 6
|
||||||
|
|
||||||
|
#if !defined(SPDLOG_ACTIVE_LEVEL)
|
||||||
|
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Log level enum
|
||||||
|
namespace level {
|
||||||
|
enum level_enum
|
||||||
|
{
|
||||||
|
trace = SPDLOG_LEVEL_TRACE,
|
||||||
|
debug = SPDLOG_LEVEL_DEBUG,
|
||||||
|
info = SPDLOG_LEVEL_INFO,
|
||||||
|
warn = SPDLOG_LEVEL_WARN,
|
||||||
|
err = SPDLOG_LEVEL_ERROR,
|
||||||
|
critical = SPDLOG_LEVEL_CRITICAL,
|
||||||
|
off = SPDLOG_LEVEL_OFF,
|
||||||
|
n_levels
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !defined(SPDLOG_LEVEL_NAMES)
|
||||||
|
#define SPDLOG_LEVEL_NAMES \
|
||||||
|
{ \
|
||||||
|
"trace", "debug", "info", "warning", "error", "critical", "off" \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(SPDLOG_SHORT_LEVEL_NAMES)
|
||||||
|
|
||||||
|
#define SPDLOG_SHORT_LEVEL_NAMES \
|
||||||
|
{ \
|
||||||
|
"T", "D", "I", "W", "E", "C", "O" \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SPDLOG_API string_view_t &to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT;
|
||||||
|
SPDLOG_API const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT;
|
||||||
|
SPDLOG_API spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
using level_hasher = std::hash<int>;
|
||||||
|
} // namespace level
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color mode used by sinks with color support.
|
||||||
|
//
|
||||||
|
enum class color_mode
|
||||||
|
{
|
||||||
|
always,
|
||||||
|
automatic,
|
||||||
|
never
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Pattern time - specific time getting to use for pattern_formatter.
|
||||||
|
// local time by default
|
||||||
|
//
|
||||||
|
enum class pattern_time_type
|
||||||
|
{
|
||||||
|
local, // log localtime
|
||||||
|
utc // log utc
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Log exception
|
||||||
|
//
|
||||||
|
class SPDLOG_API spdlog_ex : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit spdlog_ex(std::string msg);
|
||||||
|
spdlog_ex(const std::string &msg, int last_errno);
|
||||||
|
const char *what() const SPDLOG_NOEXCEPT override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string msg_;
|
||||||
|
};
|
||||||
|
|
||||||
|
SPDLOG_API void throw_spdlog_ex(const std::string &msg, int last_errno);
|
||||||
|
SPDLOG_API void throw_spdlog_ex(std::string msg);
|
||||||
|
|
||||||
|
struct source_loc
|
||||||
|
{
|
||||||
|
SPDLOG_CONSTEXPR source_loc() = default;
|
||||||
|
SPDLOG_CONSTEXPR source_loc(const char *filename_in, int line_in, const char *funcname_in)
|
||||||
|
: filename{filename_in}
|
||||||
|
, line{line_in}
|
||||||
|
, funcname{funcname_in}
|
||||||
|
{}
|
||||||
|
|
||||||
|
SPDLOG_CONSTEXPR bool empty() const SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return line == 0;
|
||||||
|
}
|
||||||
|
const char *filename{nullptr};
|
||||||
|
int line{0};
|
||||||
|
const char *funcname{nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
// make_unique support for pre c++14
|
||||||
|
|
||||||
|
#if __cplusplus >= 201402L // C++14 and beyond
|
||||||
|
using std::make_unique;
|
||||||
|
#else
|
||||||
|
template<typename T, typename... Args>
|
||||||
|
std::unique_ptr<T> make_unique(Args &&... args)
|
||||||
|
{
|
||||||
|
static_assert(!std::is_array<T>::value, "arrays not supported");
|
||||||
|
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "common-inl.h"
|
||||||
|
#endif
|
69
src/spdlog/details/backtracer-inl.h
Normal file
69
src/spdlog/details/backtracer-inl.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/backtracer.h>
|
||||||
|
#endif
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
SPDLOG_INLINE backtracer::backtracer(const backtracer &other)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(other.mutex_);
|
||||||
|
enabled_ = other.enabled();
|
||||||
|
messages_ = other.messages_;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE backtracer::backtracer(backtracer &&other) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(other.mutex_);
|
||||||
|
enabled_ = other.enabled();
|
||||||
|
messages_ = std::move(other.messages_);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE backtracer &backtracer::operator=(backtracer other)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
enabled_ = other.enabled();
|
||||||
|
messages_ = std::move(other.messages_);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void backtracer::enable(size_t size)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock{mutex_};
|
||||||
|
enabled_.store(true, std::memory_order_relaxed);
|
||||||
|
messages_ = circular_q<log_msg_buffer>{size};
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void backtracer::disable()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock{mutex_};
|
||||||
|
enabled_.store(false, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE bool backtracer::enabled() const
|
||||||
|
{
|
||||||
|
return enabled_.load(std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void backtracer::push_back(const log_msg &msg)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock{mutex_};
|
||||||
|
messages_.push_back(log_msg_buffer{msg});
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop all items in the q and apply the given fun on each of them.
|
||||||
|
SPDLOG_INLINE void backtracer::foreach_pop(std::function<void(const details::log_msg &)> fun)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock{mutex_};
|
||||||
|
while (!messages_.empty())
|
||||||
|
{
|
||||||
|
auto &front_msg = messages_.front();
|
||||||
|
fun(front_msg);
|
||||||
|
messages_.pop_front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
45
src/spdlog/details/backtracer.h
Normal file
45
src/spdlog/details/backtracer.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/details/log_msg_buffer.h>
|
||||||
|
#include <spdlog/details/circular_q.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <mutex>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
// Store log messages in circular buffer.
|
||||||
|
// Useful for storing debug data in case of error/warning happens.
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
class SPDLOG_API backtracer
|
||||||
|
{
|
||||||
|
mutable std::mutex mutex_;
|
||||||
|
std::atomic<bool> enabled_{false};
|
||||||
|
circular_q<log_msg_buffer> messages_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
backtracer() = default;
|
||||||
|
backtracer(const backtracer &other);
|
||||||
|
|
||||||
|
backtracer(backtracer &&other) SPDLOG_NOEXCEPT;
|
||||||
|
backtracer &operator=(backtracer other);
|
||||||
|
|
||||||
|
void enable(size_t size);
|
||||||
|
void disable();
|
||||||
|
bool enabled() const;
|
||||||
|
void push_back(const log_msg &msg);
|
||||||
|
|
||||||
|
// pop all items in the q and apply the given fun on each of them.
|
||||||
|
void foreach_pop(std::function<void(const details::log_msg &)> fun);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "backtracer-inl.h"
|
||||||
|
#endif
|
141
src/spdlog/details/circular_q.h
Normal file
141
src/spdlog/details/circular_q.h
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
// circular q view of std::vector.
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
template<typename T>
|
||||||
|
class circular_q
|
||||||
|
{
|
||||||
|
size_t max_items_ = 0;
|
||||||
|
typename std::vector<T>::size_type head_ = 0;
|
||||||
|
typename std::vector<T>::size_type tail_ = 0;
|
||||||
|
size_t overrun_counter_ = 0;
|
||||||
|
std::vector<T> v_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
// empty ctor - create a disabled queue with no elements allocated at all
|
||||||
|
circular_q() = default;
|
||||||
|
|
||||||
|
explicit circular_q(size_t max_items)
|
||||||
|
: max_items_(max_items + 1) // one item is reserved as marker for full q
|
||||||
|
, v_(max_items_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
circular_q(const circular_q &) = default;
|
||||||
|
circular_q &operator=(const circular_q &) = default;
|
||||||
|
|
||||||
|
// move cannot be default,
|
||||||
|
// since we need to reset head_, tail_, etc to zero in the moved object
|
||||||
|
circular_q(circular_q &&other) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
copy_moveable(std::move(other));
|
||||||
|
}
|
||||||
|
|
||||||
|
circular_q &operator=(circular_q &&other) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
copy_moveable(std::move(other));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// push back, overrun (oldest) item if no room left
|
||||||
|
void push_back(T &&item)
|
||||||
|
{
|
||||||
|
if (max_items_ > 0)
|
||||||
|
{
|
||||||
|
v_[tail_] = std::move(item);
|
||||||
|
tail_ = (tail_ + 1) % max_items_;
|
||||||
|
|
||||||
|
if (tail_ == head_) // overrun last item if full
|
||||||
|
{
|
||||||
|
head_ = (head_ + 1) % max_items_;
|
||||||
|
++overrun_counter_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return reference to the front item.
|
||||||
|
// If there are no elements in the container, the behavior is undefined.
|
||||||
|
const T &front() const
|
||||||
|
{
|
||||||
|
return v_[head_];
|
||||||
|
}
|
||||||
|
|
||||||
|
T &front()
|
||||||
|
{
|
||||||
|
return v_[head_];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return number of elements actually stored
|
||||||
|
size_t size() const
|
||||||
|
{
|
||||||
|
if (tail_ >= head_)
|
||||||
|
{
|
||||||
|
return tail_ - head_;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return max_items_ - (head_ - tail_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return const reference to item by index.
|
||||||
|
// If index is out of range 0…size()-1, the behavior is undefined.
|
||||||
|
const T &at(size_t i) const
|
||||||
|
{
|
||||||
|
assert(i < size());
|
||||||
|
return v_[(head_ + i) % max_items_];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop item from front.
|
||||||
|
// If there are no elements in the container, the behavior is undefined.
|
||||||
|
void pop_front()
|
||||||
|
{
|
||||||
|
head_ = (head_ + 1) % max_items_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return tail_ == head_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool full() const
|
||||||
|
{
|
||||||
|
// head is ahead of the tail by 1
|
||||||
|
if (max_items_ > 0)
|
||||||
|
{
|
||||||
|
return ((tail_ + 1) % max_items_) == head_;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t overrun_counter() const
|
||||||
|
{
|
||||||
|
return overrun_counter_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// copy from other&& and reset it to disabled state
|
||||||
|
void copy_moveable(circular_q &&other) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
max_items_ = other.max_items_;
|
||||||
|
head_ = other.head_;
|
||||||
|
tail_ = other.tail_;
|
||||||
|
overrun_counter_ = other.overrun_counter_;
|
||||||
|
v_ = std::move(other.v_);
|
||||||
|
|
||||||
|
// put &&other in disabled, but valid state
|
||||||
|
other.max_items_ = 0;
|
||||||
|
other.head_ = other.tail_ = 0;
|
||||||
|
other.overrun_counter_ = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
32
src/spdlog/details/console_globals.h
Normal file
32
src/spdlog/details/console_globals.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/details/null_mutex.h>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
struct console_mutex
|
||||||
|
{
|
||||||
|
using mutex_t = std::mutex;
|
||||||
|
static mutex_t &mutex()
|
||||||
|
{
|
||||||
|
static mutex_t s_mutex;
|
||||||
|
return s_mutex;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct console_nullmutex
|
||||||
|
{
|
||||||
|
using mutex_t = null_mutex;
|
||||||
|
static mutex_t &mutex()
|
||||||
|
{
|
||||||
|
static mutex_t s_mutex;
|
||||||
|
return s_mutex;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
132
src/spdlog/details/file_helper-inl.h
Normal file
132
src/spdlog/details/file_helper-inl.h
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/file_helper.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
|
||||||
|
#include <cerrno>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE file_helper::~file_helper()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void file_helper::open(const filename_t &fname, bool truncate)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
filename_ = fname;
|
||||||
|
auto *mode = truncate ? SPDLOG_FILENAME_T("wb") : SPDLOG_FILENAME_T("ab");
|
||||||
|
|
||||||
|
for (int tries = 0; tries < open_tries_; ++tries)
|
||||||
|
{
|
||||||
|
// create containing folder if not exists already.
|
||||||
|
os::create_dir(os::dir_name(fname));
|
||||||
|
if (!os::fopen_s(&fd_, fname, mode))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
details::os::sleep_for_millis(open_interval_);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw_spdlog_ex("Failed opening file " + os::filename_to_str(filename_) + " for writing", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void file_helper::reopen(bool truncate)
|
||||||
|
{
|
||||||
|
if (filename_.empty())
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("Failed re opening file - was not opened before");
|
||||||
|
}
|
||||||
|
this->open(filename_, truncate);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void file_helper::flush()
|
||||||
|
{
|
||||||
|
std::fflush(fd_);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void file_helper::close()
|
||||||
|
{
|
||||||
|
if (fd_ != nullptr)
|
||||||
|
{
|
||||||
|
std::fclose(fd_);
|
||||||
|
fd_ = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void file_helper::write(const memory_buf_t &buf)
|
||||||
|
{
|
||||||
|
size_t msg_size = buf.size();
|
||||||
|
auto data = buf.data();
|
||||||
|
if (std::fwrite(data, 1, msg_size, fd_) != msg_size)
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("Failed writing to file " + os::filename_to_str(filename_), errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE size_t file_helper::size() const
|
||||||
|
{
|
||||||
|
if (fd_ == nullptr)
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(filename_));
|
||||||
|
}
|
||||||
|
return os::filesize(fd_);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE const filename_t &file_helper::filename() const
|
||||||
|
{
|
||||||
|
return filename_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// return file path and its extension:
|
||||||
|
//
|
||||||
|
// "mylog.txt" => ("mylog", ".txt")
|
||||||
|
// "mylog" => ("mylog", "")
|
||||||
|
// "mylog." => ("mylog.", "")
|
||||||
|
// "/dir1/dir2/mylog.txt" => ("/dir1/dir2/mylog", ".txt")
|
||||||
|
//
|
||||||
|
// the starting dot in filenames is ignored (hidden files):
|
||||||
|
//
|
||||||
|
// ".mylog" => (".mylog". "")
|
||||||
|
// "my_folder/.mylog" => ("my_folder/.mylog", "")
|
||||||
|
// "my_folder/.mylog.txt" => ("my_folder/.mylog", ".txt")
|
||||||
|
SPDLOG_INLINE std::tuple<filename_t, filename_t> file_helper::split_by_extension(const filename_t &fname)
|
||||||
|
{
|
||||||
|
auto ext_index = fname.rfind('.');
|
||||||
|
|
||||||
|
// no valid extension found - return whole path and empty string as
|
||||||
|
// extension
|
||||||
|
if (ext_index == filename_t::npos || ext_index == 0 || ext_index == fname.size() - 1)
|
||||||
|
{
|
||||||
|
return std::make_tuple(fname, filename_t());
|
||||||
|
}
|
||||||
|
|
||||||
|
// treat cases like "/etc/rc.d/somelogfile or "/abc/.hiddenfile"
|
||||||
|
auto folder_index = fname.rfind(details::os::folder_sep);
|
||||||
|
if (folder_index != filename_t::npos && folder_index >= ext_index - 1)
|
||||||
|
{
|
||||||
|
return std::make_tuple(fname, filename_t());
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally - return a valid base and extension tuple
|
||||||
|
return std::make_tuple(fname.substr(0, ext_index), fname.substr(ext_index));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
59
src/spdlog/details/file_helper.h
Normal file
59
src/spdlog/details/file_helper.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
// Helper class for file sinks.
|
||||||
|
// When failing to open a file, retry several times(5) with a delay interval(10 ms).
|
||||||
|
// Throw spdlog_ex exception on errors.
|
||||||
|
|
||||||
|
class SPDLOG_API file_helper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit file_helper() = default;
|
||||||
|
|
||||||
|
file_helper(const file_helper &) = delete;
|
||||||
|
file_helper &operator=(const file_helper &) = delete;
|
||||||
|
~file_helper();
|
||||||
|
|
||||||
|
void open(const filename_t &fname, bool truncate = false);
|
||||||
|
void reopen(bool truncate);
|
||||||
|
void flush();
|
||||||
|
void close();
|
||||||
|
void write(const memory_buf_t &buf);
|
||||||
|
size_t size() const;
|
||||||
|
const filename_t &filename() const;
|
||||||
|
|
||||||
|
//
|
||||||
|
// return file path and its extension:
|
||||||
|
//
|
||||||
|
// "mylog.txt" => ("mylog", ".txt")
|
||||||
|
// "mylog" => ("mylog", "")
|
||||||
|
// "mylog." => ("mylog.", "")
|
||||||
|
// "/dir1/dir2/mylog.txt" => ("/dir1/dir2/mylog", ".txt")
|
||||||
|
//
|
||||||
|
// the starting dot in filenames is ignored (hidden files):
|
||||||
|
//
|
||||||
|
// ".mylog" => (".mylog". "")
|
||||||
|
// "my_folder/.mylog" => ("my_folder/.mylog", "")
|
||||||
|
// "my_folder/.mylog.txt" => ("my_folder/.mylog", ".txt")
|
||||||
|
static std::tuple<filename_t, filename_t> split_by_extension(const filename_t &fname);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const int open_tries_ = 5;
|
||||||
|
const int open_interval_ = 10;
|
||||||
|
std::FILE *fd_{nullptr};
|
||||||
|
filename_t filename_;
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "file_helper-inl.h"
|
||||||
|
#endif
|
116
src/spdlog/details/fmt_helper.h
Normal file
116
src/spdlog/details/fmt_helper.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <spdlog/fmt/fmt.h>
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
|
||||||
|
// Some fmt helpers to efficiently format and pad ints and strings
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
namespace fmt_helper {
|
||||||
|
|
||||||
|
inline spdlog::string_view_t to_string_view(const memory_buf_t &buf) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return spdlog::string_view_t{buf.data(), buf.size()};
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void append_string_view(spdlog::string_view_t view, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
auto *buf_ptr = view.data();
|
||||||
|
dest.append(buf_ptr, buf_ptr + view.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void append_int(T n, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
fmt::format_int i(n);
|
||||||
|
dest.append(i.data(), i.data() + i.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline unsigned int count_digits(T n)
|
||||||
|
{
|
||||||
|
using count_type = typename std::conditional<(sizeof(T) > sizeof(uint32_t)), uint64_t, uint32_t>::type;
|
||||||
|
return static_cast<unsigned int>(fmt::
|
||||||
|
// fmt 7.0.0 renamed the internal namespace to detail.
|
||||||
|
// See: https://github.com/fmtlib/fmt/issues/1538
|
||||||
|
#if FMT_VERSION < 70000
|
||||||
|
internal
|
||||||
|
#else
|
||||||
|
detail
|
||||||
|
#endif
|
||||||
|
::count_digits(static_cast<count_type>(n)));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void pad2(int n, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
if (n >= 0 && n < 100) // 0-99
|
||||||
|
{
|
||||||
|
dest.push_back(static_cast<char>('0' + n / 10));
|
||||||
|
dest.push_back(static_cast<char>('0' + n % 10));
|
||||||
|
}
|
||||||
|
else // unlikely, but just in case, let fmt deal with it
|
||||||
|
{
|
||||||
|
fmt::format_to(dest, "{:02}", n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void pad_uint(T n, unsigned int width, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
static_assert(std::is_unsigned<T>::value, "pad_uint must get unsigned T");
|
||||||
|
for (auto digits = count_digits(n); digits < width; digits++)
|
||||||
|
{
|
||||||
|
dest.push_back('0');
|
||||||
|
}
|
||||||
|
append_int(n, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void pad3(T n, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
static_assert(std::is_unsigned<T>::value, "pad3 must get unsigned T");
|
||||||
|
if (n < 1000)
|
||||||
|
{
|
||||||
|
dest.push_back(static_cast<char>(n / 100 + '0'));
|
||||||
|
n = n % 100;
|
||||||
|
dest.push_back(static_cast<char>((n / 10) + '0'));
|
||||||
|
dest.push_back(static_cast<char>((n % 10) + '0'));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
append_int(n, dest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void pad6(T n, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
pad_uint(n, 6, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void pad9(T n, memory_buf_t &dest)
|
||||||
|
{
|
||||||
|
pad_uint(n, 9, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return fraction of a second of the given time_point.
|
||||||
|
// e.g.
|
||||||
|
// fraction<std::milliseconds>(tp) -> will return the millis part of the second
|
||||||
|
template<typename ToDuration>
|
||||||
|
inline ToDuration time_fraction(log_clock::time_point tp)
|
||||||
|
{
|
||||||
|
using std::chrono::duration_cast;
|
||||||
|
using std::chrono::seconds;
|
||||||
|
auto duration = tp.time_since_epoch();
|
||||||
|
auto secs = duration_cast<seconds>(duration);
|
||||||
|
return duration_cast<ToDuration>(duration) - duration_cast<ToDuration>(secs);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace fmt_helper
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
37
src/spdlog/details/log_msg-inl.h
Normal file
37
src/spdlog/details/log_msg-inl.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/log_msg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg::log_msg(spdlog::log_clock::time_point log_time, spdlog::source_loc loc, string_view_t a_logger_name,
|
||||||
|
spdlog::level::level_enum lvl, spdlog::string_view_t msg)
|
||||||
|
: logger_name(a_logger_name)
|
||||||
|
, level(lvl)
|
||||||
|
, time(log_time)
|
||||||
|
#ifndef SPDLOG_NO_THREAD_ID
|
||||||
|
, thread_id(os::thread_id())
|
||||||
|
#endif
|
||||||
|
, source(loc)
|
||||||
|
, payload(msg)
|
||||||
|
{}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg::log_msg(
|
||||||
|
spdlog::source_loc loc, string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg)
|
||||||
|
: log_msg(os::now(), loc, a_logger_name, lvl, msg)
|
||||||
|
{}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg::log_msg(string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg)
|
||||||
|
: log_msg(os::now(), source_loc{}, a_logger_name, lvl, msg)
|
||||||
|
{}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
36
src/spdlog/details/log_msg.h
Normal file
36
src/spdlog/details/log_msg.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
struct SPDLOG_API log_msg
|
||||||
|
{
|
||||||
|
log_msg() = default;
|
||||||
|
log_msg(log_clock::time_point log_time, source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg);
|
||||||
|
log_msg(source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg);
|
||||||
|
log_msg(string_view_t logger_name, level::level_enum lvl, string_view_t msg);
|
||||||
|
log_msg(const log_msg &other) = default;
|
||||||
|
|
||||||
|
string_view_t logger_name;
|
||||||
|
level::level_enum level{level::off};
|
||||||
|
log_clock::time_point time;
|
||||||
|
size_t thread_id{0};
|
||||||
|
|
||||||
|
// wrapping the formatted text with color (updated by pattern_formatter).
|
||||||
|
mutable size_t color_range_start{0};
|
||||||
|
mutable size_t color_range_end{0};
|
||||||
|
|
||||||
|
source_loc source;
|
||||||
|
string_view_t payload;
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "log_msg-inl.h"
|
||||||
|
#endif
|
58
src/spdlog/details/log_msg_buffer-inl.h
Normal file
58
src/spdlog/details/log_msg_buffer-inl.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/log_msg_buffer.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg_buffer::log_msg_buffer(const log_msg &orig_msg)
|
||||||
|
: log_msg{orig_msg}
|
||||||
|
{
|
||||||
|
buffer.append(logger_name.begin(), logger_name.end());
|
||||||
|
buffer.append(payload.begin(), payload.end());
|
||||||
|
update_string_views();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg_buffer::log_msg_buffer(const log_msg_buffer &other)
|
||||||
|
: log_msg{other}
|
||||||
|
{
|
||||||
|
buffer.append(logger_name.begin(), logger_name.end());
|
||||||
|
buffer.append(payload.begin(), payload.end());
|
||||||
|
update_string_views();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg_buffer::log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT : log_msg{other}, buffer{std::move(other.buffer)}
|
||||||
|
{
|
||||||
|
update_string_views();
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg_buffer &log_msg_buffer::operator=(const log_msg_buffer &other)
|
||||||
|
{
|
||||||
|
log_msg::operator=(other);
|
||||||
|
buffer.clear();
|
||||||
|
buffer.append(other.buffer.data(), other.buffer.data() + other.buffer.size());
|
||||||
|
update_string_views();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE log_msg_buffer &log_msg_buffer::operator=(log_msg_buffer &&other) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
log_msg::operator=(other);
|
||||||
|
buffer = std::move(other.buffer);
|
||||||
|
update_string_views();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void log_msg_buffer::update_string_views()
|
||||||
|
{
|
||||||
|
logger_name = string_view_t{buffer.data(), logger_name.size()};
|
||||||
|
payload = string_view_t{buffer.data() + logger_name.size(), payload.size()};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
33
src/spdlog/details/log_msg_buffer.h
Normal file
33
src/spdlog/details/log_msg_buffer.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/details/log_msg.h>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
// Extend log_msg with internal buffer to store its payload.
|
||||||
|
// This is needed since log_msg holds string_views that points to stack data.
|
||||||
|
|
||||||
|
class SPDLOG_API log_msg_buffer : public log_msg
|
||||||
|
{
|
||||||
|
memory_buf_t buffer;
|
||||||
|
void update_string_views();
|
||||||
|
|
||||||
|
public:
|
||||||
|
log_msg_buffer() = default;
|
||||||
|
explicit log_msg_buffer(const log_msg &orig_msg);
|
||||||
|
log_msg_buffer(const log_msg_buffer &other);
|
||||||
|
log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT;
|
||||||
|
log_msg_buffer &operator=(const log_msg_buffer &other);
|
||||||
|
log_msg_buffer &operator=(log_msg_buffer &&other) SPDLOG_NOEXCEPT;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "log_msg_buffer-inl.h"
|
||||||
|
#endif
|
120
src/spdlog/details/mpmc_blocking_q.h
Normal file
120
src/spdlog/details/mpmc_blocking_q.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// multi producer-multi consumer blocking queue.
|
||||||
|
// enqueue(..) - will block until room found to put the new message.
|
||||||
|
// enqueue_nowait(..) - will return immediately with false if no room left in
|
||||||
|
// the queue.
|
||||||
|
// dequeue_for(..) - will block until the queue is not empty or timeout have
|
||||||
|
// passed.
|
||||||
|
|
||||||
|
#include <spdlog/details/circular_q.h>
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class mpmc_blocking_queue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using item_type = T;
|
||||||
|
explicit mpmc_blocking_queue(size_t max_items)
|
||||||
|
: q_(max_items)
|
||||||
|
{}
|
||||||
|
|
||||||
|
#ifndef __MINGW32__
|
||||||
|
// try to enqueue and block if no room left
|
||||||
|
void enqueue(T &&item)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
pop_cv_.wait(lock, [this] { return !this->q_.full(); });
|
||||||
|
q_.push_back(std::move(item));
|
||||||
|
}
|
||||||
|
push_cv_.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
// enqueue immediately. overrun oldest message in the queue if no room left.
|
||||||
|
void enqueue_nowait(T &&item)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
q_.push_back(std::move(item));
|
||||||
|
}
|
||||||
|
push_cv_.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to dequeue item. if no item found. wait upto timeout and try again
|
||||||
|
// Return true, if succeeded dequeue item, false otherwise
|
||||||
|
bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); }))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
popped_item = std::move(q_.front());
|
||||||
|
q_.pop_front();
|
||||||
|
}
|
||||||
|
pop_cv_.notify_one();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
// apparently mingw deadlocks if the mutex is released before cv.notify_one(),
|
||||||
|
// so release the mutex at the very end each function.
|
||||||
|
|
||||||
|
// try to enqueue and block if no room left
|
||||||
|
void enqueue(T &&item)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
pop_cv_.wait(lock, [this] { return !this->q_.full(); });
|
||||||
|
q_.push_back(std::move(item));
|
||||||
|
push_cv_.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
// enqueue immediately. overrun oldest message in the queue if no room left.
|
||||||
|
void enqueue_nowait(T &&item)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
q_.push_back(std::move(item));
|
||||||
|
push_cv_.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to dequeue item. if no item found. wait upto timeout and try again
|
||||||
|
// Return true, if succeeded dequeue item, false otherwise
|
||||||
|
bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); }))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
popped_item = std::move(q_.front());
|
||||||
|
q_.pop_front();
|
||||||
|
pop_cv_.notify_one();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t overrun_counter()
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(queue_mutex_);
|
||||||
|
return q_.overrun_counter();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::mutex queue_mutex_;
|
||||||
|
std::condition_variable push_cv_;
|
||||||
|
std::condition_variable pop_cv_;
|
||||||
|
spdlog::details::circular_q<T> q_;
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
49
src/spdlog/details/null_mutex.h
Normal file
49
src/spdlog/details/null_mutex.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <utility>
|
||||||
|
// null, no cost dummy "mutex" and dummy "atomic" int
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
struct null_mutex
|
||||||
|
{
|
||||||
|
void lock() const {}
|
||||||
|
void unlock() const {}
|
||||||
|
bool try_lock() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct null_atomic_int
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
null_atomic_int() = default;
|
||||||
|
|
||||||
|
explicit null_atomic_int(int new_value)
|
||||||
|
: value(new_value)
|
||||||
|
{}
|
||||||
|
|
||||||
|
int load(std::memory_order = std::memory_order_relaxed) const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void store(int new_value, std::memory_order = std::memory_order_relaxed)
|
||||||
|
{
|
||||||
|
value = new_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int exchange(int new_value, std::memory_order = std::memory_order_relaxed)
|
||||||
|
{
|
||||||
|
std::swap(new_value, value);
|
||||||
|
return new_value; // return value before the call
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
554
src/spdlog/details/os-inl.h
Normal file
554
src/spdlog/details/os-inl.h
Normal file
@ -0,0 +1,554 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <array>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <io.h> // _get_osfhandle and _isatty support
|
||||||
|
#include <process.h> // _get_pid support
|
||||||
|
#include <spdlog/details/windows_include.h>
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <share.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)
|
||||||
|
#include <limits>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <direct.h> // for _mkdir/_wmkdir
|
||||||
|
|
||||||
|
#else // unix
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <sys/syscall.h> //Use gettid() syscall under linux to get thread id
|
||||||
|
|
||||||
|
#elif defined(_AIX)
|
||||||
|
#include <pthread.h> // for pthread_getthreadid_np
|
||||||
|
|
||||||
|
#elif defined(__DragonFly__) || defined(__FreeBSD__)
|
||||||
|
#include <pthread_np.h> // for pthread_getthreadid_np
|
||||||
|
|
||||||
|
#elif defined(__NetBSD__)
|
||||||
|
#include <lwp.h> // for _lwp_self
|
||||||
|
|
||||||
|
#elif defined(__sun)
|
||||||
|
#include <thread.h> // for thr_self
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // unix
|
||||||
|
|
||||||
|
#ifndef __has_feature // Clang - feature checking macros.
|
||||||
|
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
namespace os {
|
||||||
|
|
||||||
|
SPDLOG_INLINE spdlog::log_clock::time_point now() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined __linux__ && defined SPDLOG_CLOCK_COARSE
|
||||||
|
timespec ts;
|
||||||
|
::clock_gettime(CLOCK_REALTIME_COARSE, &ts);
|
||||||
|
return std::chrono::time_point<log_clock, typename log_clock::duration>(
|
||||||
|
std::chrono::duration_cast<typename log_clock::duration>(std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec)));
|
||||||
|
|
||||||
|
#else
|
||||||
|
return log_clock::now();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SPDLOG_INLINE std::tm localtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::tm tm;
|
||||||
|
::localtime_s(&tm, &time_tt);
|
||||||
|
#else
|
||||||
|
std::tm tm;
|
||||||
|
::localtime_r(&time_tt, &tm);
|
||||||
|
#endif
|
||||||
|
return tm;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::tm localtime() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
std::time_t now_t = ::time(nullptr);
|
||||||
|
return localtime(now_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::tm gmtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::tm tm;
|
||||||
|
::gmtime_s(&tm, &time_tt);
|
||||||
|
#else
|
||||||
|
std::tm tm;
|
||||||
|
::gmtime_r(&time_tt, &tm);
|
||||||
|
#endif
|
||||||
|
return tm;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::tm gmtime() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
std::time_t now_t = ::time(nullptr);
|
||||||
|
return gmtime(now_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fopen_s on non windows for writing
|
||||||
|
SPDLOG_INLINE bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef SPDLOG_WCHAR_FILENAMES
|
||||||
|
*fp = ::_wfsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
|
||||||
|
#else
|
||||||
|
*fp = ::_fsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
|
||||||
|
#endif
|
||||||
|
#if defined(SPDLOG_PREVENT_CHILD_FD)
|
||||||
|
if (*fp != nullptr)
|
||||||
|
{
|
||||||
|
auto file_handle = reinterpret_cast<HANDLE>(_get_osfhandle(::_fileno(*fp)));
|
||||||
|
if (!::SetHandleInformation(file_handle, HANDLE_FLAG_INHERIT, 0))
|
||||||
|
{
|
||||||
|
::fclose(*fp);
|
||||||
|
*fp = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#else // unix
|
||||||
|
#if defined(SPDLOG_PREVENT_CHILD_FD)
|
||||||
|
const int mode_flag = mode == SPDLOG_FILENAME_T("ab") ? O_APPEND : O_TRUNC;
|
||||||
|
const int fd = ::open((filename.c_str()), O_CREAT | O_WRONLY | O_CLOEXEC | mode_flag, mode_t(0644));
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*fp = ::fdopen(fd, mode.c_str());
|
||||||
|
if (*fp == nullptr)
|
||||||
|
{
|
||||||
|
::close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
*fp = ::fopen((filename.c_str()), mode.c_str());
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return *fp == nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE int remove(const filename_t &filename) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
|
||||||
|
return ::_wremove(filename.c_str());
|
||||||
|
#else
|
||||||
|
return std::remove(filename.c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE int remove_if_exists(const filename_t &filename) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
return path_exists(filename) ? remove(filename) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE int rename(const filename_t &filename1, const filename_t &filename2) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
|
||||||
|
return ::_wrename(filename1.c_str(), filename2.c_str());
|
||||||
|
#else
|
||||||
|
return std::rename(filename1.c_str(), filename2.c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return true if path exists (file or directory)
|
||||||
|
SPDLOG_INLINE bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef SPDLOG_WCHAR_FILENAMES
|
||||||
|
auto attribs = ::GetFileAttributesW(filename.c_str());
|
||||||
|
#else
|
||||||
|
auto attribs = ::GetFileAttributesA(filename.c_str());
|
||||||
|
#endif
|
||||||
|
return attribs != INVALID_FILE_ATTRIBUTES;
|
||||||
|
#else // common linux/unix all have the stat system call
|
||||||
|
struct stat buffer;
|
||||||
|
return (::stat(filename.c_str(), &buffer) == 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return file size according to open FILE* object
|
||||||
|
SPDLOG_INLINE size_t filesize(FILE *f)
|
||||||
|
{
|
||||||
|
if (f == nullptr)
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("Failed getting file size. fd is null");
|
||||||
|
}
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
int fd = ::_fileno(f);
|
||||||
|
#if _WIN64 // 64 bits
|
||||||
|
__int64 ret = ::_filelengthi64(fd);
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
return static_cast<size_t>(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // windows 32 bits
|
||||||
|
long ret = ::_filelength(fd);
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
return static_cast<size_t>(ret);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else // unix
|
||||||
|
// OpenBSD doesn't compile with :: before the fileno(..)
|
||||||
|
#if defined(__OpenBSD__)
|
||||||
|
int fd = fileno(f);
|
||||||
|
#else
|
||||||
|
int fd = ::fileno(f);
|
||||||
|
#endif
|
||||||
|
// 64 bits(but not in osx or cygwin, where fstat64 is deprecated)
|
||||||
|
#if (defined(__linux__) || defined(__sun) || defined(_AIX)) && (defined(__LP64__) || defined(_LP64))
|
||||||
|
struct stat64 st;
|
||||||
|
if (::fstat64(fd, &st) == 0)
|
||||||
|
{
|
||||||
|
return static_cast<size_t>(st.st_size);
|
||||||
|
}
|
||||||
|
#else // other unix or linux 32 bits or cygwin
|
||||||
|
struct stat st;
|
||||||
|
if (::fstat(fd, &st) == 0)
|
||||||
|
{
|
||||||
|
return static_cast<size_t>(st.st_size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
throw_spdlog_ex("Failed getting file size from fd", errno);
|
||||||
|
return 0; // will not be reached.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return utc offset in minutes or throw spdlog_ex on failure
|
||||||
|
SPDLOG_INLINE int utc_minutes_offset(const std::tm &tm)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#if _WIN32_WINNT < _WIN32_WINNT_WS08
|
||||||
|
TIME_ZONE_INFORMATION tzinfo;
|
||||||
|
auto rv = ::GetTimeZoneInformation(&tzinfo);
|
||||||
|
#else
|
||||||
|
DYNAMIC_TIME_ZONE_INFORMATION tzinfo;
|
||||||
|
auto rv = ::GetDynamicTimeZoneInformation(&tzinfo);
|
||||||
|
#endif
|
||||||
|
if (rv == TIME_ZONE_ID_INVALID)
|
||||||
|
throw_spdlog_ex("Failed getting timezone info. ", errno);
|
||||||
|
|
||||||
|
int offset = -tzinfo.Bias;
|
||||||
|
if (tm.tm_isdst)
|
||||||
|
{
|
||||||
|
offset -= tzinfo.DaylightBias;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
offset -= tzinfo.StandardBias;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if defined(sun) || defined(__sun) || defined(_AIX) || (!defined(_BSD_SOURCE) && !defined(_GNU_SOURCE))
|
||||||
|
// 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris
|
||||||
|
struct helper
|
||||||
|
{
|
||||||
|
static long int calculate_gmt_offset(const std::tm &localtm = details::os::localtime(), const std::tm &gmtm = details::os::gmtime())
|
||||||
|
{
|
||||||
|
int local_year = localtm.tm_year + (1900 - 1);
|
||||||
|
int gmt_year = gmtm.tm_year + (1900 - 1);
|
||||||
|
|
||||||
|
long int days = (
|
||||||
|
// difference in day of year
|
||||||
|
localtm.tm_yday -
|
||||||
|
gmtm.tm_yday
|
||||||
|
|
||||||
|
// + intervening leap days
|
||||||
|
+ ((local_year >> 2) - (gmt_year >> 2)) - (local_year / 100 - gmt_year / 100) +
|
||||||
|
((local_year / 100 >> 2) - (gmt_year / 100 >> 2))
|
||||||
|
|
||||||
|
// + difference in years * 365 */
|
||||||
|
+ (long int)(local_year - gmt_year) * 365);
|
||||||
|
|
||||||
|
long int hours = (24 * days) + (localtm.tm_hour - gmtm.tm_hour);
|
||||||
|
long int mins = (60 * hours) + (localtm.tm_min - gmtm.tm_min);
|
||||||
|
long int secs = (60 * mins) + (localtm.tm_sec - gmtm.tm_sec);
|
||||||
|
|
||||||
|
return secs;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
auto offset_seconds = helper::calculate_gmt_offset(tm);
|
||||||
|
#else
|
||||||
|
auto offset_seconds = tm.tm_gmtoff;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return static_cast<int>(offset_seconds / 60);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return current thread id as size_t
|
||||||
|
// It exists because the std::this_thread::get_id() is much slower(especially
|
||||||
|
// under VS 2013)
|
||||||
|
SPDLOG_INLINE size_t _thread_id() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
return static_cast<size_t>(::GetCurrentThreadId());
|
||||||
|
#elif defined(__linux__)
|
||||||
|
#if defined(__ANDROID__) && defined(__ANDROID_API__) && (__ANDROID_API__ < 21)
|
||||||
|
#define SYS_gettid __NR_gettid
|
||||||
|
#endif
|
||||||
|
return static_cast<size_t>(::syscall(SYS_gettid));
|
||||||
|
#elif defined(_AIX) || defined(__DragonFly__) || defined(__FreeBSD__)
|
||||||
|
return static_cast<size_t>(::pthread_getthreadid_np());
|
||||||
|
#elif defined(__NetBSD__)
|
||||||
|
return static_cast<size_t>(::_lwp_self());
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
|
return static_cast<size_t>(::getthrid());
|
||||||
|
#elif defined(__sun)
|
||||||
|
return static_cast<size_t>(::thr_self());
|
||||||
|
#elif __APPLE__
|
||||||
|
uint64_t tid;
|
||||||
|
pthread_threadid_np(nullptr, &tid);
|
||||||
|
return static_cast<size_t>(tid);
|
||||||
|
#else // Default to standard C++11 (other Unix)
|
||||||
|
return static_cast<size_t>(std::hash<std::thread::id>()(std::this_thread::get_id()));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return current thread id as size_t (from thread local storage)
|
||||||
|
SPDLOG_INLINE size_t thread_id() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#if defined(SPDLOG_NO_TLS)
|
||||||
|
return _thread_id();
|
||||||
|
#else // cache thread id in tls
|
||||||
|
static thread_local const size_t tid = _thread_id();
|
||||||
|
return tid;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is avoid msvc issue in sleep_for that happens if the clock changes.
|
||||||
|
// See https://github.com/gabime/spdlog/issues/609
|
||||||
|
SPDLOG_INLINE void sleep_for_millis(int milliseconds) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
::Sleep(milliseconds);
|
||||||
|
#else
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined)
|
||||||
|
#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
|
||||||
|
SPDLOG_INLINE std::string filename_to_str(const filename_t &filename)
|
||||||
|
{
|
||||||
|
memory_buf_t buf;
|
||||||
|
wstr_to_utf8buf(filename, buf);
|
||||||
|
return fmt::to_string(buf);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
SPDLOG_INLINE std::string filename_to_str(const filename_t &filename)
|
||||||
|
{
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SPDLOG_INLINE int pid() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
return static_cast<int>(::GetCurrentProcessId());
|
||||||
|
#else
|
||||||
|
return static_cast<int>(::getpid());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine if the terminal supports colors
|
||||||
|
// Based on: https://github.com/agauniyal/rang/
|
||||||
|
SPDLOG_INLINE bool is_color_terminal() SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
static constexpr std::array<const char *, 14> terms = {
|
||||||
|
{"ansi", "color", "console", "cygwin", "gnome", "konsole", "kterm", "linux", "msys", "putty", "rxvt", "screen", "vt100", "xterm"}};
|
||||||
|
|
||||||
|
const char *env_p = std::getenv("TERM");
|
||||||
|
if (env_p == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const bool result =
|
||||||
|
std::any_of(terms.begin(), terms.end(), [&](const char *term) { return std::strstr(env_p, term) != nullptr; });
|
||||||
|
return result;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine if the terminal attached
|
||||||
|
// Source: https://github.com/agauniyal/rang/
|
||||||
|
SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
return ::_isatty(_fileno(file)) != 0;
|
||||||
|
#else
|
||||||
|
return ::isatty(fileno(file)) != 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32)
|
||||||
|
SPDLOG_INLINE void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target)
|
||||||
|
{
|
||||||
|
if (wstr.size() > static_cast<size_t>((std::numeric_limits<int>::max)()))
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("UTF-16 string is too big to be converted to UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
int wstr_size = static_cast<int>(wstr.size());
|
||||||
|
if (wstr_size == 0)
|
||||||
|
{
|
||||||
|
target.resize(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result_size = static_cast<int>(target.capacity());
|
||||||
|
if ((wstr_size + 1) * 2 > result_size)
|
||||||
|
{
|
||||||
|
result_size = ::WideCharToMultiByte(CP_UTF8, 0, wstr.data(), wstr_size, NULL, 0, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result_size > 0)
|
||||||
|
{
|
||||||
|
target.resize(result_size);
|
||||||
|
result_size = ::WideCharToMultiByte(CP_UTF8, 0, wstr.data(), wstr_size, target.data(), result_size, NULL, NULL);
|
||||||
|
|
||||||
|
if (result_size > 0)
|
||||||
|
{
|
||||||
|
target.resize(result_size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw_spdlog_ex(fmt::format("WideCharToMultiByte failed. Last error: {}", ::GetLastError()));
|
||||||
|
}
|
||||||
|
#endif // (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32)
|
||||||
|
|
||||||
|
// return true on success
|
||||||
|
static SPDLOG_INLINE bool mkdir_(const filename_t &path)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef SPDLOG_WCHAR_FILENAMES
|
||||||
|
return ::_wmkdir(path.c_str()) == 0;
|
||||||
|
#else
|
||||||
|
return ::_mkdir(path.c_str()) == 0;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return ::mkdir(path.c_str(), mode_t(0755)) == 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the given directory - and all directories leading to it
|
||||||
|
// return true on success or if the directory already exists
|
||||||
|
SPDLOG_INLINE bool create_dir(filename_t path)
|
||||||
|
{
|
||||||
|
if (path_exists(path))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// support forward slash in windows
|
||||||
|
std::replace(path.begin(), path.end(), '/', folder_sep);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t search_offset = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto token_pos = path.find(folder_sep, search_offset);
|
||||||
|
// treat the entire path as a folder if no folder separator not found
|
||||||
|
if (token_pos == filename_t::npos)
|
||||||
|
{
|
||||||
|
token_pos = path.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto subdir = path.substr(0, token_pos);
|
||||||
|
|
||||||
|
if (!subdir.empty() && !path_exists(subdir) && !mkdir_(subdir))
|
||||||
|
{
|
||||||
|
return false; // return error if failed creating dir
|
||||||
|
}
|
||||||
|
search_offset = token_pos + 1;
|
||||||
|
} while (search_offset < path.size());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return directory name from given path or empty string
|
||||||
|
// "abc/file" => "abc"
|
||||||
|
// "abc/" => "abc"
|
||||||
|
// "abc" => ""
|
||||||
|
// "abc///" => "abc//"
|
||||||
|
SPDLOG_INLINE filename_t dir_name(filename_t path)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
// support forward slash in windows
|
||||||
|
std::replace(path.begin(), path.end(), '/', folder_sep);
|
||||||
|
#endif
|
||||||
|
auto pos = path.find_last_of(folder_sep);
|
||||||
|
return pos != filename_t::npos ? path.substr(0, pos) : filename_t{};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SPDLOG_INLINE getenv(const char *field)
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#if defined(__cplusplus_winrt)
|
||||||
|
return std::string{}; // not supported under uwp
|
||||||
|
#else
|
||||||
|
size_t len = 0;
|
||||||
|
char buf[128];
|
||||||
|
bool ok = ::getenv_s(&len, buf, sizeof(buf), field) == 0;
|
||||||
|
return ok ? buf : std::string{};
|
||||||
|
#endif
|
||||||
|
#else // revert to getenv
|
||||||
|
char *buf = ::getenv(field);
|
||||||
|
return buf ? buf : std::string{};
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace os
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
111
src/spdlog/details/os.h
Normal file
111
src/spdlog/details/os.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <ctime> // std::time_t
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
namespace os {
|
||||||
|
|
||||||
|
SPDLOG_API spdlog::log_clock::time_point now() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API std::tm localtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API std::tm localtime() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API std::tm gmtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API std::tm gmtime() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// eol definition
|
||||||
|
#if !defined(SPDLOG_EOL)
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define SPDLOG_EOL "\r\n"
|
||||||
|
#else
|
||||||
|
#define SPDLOG_EOL "\n"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SPDLOG_CONSTEXPR static const char *default_eol = SPDLOG_EOL;
|
||||||
|
|
||||||
|
// folder separator
|
||||||
|
#ifdef _WIN32
|
||||||
|
static const char folder_sep = '\\';
|
||||||
|
#else
|
||||||
|
SPDLOG_CONSTEXPR static const char folder_sep = '/';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// fopen_s on non windows for writing
|
||||||
|
SPDLOG_API bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode);
|
||||||
|
|
||||||
|
// Remove filename. return 0 on success
|
||||||
|
SPDLOG_API int remove(const filename_t &filename) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Remove file if exists. return 0 on success
|
||||||
|
// Note: Non atomic (might return failure to delete if concurrently deleted by other process/thread)
|
||||||
|
SPDLOG_API int remove_if_exists(const filename_t &filename) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API int rename(const filename_t &filename1, const filename_t &filename2) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Return if file exists.
|
||||||
|
SPDLOG_API bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Return file size according to open FILE* object
|
||||||
|
SPDLOG_API size_t filesize(FILE *f);
|
||||||
|
|
||||||
|
// Return utc offset in minutes or throw spdlog_ex on failure
|
||||||
|
SPDLOG_API int utc_minutes_offset(const std::tm &tm = details::os::localtime());
|
||||||
|
|
||||||
|
// Return current thread id as size_t
|
||||||
|
// It exists because the std::this_thread::get_id() is much slower(especially
|
||||||
|
// under VS 2013)
|
||||||
|
SPDLOG_API size_t _thread_id() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Return current thread id as size_t (from thread local storage)
|
||||||
|
SPDLOG_API size_t thread_id() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// This is avoid msvc issue in sleep_for that happens if the clock changes.
|
||||||
|
// See https://github.com/gabime/spdlog/issues/609
|
||||||
|
SPDLOG_API void sleep_for_millis(int milliseconds) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
SPDLOG_API std::string filename_to_str(const filename_t &filename);
|
||||||
|
|
||||||
|
SPDLOG_API int pid() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Determine if the terminal supports colors
|
||||||
|
// Source: https://github.com/agauniyal/rang/
|
||||||
|
SPDLOG_API bool is_color_terminal() SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
// Determine if the terminal attached
|
||||||
|
// Source: https://github.com/agauniyal/rang/
|
||||||
|
SPDLOG_API bool in_terminal(FILE *file) SPDLOG_NOEXCEPT;
|
||||||
|
|
||||||
|
#if (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32)
|
||||||
|
SPDLOG_API void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Return directory name from given path or empty string
|
||||||
|
// "abc/file" => "abc"
|
||||||
|
// "abc/" => "abc"
|
||||||
|
// "abc" => ""
|
||||||
|
// "abc///" => "abc//"
|
||||||
|
SPDLOG_API filename_t dir_name(filename_t path);
|
||||||
|
|
||||||
|
// Create a dir from the given path.
|
||||||
|
// Return true if succeeded or if this dir already exists.
|
||||||
|
SPDLOG_API bool create_dir(filename_t path);
|
||||||
|
|
||||||
|
// non thread safe, cross platform getenv/getenv_s
|
||||||
|
// return empty string if field not found
|
||||||
|
SPDLOG_API std::string getenv(const char *field);
|
||||||
|
|
||||||
|
} // namespace os
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "os-inl.h"
|
||||||
|
#endif
|
49
src/spdlog/details/periodic_worker-inl.h
Normal file
49
src/spdlog/details/periodic_worker-inl.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/periodic_worker.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE periodic_worker::periodic_worker(const std::function<void()> &callback_fun, std::chrono::seconds interval)
|
||||||
|
{
|
||||||
|
active_ = (interval > std::chrono::seconds::zero());
|
||||||
|
if (!active_)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
worker_thread_ = std::thread([this, callback_fun, interval]() {
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(this->mutex_);
|
||||||
|
if (this->cv_.wait_for(lock, interval, [this] { return !this->active_; }))
|
||||||
|
{
|
||||||
|
return; // active_ == false, so exit this thread
|
||||||
|
}
|
||||||
|
callback_fun();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop the worker thread and join it
|
||||||
|
SPDLOG_INLINE periodic_worker::~periodic_worker()
|
||||||
|
{
|
||||||
|
if (worker_thread_.joinable())
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
active_ = false;
|
||||||
|
}
|
||||||
|
cv_.notify_one();
|
||||||
|
worker_thread_.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
40
src/spdlog/details/periodic_worker.h
Normal file
40
src/spdlog/details/periodic_worker.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// periodic worker thread - periodically executes the given callback function.
|
||||||
|
//
|
||||||
|
// RAII over the owned thread:
|
||||||
|
// creates the thread on construction.
|
||||||
|
// stops and joins the thread on destruction (if the thread is executing a callback, wait for it to finish first).
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <functional>
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
class SPDLOG_API periodic_worker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
periodic_worker(const std::function<void()> &callback_fun, std::chrono::seconds interval);
|
||||||
|
periodic_worker(const periodic_worker &) = delete;
|
||||||
|
periodic_worker &operator=(const periodic_worker &) = delete;
|
||||||
|
// stop the worker thread and join it
|
||||||
|
~periodic_worker();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool active_;
|
||||||
|
std::thread worker_thread_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
std::condition_variable cv_;
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "periodic_worker-inl.h"
|
||||||
|
#endif
|
299
src/spdlog/details/registry-inl.h
Normal file
299
src/spdlog/details/registry-inl.h
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/registry.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <spdlog/details/periodic_worker.h>
|
||||||
|
#include <spdlog/logger.h>
|
||||||
|
#include <spdlog/pattern_formatter.h>
|
||||||
|
|
||||||
|
#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
|
||||||
|
// support for the default stdout color logger
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <spdlog/sinks/wincolor_sink.h>
|
||||||
|
#else
|
||||||
|
#include <spdlog/sinks/ansicolor_sink.h>
|
||||||
|
#endif
|
||||||
|
#endif // SPDLOG_DISABLE_DEFAULT_LOGGER
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE registry::registry()
|
||||||
|
: formatter_(new pattern_formatter())
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
|
||||||
|
// create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows).
|
||||||
|
#ifdef _WIN32
|
||||||
|
auto color_sink = std::make_shared<sinks::wincolor_stdout_sink_mt>();
|
||||||
|
#else
|
||||||
|
auto color_sink = std::make_shared<sinks::ansicolor_stdout_sink_mt>();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char *default_logger_name = "";
|
||||||
|
default_logger_ = std::make_shared<spdlog::logger>(default_logger_name, std::move(color_sink));
|
||||||
|
loggers_[default_logger_name] = default_logger_;
|
||||||
|
|
||||||
|
#endif // SPDLOG_DISABLE_DEFAULT_LOGGER
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE registry::~registry() = default;
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::register_logger(std::shared_ptr<logger> new_logger)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
register_logger_(std::move(new_logger));
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::initialize_logger(std::shared_ptr<logger> new_logger)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
new_logger->set_formatter(formatter_->clone());
|
||||||
|
|
||||||
|
if (err_handler_)
|
||||||
|
{
|
||||||
|
new_logger->set_error_handler(err_handler_);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_logger->set_level(levels_.get(new_logger->name()));
|
||||||
|
new_logger->flush_on(flush_level_);
|
||||||
|
|
||||||
|
if (backtrace_n_messages_ > 0)
|
||||||
|
{
|
||||||
|
new_logger->enable_backtrace(backtrace_n_messages_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (automatic_registration_)
|
||||||
|
{
|
||||||
|
register_logger_(std::move(new_logger));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::shared_ptr<logger> registry::get(const std::string &logger_name)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
auto found = loggers_.find(logger_name);
|
||||||
|
return found == loggers_.end() ? nullptr : found->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::shared_ptr<logger> registry::default_logger()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
return default_logger_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return raw ptr to the default logger.
|
||||||
|
// To be used directly by the spdlog default api (e.g. spdlog::info)
|
||||||
|
// This make the default API faster, but cannot be used concurrently with set_default_logger().
|
||||||
|
// e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
|
||||||
|
SPDLOG_INLINE logger *registry::get_default_raw()
|
||||||
|
{
|
||||||
|
return default_logger_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// set default logger.
|
||||||
|
// default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map.
|
||||||
|
SPDLOG_INLINE void registry::set_default_logger(std::shared_ptr<logger> new_default_logger)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
// remove previous default logger from the map
|
||||||
|
if (default_logger_ != nullptr)
|
||||||
|
{
|
||||||
|
loggers_.erase(default_logger_->name());
|
||||||
|
}
|
||||||
|
if (new_default_logger != nullptr)
|
||||||
|
{
|
||||||
|
loggers_[new_default_logger->name()] = new_default_logger;
|
||||||
|
}
|
||||||
|
default_logger_ = std::move(new_default_logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::set_tp(std::shared_ptr<thread_pool> tp)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
|
||||||
|
tp_ = std::move(tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::shared_ptr<thread_pool> registry::get_tp()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
|
||||||
|
return tp_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set global formatter. Each sink in each logger will get a clone of this object
|
||||||
|
SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
formatter_ = std::move(formatter);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->set_formatter(formatter_->clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::enable_backtrace(size_t n_messages)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
backtrace_n_messages_ = n_messages;
|
||||||
|
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->enable_backtrace(n_messages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::disable_backtrace()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
backtrace_n_messages_ = 0;
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->disable_backtrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::set_level(level::level_enum log_level)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->set_level(log_level);
|
||||||
|
}
|
||||||
|
levels_.set_default(log_level);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::flush_on(level::level_enum log_level)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->flush_on(log_level);
|
||||||
|
}
|
||||||
|
flush_level_ = log_level;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::flush_every(std::chrono::seconds interval)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(flusher_mutex_);
|
||||||
|
auto clbk = [this]() { this->flush_all(); };
|
||||||
|
periodic_flusher_ = details::make_unique<periodic_worker>(clbk, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::set_error_handler(void (*handler)(const std::string &msg))
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->set_error_handler(handler);
|
||||||
|
}
|
||||||
|
err_handler_ = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::apply_all(const std::function<void(const std::shared_ptr<logger>)> &fun)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
fun(l.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::flush_all()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
l.second->flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::drop(const std::string &logger_name)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
loggers_.erase(logger_name);
|
||||||
|
if (default_logger_ && default_logger_->name() == logger_name)
|
||||||
|
{
|
||||||
|
default_logger_.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::drop_all()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
loggers_.clear();
|
||||||
|
default_logger_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean all resources and threads started by the registry
|
||||||
|
SPDLOG_INLINE void registry::shutdown()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(flusher_mutex_);
|
||||||
|
periodic_flusher_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_all();
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(tp_mutex_);
|
||||||
|
tp_.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE std::recursive_mutex ®istry::tp_mutex()
|
||||||
|
{
|
||||||
|
return tp_mutex_;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::set_automatic_registration(bool automatic_registration)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
automatic_registration_ = automatic_registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::update_levels(cfg::log_levels levels)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(logger_map_mutex_);
|
||||||
|
levels_ = std::move(levels);
|
||||||
|
for (auto &l : loggers_)
|
||||||
|
{
|
||||||
|
auto &logger = l.second;
|
||||||
|
logger->set_level(levels_.get(logger->name()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE registry ®istry::instance()
|
||||||
|
{
|
||||||
|
static registry s_instance;
|
||||||
|
return s_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::throw_if_exists_(const std::string &logger_name)
|
||||||
|
{
|
||||||
|
if (loggers_.find(logger_name) != loggers_.end())
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("logger with name '" + logger_name + "' already exists");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE void registry::register_logger_(std::shared_ptr<logger> new_logger)
|
||||||
|
{
|
||||||
|
auto logger_name = new_logger->name();
|
||||||
|
throw_if_exists_(logger_name);
|
||||||
|
loggers_[logger_name] = std::move(new_logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
112
src/spdlog/details/registry.h
Normal file
112
src/spdlog/details/registry.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Loggers registry of unique name->logger pointer
|
||||||
|
// An attempt to create a logger with an already existing name will result with spdlog_ex exception.
|
||||||
|
// If user requests a non existing logger, nullptr will be returned
|
||||||
|
// This class is thread safe
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <spdlog/cfg/log_levels.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
class logger;
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
class thread_pool;
|
||||||
|
class periodic_worker;
|
||||||
|
|
||||||
|
class SPDLOG_API registry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
registry(const registry &) = delete;
|
||||||
|
registry &operator=(const registry &) = delete;
|
||||||
|
|
||||||
|
void register_logger(std::shared_ptr<logger> new_logger);
|
||||||
|
void initialize_logger(std::shared_ptr<logger> new_logger);
|
||||||
|
std::shared_ptr<logger> get(const std::string &logger_name);
|
||||||
|
std::shared_ptr<logger> default_logger();
|
||||||
|
|
||||||
|
// Return raw ptr to the default logger.
|
||||||
|
// To be used directly by the spdlog default api (e.g. spdlog::info)
|
||||||
|
// This make the default API faster, but cannot be used concurrently with set_default_logger().
|
||||||
|
// e.g do not call set_default_logger() from one thread while calling spdlog::info() from another.
|
||||||
|
logger *get_default_raw();
|
||||||
|
|
||||||
|
// set default logger.
|
||||||
|
// default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map.
|
||||||
|
void set_default_logger(std::shared_ptr<logger> new_default_logger);
|
||||||
|
|
||||||
|
void set_tp(std::shared_ptr<thread_pool> tp);
|
||||||
|
|
||||||
|
std::shared_ptr<thread_pool> get_tp();
|
||||||
|
|
||||||
|
// Set global formatter. Each sink in each logger will get a clone of this object
|
||||||
|
void set_formatter(std::unique_ptr<formatter> formatter);
|
||||||
|
|
||||||
|
void enable_backtrace(size_t n_messages);
|
||||||
|
|
||||||
|
void disable_backtrace();
|
||||||
|
|
||||||
|
void set_level(level::level_enum log_level);
|
||||||
|
|
||||||
|
void flush_on(level::level_enum log_level);
|
||||||
|
|
||||||
|
void flush_every(std::chrono::seconds interval);
|
||||||
|
|
||||||
|
void set_error_handler(void (*handler)(const std::string &msg));
|
||||||
|
|
||||||
|
void apply_all(const std::function<void(const std::shared_ptr<logger>)> &fun);
|
||||||
|
|
||||||
|
void flush_all();
|
||||||
|
|
||||||
|
void drop(const std::string &logger_name);
|
||||||
|
|
||||||
|
void drop_all();
|
||||||
|
|
||||||
|
// clean all resources and threads started by the registry
|
||||||
|
void shutdown();
|
||||||
|
|
||||||
|
std::recursive_mutex &tp_mutex();
|
||||||
|
|
||||||
|
void set_automatic_registration(bool automatic_registration);
|
||||||
|
|
||||||
|
void update_levels(cfg::log_levels levels);
|
||||||
|
|
||||||
|
static registry &instance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
registry();
|
||||||
|
~registry();
|
||||||
|
|
||||||
|
void throw_if_exists_(const std::string &logger_name);
|
||||||
|
void register_logger_(std::shared_ptr<logger> new_logger);
|
||||||
|
std::mutex logger_map_mutex_, flusher_mutex_;
|
||||||
|
std::recursive_mutex tp_mutex_;
|
||||||
|
std::unordered_map<std::string, std::shared_ptr<logger>> loggers_;
|
||||||
|
cfg::log_levels levels_;
|
||||||
|
std::unique_ptr<formatter> formatter_;
|
||||||
|
level::level_enum flush_level_ = level::off;
|
||||||
|
void (*err_handler_)(const std::string &msg);
|
||||||
|
std::shared_ptr<thread_pool> tp_;
|
||||||
|
std::unique_ptr<periodic_worker> periodic_flusher_;
|
||||||
|
std::shared_ptr<logger> default_logger_;
|
||||||
|
bool automatic_registration_ = true;
|
||||||
|
size_t backtrace_n_messages_ = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "registry-inl.h"
|
||||||
|
#endif
|
24
src/spdlog/details/synchronous_factory.h
Normal file
24
src/spdlog/details/synchronous_factory.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "registry.h"
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
|
||||||
|
// Default logger factory- creates synchronous loggers
|
||||||
|
class logger;
|
||||||
|
|
||||||
|
struct synchronous_factory
|
||||||
|
{
|
||||||
|
template<typename Sink, typename... SinkArgs>
|
||||||
|
static std::shared_ptr<spdlog::logger> create(std::string logger_name, SinkArgs &&... args)
|
||||||
|
{
|
||||||
|
auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...);
|
||||||
|
auto new_logger = std::make_shared<spdlog::logger>(std::move(logger_name), std::move(sink));
|
||||||
|
details::registry::instance().initialize_logger(new_logger);
|
||||||
|
return new_logger;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace spdlog
|
175
src/spdlog/details/tcp_client-windows.h
Normal file
175
src/spdlog/details/tcp_client-windows.h
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
// tcp client helper
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#pragma comment(lib, "Ws2_32.lib")
|
||||||
|
#pragma comment(lib, "Mswsock.lib")
|
||||||
|
#pragma comment(lib, "AdvApi32.lib")
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
class tcp_client
|
||||||
|
{
|
||||||
|
SOCKET socket_ = INVALID_SOCKET;
|
||||||
|
|
||||||
|
static bool winsock_initialized_()
|
||||||
|
{
|
||||||
|
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
|
if (s == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
closesocket(s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void init_winsock_()
|
||||||
|
{
|
||||||
|
WSADATA wsaData;
|
||||||
|
auto rv = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||||
|
if (rv != 0)
|
||||||
|
{
|
||||||
|
throw_winsock_error_("WSAStartup failed", ::WSAGetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void throw_winsock_error_(const std::string &msg, int last_error)
|
||||||
|
{
|
||||||
|
char buf[512];
|
||||||
|
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, last_error,
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(char)), NULL);
|
||||||
|
|
||||||
|
throw_spdlog_ex(fmt::format("tcp_sink - {}: {}", msg, buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool is_connected() const
|
||||||
|
{
|
||||||
|
return socket_ != INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
::closesocket(socket_);
|
||||||
|
socket_ = INVALID_SOCKET;
|
||||||
|
WSACleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
SOCKET fd() const
|
||||||
|
{
|
||||||
|
return socket_;
|
||||||
|
}
|
||||||
|
|
||||||
|
~tcp_client()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to connect or throw on failure
|
||||||
|
void connect(const std::string &host, int port)
|
||||||
|
{
|
||||||
|
// initialize winsock if needed
|
||||||
|
if (!winsock_initialized_())
|
||||||
|
{
|
||||||
|
init_winsock_();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_connected())
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
struct addrinfo hints
|
||||||
|
{};
|
||||||
|
ZeroMemory(&hints, sizeof(hints));
|
||||||
|
|
||||||
|
hints.ai_family = AF_INET; // IPv4
|
||||||
|
hints.ai_socktype = SOCK_STREAM; // TCP
|
||||||
|
hints.ai_flags = AI_NUMERICSERV; // port passed as as numeric value
|
||||||
|
hints.ai_protocol = 0;
|
||||||
|
|
||||||
|
auto port_str = std::to_string(port);
|
||||||
|
struct addrinfo *addrinfo_result;
|
||||||
|
auto rv = ::getaddrinfo(host.c_str(), port_str.c_str(), &hints, &addrinfo_result);
|
||||||
|
int last_error = 0;
|
||||||
|
if (rv != 0)
|
||||||
|
{
|
||||||
|
last_error = ::WSAGetLastError();
|
||||||
|
WSACleanup();
|
||||||
|
throw_winsock_error_("getaddrinfo failed", last_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try each address until we successfully connect(2).
|
||||||
|
|
||||||
|
for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next)
|
||||||
|
{
|
||||||
|
socket_ = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
||||||
|
if (socket_ == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
last_error = ::WSAGetLastError();
|
||||||
|
WSACleanup();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (::connect(socket_, rp->ai_addr, (int)rp->ai_addrlen) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last_error = ::WSAGetLastError();
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::freeaddrinfo(addrinfo_result);
|
||||||
|
if (socket_ == INVALID_SOCKET)
|
||||||
|
{
|
||||||
|
WSACleanup();
|
||||||
|
throw_winsock_error_("connect failed", last_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set TCP_NODELAY
|
||||||
|
int enable_flag = 1;
|
||||||
|
::setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, (char *)&enable_flag, sizeof(enable_flag));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send exactly n_bytes of the given data.
|
||||||
|
// On error close the connection and throw.
|
||||||
|
void send(const char *data, size_t n_bytes)
|
||||||
|
{
|
||||||
|
size_t bytes_sent = 0;
|
||||||
|
while (bytes_sent < n_bytes)
|
||||||
|
{
|
||||||
|
const int send_flags = 0;
|
||||||
|
auto write_result = ::send(socket_, data + bytes_sent, (int)(n_bytes - bytes_sent), send_flags);
|
||||||
|
if (write_result == SOCKET_ERROR)
|
||||||
|
{
|
||||||
|
int last_error = ::WSAGetLastError();
|
||||||
|
close();
|
||||||
|
throw_winsock_error_("send failed", last_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_result == 0) // (probably should not happen but in any case..)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bytes_sent += static_cast<size_t>(write_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
145
src/spdlog/details/tcp_client.h
Normal file
145
src/spdlog/details/tcp_client.h
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#error include tcp_client-windows.h instead
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// tcp client helper
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
class tcp_client
|
||||||
|
{
|
||||||
|
int socket_ = -1;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool is_connected() const
|
||||||
|
{
|
||||||
|
return socket_ != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
if (is_connected())
|
||||||
|
{
|
||||||
|
::close(socket_);
|
||||||
|
socket_ = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd() const
|
||||||
|
{
|
||||||
|
return socket_;
|
||||||
|
}
|
||||||
|
|
||||||
|
~tcp_client()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to connect or throw on failure
|
||||||
|
void connect(const std::string &host, int port)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
struct addrinfo hints
|
||||||
|
{};
|
||||||
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
|
hints.ai_family = AF_INET; // IPv4
|
||||||
|
hints.ai_socktype = SOCK_STREAM; // TCP
|
||||||
|
hints.ai_flags = AI_NUMERICSERV; // port passed as as numeric value
|
||||||
|
hints.ai_protocol = 0;
|
||||||
|
|
||||||
|
auto port_str = std::to_string(port);
|
||||||
|
struct addrinfo *addrinfo_result;
|
||||||
|
auto rv = ::getaddrinfo(host.c_str(), port_str.c_str(), &hints, &addrinfo_result);
|
||||||
|
if (rv != 0)
|
||||||
|
{
|
||||||
|
auto msg = fmt::format("::getaddrinfo failed: {}", gai_strerror(rv));
|
||||||
|
throw_spdlog_ex(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try each address until we successfully connect(2).
|
||||||
|
int last_errno = 0;
|
||||||
|
for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next)
|
||||||
|
{
|
||||||
|
int const flags = SOCK_CLOEXEC;
|
||||||
|
socket_ = ::socket(rp->ai_family, rp->ai_socktype | flags, rp->ai_protocol);
|
||||||
|
if (socket_ == -1)
|
||||||
|
{
|
||||||
|
last_errno = errno;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rv = ::connect(socket_, rp->ai_addr, rp->ai_addrlen);
|
||||||
|
if (rv == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last_errno = errno;
|
||||||
|
::close(socket_);
|
||||||
|
socket_ = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::freeaddrinfo(addrinfo_result);
|
||||||
|
if (socket_ == -1)
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("::connect failed", last_errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set TCP_NODELAY
|
||||||
|
int enable_flag = 1;
|
||||||
|
::setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, (char *)&enable_flag, sizeof(enable_flag));
|
||||||
|
|
||||||
|
// prevent sigpipe on systems where MSG_NOSIGNAL is not available
|
||||||
|
#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
|
||||||
|
::setsockopt(socket_, SOL_SOCKET, SO_NOSIGPIPE, (char *)&enable_flag, sizeof(enable_flag));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
|
||||||
|
#error "tcp_sink would raise SIGPIPE since niether SO_NOSIGPIPE nor MSG_NOSIGNAL are available"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send exactly n_bytes of the given data.
|
||||||
|
// On error close the connection and throw.
|
||||||
|
void send(const char *data, size_t n_bytes)
|
||||||
|
{
|
||||||
|
size_t bytes_sent = 0;
|
||||||
|
while (bytes_sent < n_bytes)
|
||||||
|
{
|
||||||
|
#if defined(MSG_NOSIGNAL)
|
||||||
|
const int send_flags = MSG_NOSIGNAL;
|
||||||
|
#else
|
||||||
|
const int send_flags = 0;
|
||||||
|
#endif
|
||||||
|
auto write_result = ::send(socket_, data + bytes_sent, n_bytes - bytes_sent, send_flags);
|
||||||
|
if (write_result < 0)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
throw_spdlog_ex("write(2) failed", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_result == 0) // (probably should not happen but in any case..)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bytes_sent += static_cast<size_t>(write_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
124
src/spdlog/details/thread_pool-inl.h
Normal file
124
src/spdlog/details/thread_pool-inl.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef SPDLOG_HEADER_ONLY
|
||||||
|
#include <spdlog/details/thread_pool.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
SPDLOG_INLINE thread_pool::thread_pool(size_t q_max_items, size_t threads_n, std::function<void()> on_thread_start)
|
||||||
|
: q_(q_max_items)
|
||||||
|
{
|
||||||
|
if (threads_n == 0 || threads_n > 1000)
|
||||||
|
{
|
||||||
|
throw_spdlog_ex("spdlog::thread_pool(): invalid threads_n param (valid "
|
||||||
|
"range is 1-1000)");
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < threads_n; i++)
|
||||||
|
{
|
||||||
|
threads_.emplace_back([this, on_thread_start] {
|
||||||
|
on_thread_start();
|
||||||
|
this->thread_pool::worker_loop_();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SPDLOG_INLINE thread_pool::thread_pool(size_t q_max_items, size_t threads_n)
|
||||||
|
: thread_pool(q_max_items, threads_n, [] {})
|
||||||
|
{}
|
||||||
|
|
||||||
|
// message all threads to terminate gracefully join them
|
||||||
|
SPDLOG_INLINE thread_pool::~thread_pool()
|
||||||
|
{
|
||||||
|
SPDLOG_TRY
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < threads_.size(); i++)
|
||||||
|
{
|
||||||
|
post_async_msg_(async_msg(async_msg_type::terminate), async_overflow_policy::block);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &t : threads_)
|
||||||
|
{
|
||||||
|
t.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SPDLOG_CATCH_ALL() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPDLOG_INLINE thread_pool::post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy)
|
||||||
|
{
|
||||||
|
async_msg async_m(std::move(worker_ptr), async_msg_type::log, msg);
|
||||||
|
post_async_msg_(std::move(async_m), overflow_policy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPDLOG_INLINE thread_pool::post_flush(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy)
|
||||||
|
{
|
||||||
|
post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t SPDLOG_INLINE thread_pool::overrun_counter()
|
||||||
|
{
|
||||||
|
return q_.overrun_counter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPDLOG_INLINE thread_pool::post_async_msg_(async_msg &&new_msg, async_overflow_policy overflow_policy)
|
||||||
|
{
|
||||||
|
if (overflow_policy == async_overflow_policy::block)
|
||||||
|
{
|
||||||
|
q_.enqueue(std::move(new_msg));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
q_.enqueue_nowait(std::move(new_msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPDLOG_INLINE thread_pool::worker_loop_()
|
||||||
|
{
|
||||||
|
while (process_next_msg_()) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// process next message in the queue
|
||||||
|
// return true if this thread should still be active (while no terminate msg
|
||||||
|
// was received)
|
||||||
|
bool SPDLOG_INLINE thread_pool::process_next_msg_()
|
||||||
|
{
|
||||||
|
async_msg incoming_async_msg;
|
||||||
|
bool dequeued = q_.dequeue_for(incoming_async_msg, std::chrono::seconds(10));
|
||||||
|
if (!dequeued)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (incoming_async_msg.msg_type)
|
||||||
|
{
|
||||||
|
case async_msg_type::log: {
|
||||||
|
incoming_async_msg.worker_ptr->backend_sink_it_(incoming_async_msg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case async_msg_type::flush: {
|
||||||
|
incoming_async_msg.worker_ptr->backend_flush_();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case async_msg_type::terminate: {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
120
src/spdlog/details/thread_pool.h
Normal file
120
src/spdlog/details/thread_pool.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
|
||||||
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/details/log_msg_buffer.h>
|
||||||
|
#include <spdlog/details/mpmc_blocking_q.h>
|
||||||
|
#include <spdlog/details/os.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <memory>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace spdlog {
|
||||||
|
class async_logger;
|
||||||
|
|
||||||
|
namespace details {
|
||||||
|
|
||||||
|
using async_logger_ptr = std::shared_ptr<spdlog::async_logger>;
|
||||||
|
|
||||||
|
enum class async_msg_type
|
||||||
|
{
|
||||||
|
log,
|
||||||
|
flush,
|
||||||
|
terminate
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <spdlog/details/log_msg_buffer.h>
|
||||||
|
// Async msg to move to/from the queue
|
||||||
|
// Movable only. should never be copied
|
||||||
|
struct async_msg : log_msg_buffer
|
||||||
|
{
|
||||||
|
async_msg_type msg_type{async_msg_type::log};
|
||||||
|
async_logger_ptr worker_ptr;
|
||||||
|
|
||||||
|
async_msg() = default;
|
||||||
|
~async_msg() = default;
|
||||||
|
|
||||||
|
// should only be moved in or out of the queue..
|
||||||
|
async_msg(const async_msg &) = delete;
|
||||||
|
|
||||||
|
// support for vs2013 move
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER <= 1800
|
||||||
|
async_msg(async_msg &&other)
|
||||||
|
: log_msg_buffer(std::move(other))
|
||||||
|
, msg_type(other.msg_type)
|
||||||
|
, worker_ptr(std::move(other.worker_ptr))
|
||||||
|
{}
|
||||||
|
|
||||||
|
async_msg &operator=(async_msg &&other)
|
||||||
|
{
|
||||||
|
*static_cast<log_msg_buffer *>(this) = std::move(other);
|
||||||
|
msg_type = other.msg_type;
|
||||||
|
worker_ptr = std::move(other.worker_ptr);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#else // (_MSC_VER) && _MSC_VER <= 1800
|
||||||
|
async_msg(async_msg &&) = default;
|
||||||
|
async_msg &operator=(async_msg &&) = default;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// construct from log_msg with given type
|
||||||
|
async_msg(async_logger_ptr &&worker, async_msg_type the_type, const details::log_msg &m)
|
||||||
|
: log_msg_buffer{m}
|
||||||
|
, msg_type{the_type}
|
||||||
|
, worker_ptr{std::move(worker)}
|
||||||
|
{}
|
||||||
|
|
||||||
|
async_msg(async_logger_ptr &&worker, async_msg_type the_type)
|
||||||
|
: log_msg_buffer{}
|
||||||
|
, msg_type{the_type}
|
||||||
|
, worker_ptr{std::move(worker)}
|
||||||
|
{}
|
||||||
|
|
||||||
|
explicit async_msg(async_msg_type the_type)
|
||||||
|
: async_msg{nullptr, the_type}
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SPDLOG_API thread_pool
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using item_type = async_msg;
|
||||||
|
using q_type = details::mpmc_blocking_queue<item_type>;
|
||||||
|
|
||||||
|
thread_pool(size_t q_max_items, size_t threads_n, std::function<void()> on_thread_start);
|
||||||
|
thread_pool(size_t q_max_items, size_t threads_n);
|
||||||
|
|
||||||
|
// message all threads to terminate gracefully join them
|
||||||
|
~thread_pool();
|
||||||
|
|
||||||
|
thread_pool(const thread_pool &) = delete;
|
||||||
|
thread_pool &operator=(thread_pool &&) = delete;
|
||||||
|
|
||||||
|
void post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy);
|
||||||
|
void post_flush(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy);
|
||||||
|
size_t overrun_counter();
|
||||||
|
|
||||||
|
private:
|
||||||
|
q_type q_;
|
||||||
|
|
||||||
|
std::vector<std::thread> threads_;
|
||||||
|
|
||||||
|
void post_async_msg_(async_msg &&new_msg, async_overflow_policy overflow_policy);
|
||||||
|
void worker_loop_();
|
||||||
|
|
||||||
|
// process next message in the queue
|
||||||
|
// return true if this thread should still be active (while no terminate msg
|
||||||
|
// was received)
|
||||||
|
bool process_next_msg_();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace details
|
||||||
|
} // namespace spdlog
|
||||||
|
|
||||||
|
#ifdef SPDLOG_HEADER_ONLY
|
||||||
|
#include "thread_pool-inl.h"
|
||||||
|
#endif
|
11
src/spdlog/details/windows_include.h
Normal file
11
src/spdlog/details/windows_include.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef NOMINMAX
|
||||||
|
#define NOMINMAX // prevent windows redefining min/max
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <windows.h>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user