forked from Alepha/Alepha
Make a portable hook for getting program name.
This commit is contained in:
@ -10,6 +10,8 @@ static_assert( __cplusplus > 2020'99 );
|
||||
#include <Alepha/StaticValue.h>
|
||||
#include <Alepha/error.h>
|
||||
|
||||
#include <Alepha/System/programName.h>
|
||||
|
||||
namespace Alepha::Hydrogen ::detail:: ProgramOptions_m
|
||||
{
|
||||
namespace
|
||||
@ -205,9 +207,7 @@ namespace Alepha::Hydrogen ::detail:: ProgramOptions_m
|
||||
|
||||
VariableMap substitutions=
|
||||
{
|
||||
// This uses a GNU extension, but it's fine. We can always make this
|
||||
// portable, later.
|
||||
{ "program-name"s, lambaste<=::program_invocation_short_name },
|
||||
{ "program-name"s, lambaste<=System::programName() },
|
||||
{ "option-name"s, lambaste<=name },
|
||||
{ "default"s, [&defaultBuilder= defaultBuilder, &name= name]
|
||||
{
|
||||
@ -283,8 +283,7 @@ namespace Alepha::Hydrogen ::detail:: ProgramOptions_m
|
||||
{
|
||||
VariableMap substitutions
|
||||
{
|
||||
// Another use of the GNUism.
|
||||
{ "program-name"s, lambaste<=::program_invocation_short_name },
|
||||
{ "program-name"s, lambaste<=System::programName() },
|
||||
};
|
||||
|
||||
if( canonicalName.has_value() ) substitutions[ "canonical-name"s ]= lambaste<=canonicalName.value();
|
||||
|
46
System/programName.h
Normal file
46
System/programName.h
Normal file
@ -0,0 +1,46 @@
|
||||
static_assert( __cplusplus > 2020'99 );
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Alepha/Alepha.h>
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
# include <sys/types.h>
|
||||
# include <sys/sysctl.h>
|
||||
#elif defined( _GNU_SOURCE )
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace Alepha::Hydrogen::System ::detail:: programName_m
|
||||
{
|
||||
inline namespace exports
|
||||
{
|
||||
inline std::string
|
||||
programName()
|
||||
{
|
||||
#if defined( __FreeBSD__ )
|
||||
int mib[]
|
||||
{
|
||||
CTL_KERN,
|
||||
KERN_PROC,
|
||||
KERN_PROC_PATHNAME,
|
||||
-1,
|
||||
};
|
||||
char buf[ 4096 ];
|
||||
std::size_t cb = sizeof( buf );
|
||||
::sysctl( mib, 4, buf, &cb, nullptr, 0);
|
||||
return buf;
|
||||
#elif defined( _GNU_SOURCE )
|
||||
return ::program_invocation_short_name;
|
||||
#else
|
||||
#error "Not supported."
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace Alepha::Hydrogen::System::inline exports::inline programName_m
|
||||
{
|
||||
using namespace detail::programName_m::exports;
|
||||
}
|
Reference in New Issue
Block a user