Fix gc/wii build

This commit is contained in:
Phillip Stephens 2015-10-16 01:07:54 -07:00
parent 340588db62
commit 1c0c44938e
9 changed files with 523 additions and 256 deletions

View File

@ -25,11 +25,12 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
if(WIN32)
list(APPEND CORE_EXTRA src/win32_largefilewrapper.c)
elseif(APPLE)
list(APPEND CORE_EXTRA src/osx_largefilewrapper.c)
elseif(GEKKO)
list(APPEND CORE_EXTRA src/gekko_support.c)
list(APPEND CORE_EXTRA src/win32_largefilewrapper.c include/win32_largefilewrapper.h)
elseif(APPLE OR GEKKO)
list(APPEND CORE_EXTRA src/osx_largefilewrapper.c include/osx_largefilewrapper.h)
if(GEKKO)
list(APPEND CORE_EXTRA src/gekko_support.c include/gekko_support.h)
endif()
endif()
add_library(AthenaCore
@ -68,7 +69,6 @@ add_library(AthenaCore
include/LZ77/LZType11.hpp
include/Athena/FileInfo.hpp
include/Athena/Dir.hpp
include/gekko_support.h
include/Athena/DNA.hpp
include/Athena/DNAYaml.hpp
include/yaml.h
@ -117,7 +117,7 @@ add_library(AthenaWiiSave EXCLUDE_FROM_ALL
include/md5.h
include/sha1.h
)
if(NOT MSVC)
if(NOT MSVC AND NOT GEKKO)
set_source_files_properties(src/aes.cpp PROPERTIES COMPILE_FLAGS -maes)
endif()
@ -227,7 +227,9 @@ install(EXPORT AthenaTargets DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT Athena)
# atdna import #
################
if(NOT GEKKO)
add_subdirectory(atdna)
endif()
#########
# CPack #

View File

@ -7,6 +7,10 @@
* Any changes to the types or namespacing must be reflected in 'atdna/main.cpp'
*/
#ifdef GEKKO
#include <stdlib.h>
#include <limits.h>
#endif
#include <string.h>
#include <yaml.h>
#include <utf8proc.h>

View File

@ -4,6 +4,9 @@
#ifdef GEKKO
#include <stdarg.h>
#include <stddef.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
@ -12,7 +15,14 @@ char *
realpath(const char *path, char *resolved);
int
vsnprintf (char *s, size_t n, const char *format, va_list ap);
int
snprintf(char *str, size_t n, const char *fmt, ...);
long long
strtoq(const char *nptr, char **endptr, int base);
unsigned long long
strtouq(const char *nptr, char **endptr, int base);
float
strtof(const char *string, char **endPtr );
#ifdef __cplusplus
}
#endif

View File

@ -1,7 +1,7 @@
#ifndef OSX_LARGEFILEWRAPPER_H
#define OSX_LARGEFILEWRAPPER_H
#if defined(__APPLE__)
#if defined(__APPLE__) || defined(GEKKO)
#include <stdio.h>
#ifdef __cplusplus
extern "C" {

View File

@ -4,6 +4,9 @@
#include "win32_largefilewrapper.h"
#elif __APPLE__
#include "osx_largefilewrapper.h"
#elif GEKKO
#include "gekko_support.h"
#include "osx_largefilewrapper.h"
#endif
namespace Athena

View File

@ -4,6 +4,9 @@
#include "win32_largefilewrapper.h"
#elif __APPLE__
#include "osx_largefilewrapper.h"
#elif GEKKO
#include "gekko_support.h"
#include "osx_largefilewrapper.h"
#endif
namespace Athena

View File

@ -3,7 +3,7 @@
#include <string.h>
#if _WIN32
#include <intrin.h>
#else
#elif !GEKKO
#include <cpuid.h>
#endif

View File

@ -21,9 +21,7 @@
* components. Returns (resolved) on success, or (NULL) on failure,
* in which case the path which caused trouble is left in (resolved).
*/
char *
realpath(const char *path, char *resolved)
{
char *realpath(const char *path, char *resolved) {
struct stat sb;
char *p, *q, *s;
size_t left_len, resolved_len;
@ -40,8 +38,7 @@ realpath(const char *path, char *resolved)
if (resolved == NULL) {
resolved = malloc(PATH_MAX);
if (resolved == NULL)
return (NULL);
if (resolved == NULL) return (NULL);
mem_allocated = 1;
} else
mem_allocated = 0;
@ -50,8 +47,7 @@ realpath(const char *path, char *resolved)
if (path[0] == '/') {
resolved[0] = '/';
resolved[1] = '\0';
if (path[1] == '\0')
return (resolved);
if (path[1] == '\0') return (resolved);
resolved_len = 1;
left_len = strlcpy(left, path + 1, sizeof(left));
} else {
@ -87,8 +83,7 @@ realpath(const char *path, char *resolved)
memcpy(next_token, left, s - left);
next_token[s - left] = '\0';
left_len -= s - left;
if (p != NULL)
memmove(left, s + 1, left_len + 1);
if (p != NULL) memmove(left, s + 1, left_len + 1);
if (resolved[resolved_len - 1] != '/') {
if (resolved_len + 1 >= PATH_MAX) {
errno = ENAMETOOLONG;
@ -138,8 +133,7 @@ realpath(const char *path, char *resolved)
goto err;
}
slen = readlink(resolved, symlink, sizeof(symlink) - 1);
if (slen < 0)
goto err;
if (slen < 0) goto err;
symlink[slen] = '\0';
if (symlink[0] == '/') {
resolved[1] = 0;
@ -185,14 +179,11 @@ realpath(const char *path, char *resolved)
return (resolved);
err:
if (mem_allocated)
free(resolved);
if (mem_allocated) free(resolved);
return (NULL);
}
static int
int_vasprintf (result, format, args)
char **result;
static int int_vasprintf(result, format, args) char **result;
const char *format;
va_list *args;
{
@ -204,36 +195,26 @@ int_vasprintf (result, format, args)
memcpy((void *)&ap, (void *)args, sizeof(va_list));
while (*p != '\0')
{
if (*p++ == '%')
{
while (strchr ("-+ #0", *p))
++p;
if (*p == '*')
{
while (*p != '\0') {
if (*p++ == '%') {
while (strchr("-+ #0", *p)) ++p;
if (*p == '*') {
++p;
total_width += abs(va_arg(ap, int));
}
else
} else
total_width += strtoul(p, (char **)&p, 10);
if (*p == '.')
{
if (*p == '.') {
++p;
if (*p == '*')
{
if (*p == '*') {
++p;
total_width += abs(va_arg(ap, int));
}
else
} else
total_width += strtoul(p, (char **)&p, 10);
}
while (strchr ("hlL", *p))
++p;
while (strchr("hlL", *p)) ++p;
/* Should be big enough for any format specifier except %s and floats. */
total_width += 30;
switch (*p)
{
switch (*p) {
case 'd':
case 'i':
case 'o':
@ -273,40 +254,30 @@ int_vasprintf (result, format, args)
return 0;
}
int
vasprintf (result, format, args)
char **result;
int vasprintf(result, format, args) char **result;
const char *format;
#if defined(_BSD_VA_LIST_) && defined(__FreeBSD__)
_BSD_VA_LIST_ args;
#else
va_list args;
#endif
{
return int_vasprintf (result, format, &args);
}
{ return int_vasprintf(result, format, &args); }
int
vsnprintf (char *s, size_t n, const char *format, va_list ap)
{
int vsnprintf(char *s, size_t n, const char *format, va_list ap) {
char *buf = 0;
int result = vasprintf(&buf, format, ap);
if (!buf)
return -1;
if (result < 0)
{
if (!buf) return -1;
if (result < 0) {
free(buf);
return -1;
}
result = strlen(buf);
if (n > 0)
{
if (n > 0) {
if ((long)n > result)
memcpy(s, buf, result + 1);
else
{
else {
memcpy(s, buf, n - 1);
s[n - 1] = 0;
}
@ -315,3 +286,238 @@ vsnprintf (char *s, size_t n, const char *format, va_list ap)
return result;
}
#endif
#include <sys/types.h>
#include <stdio.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/*
* PUBLIC: #ifndef HAVE_SNPRINTF
* PUBLIC: int snprintf __P((char *, size_t, const char *, ...));
* PUBLIC: #endif
*/
int
snprintf(char *str, size_t n, const char *fmt, ...)
{
va_list ap;
int rval;
va_start(ap, fmt);
rval = vsprintf(str, fmt, ap);
va_end(ap);
return (rval);
}
/*
* Convert a string to a quad integer.
*/
long long strtoq(const char *nptr, char **endptr, int base) {
return strtoll(nptr, endptr, base);
}
/*
* Convert a string to an unsigned quad integer.
*/
unsigned long long strtouq(const char *nptr, char **endptr, int base) {
return strtoull(nptr, endptr, base);
}
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
const float _strtof_powersOf10_[] =
{ // Table giving binary powers of 10. Entry
10.0f, // is 10^2^i. Used to convert decimal
100.0f, // exponents into floating-point numbers.
1.0e4f, 1.0e8f, 1.0e16f, 1.0e32f};
/*
*----------------------------------------------------------------------
*
* strtof --
*
* This procedure converts a floating-point number from an ASCII
* decimal representation to internal double-precision format.
*
* Results:
* The return value is the double-precision floating-point
* representation of the characters in string. If endPtr isn't
* NULL, then *endPtr is filled in with the address of the
* next character after the last one that was part of the
* floating-point number.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
float strtof(const char *string, char **endPtr) {
int sign, expSign = FALSE;
float fraction, dblExp;
const float *d;
const char *p;
int c;
int exp = 0;
int fracExp = 0;
int mantSize;
int decPt;
const char *pExp;
p = string;
while (isspace(*p)) {
p += 1;
}
if (*p == '-') {
sign = TRUE;
p += 1;
} else {
if (*p == '+') {
p += 1;
}
sign = FALSE;
}
decPt = -1;
for (mantSize = 0;; mantSize += 1) {
c = *p;
if (!isdigit(c)) {
if ((c != '.') || (decPt >= 0)) {
break;
}
decPt = mantSize;
}
p += 1;
}
/*
* Now suck up the digits in the mantissa. Use two integers to
* collect 9 digits each (this is faster than using floating-point).
* If the mantissa has more than 18 digits, ignore the extras, since
* they can't affect tahe value anyway.
*/
pExp = p;
p -= mantSize;
if (decPt < 0) {
decPt = mantSize;
} else {
mantSize -= 1; /* One of the digits was the point. */
}
if (mantSize > 18) {
fracExp = decPt - 18;
mantSize = 18;
} else {
fracExp = decPt - mantSize;
}
if (mantSize == 0) {
fraction = 0.0;
p = string;
goto done;
} else {
int frac1, frac2;
frac1 = 0;
for (; mantSize > 9; mantSize -= 1) {
c = *p;
p += 1;
if (c == '.') {
c = *p;
p += 1;
}
frac1 = 10 * frac1 + (c - '0');
}
frac2 = 0;
for (; mantSize > 0; mantSize -= 1) {
c = *p;
p += 1;
if (c == '.') {
c = *p;
p += 1;
}
frac2 = 10 * frac2 + (c - '0');
}
fraction = (1.0e9f * frac1) + frac2;
}
/*
* Skim off the exponent.
*/
p = pExp;
if ((*p == 'E') || (*p == 'e')) {
p += 1;
if (*p == '-') {
expSign = TRUE;
p += 1;
} else {
if (*p == '+') {
p += 1;
}
expSign = FALSE;
}
while (isdigit(*p)) {
exp = exp * 10 + (*p - '0');
p += 1;
}
}
if (expSign) {
exp = fracExp - exp;
} else {
exp = fracExp + exp;
}
/*
* Generate a floating-point number that represents the exponent.
* Do this by processing the exponent one bit at a time to combine
* many powers of 2 of 10. Then combine the exponent with the
* fraction.
*/
if (exp < 0) {
expSign = TRUE;
exp = -exp;
} else {
expSign = FALSE;
}
const int maxExponent = 38; /* Largest possible base 10 exponent. Any
* exponent larger than this will already
* produce underflow or overflow, so there's
* no need to worry about additional digits.
*/
if (exp > maxExponent) {
exp = maxExponent;
}
dblExp = 1.0f;
for (d = _strtof_powersOf10_; exp != 0; exp >>= 1, d += 1) {
if (exp & 01) {
dblExp *= *d;
}
}
if (expSign) {
fraction /= dblExp;
} else {
fraction *= dblExp;
}
done:
if (endPtr != NULL) {
*endPtr = (char *)p;
}
if (sign) {
return -fraction;
}
return fraction;
}

39
toolchain-powerpc.cmake Normal file
View File

@ -0,0 +1,39 @@
set(CMAKE_SYSTEM_NAME "Generic")
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR powerpc-eabi)
set(DEVKITPRO $ENV{DEVKITPRO})
set(DEVKITPPC $ENV{DEVKITPPC})
set(GEKKO true)
if(NOT DEVKITPPC)
message(FATAL_ERROR "Please set DEVKITPPC in your environment")
endif()
if(NOT DEVKITPRO)
message(FATAL_ERROR "Please set DEVKITPRO in your environment")
endif()
if(NOT LIBOGCDIR)
message(STATUS "LIBOGCDIR not set, using default")
set(LIBOGCDIR ${DEVKITPRO}/libogc)
endif()
if(WIN32)
set(CMAKE_C_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-gcc.exe)
set(CMAKE_CXX_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-g++.exe)
else()
set(CMAKE_C_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-gcc)
set(CMAKE_CXX_COMPILER ${DEVKITPPC}/bin/powerpc-eabi-g++)
endif()
set(MACHDEP "-DGEKKO -mrvl -mcpu=750 -meabi -mhard-float")
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${MACHDEP}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MACHDEP}")
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
set(CMAKE_FIND_ROOT_PATH ${DEVKITPPC})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)