Import initial code
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
This commit is contained in:
parent
f42cc040b9
commit
9cc2cf2460
|
@ -0,0 +1,36 @@
|
|||
# test binaries
|
||||
/teststandardpaths
|
||||
/teststandardpaths*.exe
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "cutf"]
|
||||
path = cutf
|
||||
url = https://github.com/tapika/cutf.git
|
|
@ -0,0 +1,48 @@
|
|||
CC ?= gcc
|
||||
CXX ?= g++
|
||||
TARGET_MACHINE := $(shell $(CC) -dumpmachine)
|
||||
ifneq ($(LINUX),true)
|
||||
ifneq ($(MACOS),true)
|
||||
ifneq ($(WINDOWS),true)
|
||||
|
||||
ifneq (,$(findstring linux,$(TARGET_MACHINE)))
|
||||
LINUX=true
|
||||
endif
|
||||
ifneq (,$(findstring apple,$(TARGET_MACHINE)))
|
||||
MACOS=true
|
||||
endif
|
||||
ifneq (,$(findstring mingw,$(TARGET_MACHINE)))
|
||||
WINDOWS=true
|
||||
endif
|
||||
ifneq (,$(findstring windows,$(TARGET_MACHINE)))
|
||||
WINDOWS=true
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
CFLAGS += -std=c++17 -I.
|
||||
|
||||
ifeq ($(WINDOWS),true)
|
||||
APP_EXT ?= .exe
|
||||
CFLAGS += -I./cutf
|
||||
endif
|
||||
|
||||
PROG = teststandardpaths
|
||||
SOURCES = \
|
||||
standardpaths.cpp \
|
||||
teststandardpaths.cpp
|
||||
|
||||
ifeq ($(WINDOWS),true)
|
||||
SOURCES += cutf/cutf.cpp
|
||||
endif
|
||||
|
||||
all: $(PROG)$(APP_EXT)
|
||||
|
||||
$(PROG)$(APP_EXT): $(SOURCES)
|
||||
$(CXX) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
-rm -f $(PROG)$(APP_EXT) *.o
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Preparation
|
||||
_FLAGS="-DPTW32_STATIC_LIB -Werror"
|
||||
_ARCH=i686-w64-mingw32
|
||||
_PREFIX="/usr/${_ARCH}"
|
||||
|
||||
source win.env
|
||||
|
||||
# Build now
|
||||
make "$@"
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Preparation
|
||||
_FLAGS="-DPTW32_STATIC_LIB -Werror"
|
||||
_ARCH=x86_64-w64-mingw32
|
||||
_PREFIX="/usr/${_ARCH}"
|
||||
|
||||
source win.env
|
||||
|
||||
# Build now
|
||||
make APP_EXT="-64.exe" "$@"
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ca60c39e1815ae6bc7f7c9fa880dc5d9b8ed0edc
|
|
@ -0,0 +1,113 @@
|
|||
/* Re-implemented in C++ after GLib's gutils.c */
|
||||
|
||||
#include "standardpaths.hpp"
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
#ifdef _WIN32
|
||||
fs::path getWindowsDirectory(void) {
|
||||
wchar_t wcp[MAX_PATH];
|
||||
fs::path windowsDir("");
|
||||
|
||||
if (GetWindowsDirectoryW(wcp, MAX_PATH)) {
|
||||
// Usually X:\Windows, but in terminal server environments
|
||||
// might be an UNC path, AFAIK.
|
||||
windowsDir = widetoutf8(wcp);
|
||||
}
|
||||
|
||||
if (windowsDir.empty())
|
||||
windowsDir = "C:\\";
|
||||
|
||||
return windowsDir;
|
||||
}
|
||||
|
||||
|
||||
fs::path getWindowsKnownFolder(REFKNOWNFOLDERID folder_guid) {
|
||||
wchar_t *wcp = NULL;
|
||||
fs::path specialFolder("");
|
||||
HRESULT hr;
|
||||
|
||||
hr = SHGetKnownFolderPath(folder_guid, 0, NULL, &wcp);
|
||||
|
||||
if (SUCCEEDED (hr)) {
|
||||
specialFolder = widetoutf8(wcp); // XXX: convert to UTF-8
|
||||
}
|
||||
|
||||
CoTaskMemFree(wcp);
|
||||
|
||||
return specialFolder;
|
||||
}
|
||||
#endif
|
||||
|
||||
fs::path getHomeDir() {
|
||||
const char *path_p;
|
||||
fs::path homeDir("");
|
||||
|
||||
/* We first check HOME and use it if it is set */
|
||||
if (path_p = std::getenv("HOME")) {
|
||||
homeDir = path_p;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/* Only believe HOME if it is an absolute path and exists.
|
||||
*
|
||||
* We only do this check on Windows fnot on UNIX because
|
||||
* of things like autofs. If the user has a bogus value in
|
||||
* $HOME they're repsonsible
|
||||
*/
|
||||
if (!homeDir.empty() && !(homeDir.is_absolute() && fs::is_directory(homeDir))) {
|
||||
homeDir.clear();
|
||||
}
|
||||
|
||||
if (homeDir.empty()) {
|
||||
/* USERPROFILE is probably the closest equivalent to $HOME? */
|
||||
if (path_p = std::getenv("USERPROFILE"))
|
||||
homeDir = path_p;
|
||||
}
|
||||
|
||||
if (homeDir.empty()) {
|
||||
homeDir = getWindowsKnownFolder(FOLDERID_Profile);
|
||||
}
|
||||
|
||||
if (homeDir.empty()) {
|
||||
homeDir = getWindowsDirectory();
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifndef _WIN32
|
||||
if (homeDir.empty()) {
|
||||
/* If we didn't get it from any of those methods, we will have
|
||||
* to read the user database entry.
|
||||
*/
|
||||
homeDir = getpwuid(getuid())->pw_dir;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If we have been denied access to /etc/passwd (for example, by an
|
||||
* overly-zealous LSM), make up a junk value. */
|
||||
if (homeDir.empty()) {
|
||||
homeDir = "/";
|
||||
}
|
||||
|
||||
return homeDir;
|
||||
}
|
||||
|
||||
|
||||
fs::path getUserConfigDir() {
|
||||
const char *path_p;
|
||||
fs::path configDir("");
|
||||
|
||||
if (path_p = std::getenv("XDG_CONFIG_HOME"))
|
||||
configDir = path_p;
|
||||
|
||||
#ifdef _WIN32
|
||||
else
|
||||
configDir = getWindowsKnownFolder(FOLDERID_LocalAppData);
|
||||
#endif
|
||||
if (configDir.empty()) {
|
||||
configDir = getHomeDir() / ".config", NULL;
|
||||
}
|
||||
|
||||
return configDir;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
#pragma once
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <knownfolders.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
#include "cutf.h"
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
#include <cstdlib>
|
||||
#include <filesystem>
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
std::filesystem::path getWindowsDirectory(void);
|
||||
std::filesystem::path getWindowsKnownFolder(REFKNOWNFOLDERID folder_guid);
|
||||
#endif
|
||||
std::filesystem::path getHomeDir();
|
||||
std::filesystem::path getUserConfigDir();
|
|
@ -0,0 +1,13 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "standardpaths.hpp"
|
||||
|
||||
int main() {
|
||||
std::cout << "Home dir = " << getHomeDir() << std::endl;
|
||||
#ifdef _WIN32
|
||||
std::cout << "Windows dir = " << getWindowsDirectory() << std::endl;
|
||||
std::cout << "Profile dir = " << getWindowsKnownFolder(FOLDERID_Profile) << std::endl;
|
||||
#endif
|
||||
std::cout << "User config dir = " << getUserConfigDir() << std::endl;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
export AR=${_ARCH}-ar
|
||||
export CC=${_ARCH}-gcc
|
||||
export CFLAGS="${_FLAGS}"
|
||||
export CROSS_COMPILING=true
|
||||
export CXX=${_ARCH}-g++
|
||||
export CXXFLAGS="${_FLAGS}"
|
||||
export LDFLAGS="-static -luuid -lole32"
|
||||
export PATH=${_PREFIX}/bin:$PATH
|
||||
export PKG_CONFIG_PATH=${_PREFIX}/lib/pkgconfig
|
||||
export WIN32=true
|
Loading…
Reference in New Issue