Detect the host system and architecture at configure time, makes conditional compiling easier. Start the platform defines cleanup, there's still much left. Autodetect the number of cores for every platform (BSD is untested), the port mantainers should drop their own implementations.

This commit is contained in:
thelemonman 2013-11-02 19:24:26 +00:00
parent 981dac038f
commit 4de7a417a9
24 changed files with 313 additions and 63 deletions

View File

@ -1,9 +1,9 @@
#! /bin/sh
# Wrapper for compilers which do not understand `-c -o'.
# Wrapper for compilers which do not understand '-c -o'.
scriptversion=2005-05-14.22
scriptversion=2012-10-14.11; # UTC
# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# This program is free software; you can redistribute it and/or modify
@ -17,8 +17,7 @@ scriptversion=2005-05-14.22
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@ -29,21 +28,224 @@ scriptversion=2005-05-14.22
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
nl='
'
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent tools from complaining about whitespace usage.
IFS=" "" $nl"
file_conv=
# func_file_conv build_file lazy
# Convert a $build file to $host form and store it in $file
# Currently only supports Windows hosts. If the determined conversion
# type is listed in (the comma separated) LAZY, no conversion will
# take place.
func_file_conv ()
{
file=$1
case $file in
/ | /[!/]*) # absolute file, and not a UNC file
if test -z "$file_conv"; then
# lazily determine how to convert abs files
case `uname -s` in
MINGW*)
file_conv=mingw
;;
CYGWIN*)
file_conv=cygwin
;;
*)
file_conv=wine
;;
esac
fi
case $file_conv/,$2, in
*,$file_conv,*)
;;
mingw/*)
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
;;
cygwin/*)
file=`cygpath -m "$file" || echo "$file"`
;;
wine/*)
file=`winepath -w "$file" || echo "$file"`
;;
esac
;;
esac
}
# func_cl_dashL linkdir
# Make cl look for libraries in LINKDIR
func_cl_dashL ()
{
func_file_conv "$1"
if test -z "$lib_path"; then
lib_path=$file
else
lib_path="$lib_path;$file"
fi
linker_opts="$linker_opts -LIBPATH:$file"
}
# func_cl_dashl library
# Do a library search-path lookup for cl
func_cl_dashl ()
{
lib=$1
found=no
save_IFS=$IFS
IFS=';'
for dir in $lib_path $LIB
do
IFS=$save_IFS
if $shared && test -f "$dir/$lib.dll.lib"; then
found=yes
lib=$dir/$lib.dll.lib
break
fi
if test -f "$dir/$lib.lib"; then
found=yes
lib=$dir/$lib.lib
break
fi
if test -f "$dir/lib$lib.a"; then
found=yes
lib=$dir/lib$lib.a
break
fi
done
IFS=$save_IFS
if test "$found" != yes; then
lib=$lib.lib
fi
}
# func_cl_wrapper cl arg...
# Adjust compile command to suit cl
func_cl_wrapper ()
{
# Assume a capable shell
lib_path=
shared=:
linker_opts=
for arg
do
if test -n "$eat"; then
eat=
else
case $1 in
-o)
# configure might choose to run compile as 'compile cc -o foo foo.c'.
eat=1
case $2 in
*.o | *.[oO][bB][jJ])
func_file_conv "$2"
set x "$@" -Fo"$file"
shift
;;
*)
func_file_conv "$2"
set x "$@" -Fe"$file"
shift
;;
esac
;;
-I)
eat=1
func_file_conv "$2" mingw
set x "$@" -I"$file"
shift
;;
-I*)
func_file_conv "${1#-I}" mingw
set x "$@" -I"$file"
shift
;;
-l)
eat=1
func_cl_dashl "$2"
set x "$@" "$lib"
shift
;;
-l*)
func_cl_dashl "${1#-l}"
set x "$@" "$lib"
shift
;;
-L)
eat=1
func_cl_dashL "$2"
;;
-L*)
func_cl_dashL "${1#-L}"
;;
-static)
shared=false
;;
-Wl,*)
arg=${1#-Wl,}
save_ifs="$IFS"; IFS=','
for flag in $arg; do
IFS="$save_ifs"
linker_opts="$linker_opts $flag"
done
IFS="$save_ifs"
;;
-Xlinker)
eat=1
linker_opts="$linker_opts $2"
;;
-*)
set x "$@" "$1"
shift
;;
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
func_file_conv "$1"
set x "$@" -Tp"$file"
shift
;;
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
func_file_conv "$1" mingw
set x "$@" "$file"
shift
;;
*)
set x "$@" "$1"
shift
;;
esac
fi
shift
done
if test -n "$linker_opts"; then
linker_opts="-link$linker_opts"
fi
exec "$@" $linker_opts
exit 1
}
eat=
case $1 in
'')
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
echo "$0: No command. Try '$0 --help' for more information." 1>&2
exit 1;
;;
-h | --h*)
cat <<\EOF
Usage: compile [--help] [--version] PROGRAM [ARGS]
Wrapper for compilers which do not understand `-c -o'.
Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
Wrapper for compilers which do not understand '-c -o'.
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
arguments, and rename the output as expected.
If you are trying to build a whole package this is not the
right script to run: please start by reading the file `INSTALL'.
right script to run: please start by reading the file 'INSTALL'.
Report bugs to <bug-automake@gnu.org>.
EOF
@ -53,11 +255,13 @@ EOF
echo "compile $scriptversion"
exit $?
;;
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
func_cl_wrapper "$@" # Doesn't return...
;;
esac
ofile=
cfile=
eat=
for arg
do
@ -66,8 +270,8 @@ do
else
case $1 in
-o)
# configure might choose to run compile as `compile cc -o foo foo.c'.
# So we strip `-o arg' only if arg is an object.
# configure might choose to run compile as 'compile cc -o foo foo.c'.
# So we strip '-o arg' only if arg is an object.
eat=1
case $2 in
*.o | *.obj)
@ -94,22 +298,22 @@ do
done
if test -z "$ofile" || test -z "$cfile"; then
# If no `-o' option was seen then we might have been invoked from a
# If no '-o' option was seen then we might have been invoked from a
# pattern rule where we don't need one. That is ok -- this is a
# normal compilation that the losing compiler can handle. If no
# `.c' file was seen then we are probably linking. That is also
# '.c' file was seen then we are probably linking. That is also
# ok.
exec "$@"
fi
# Name of file we expect compiler to create.
cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
# Create the lock directory.
# Note: use `[/.-]' here to ensure that we don't use the same name
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
# that we are using for the .o file. Also, base the name on the expected
# object file name, since that is what matters with a parallel build.
lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
while true; do
if mkdir "$lockdir" >/dev/null 2>&1; then
break
@ -124,9 +328,9 @@ trap "rmdir '$lockdir'; exit 1" 1 2 15
ret=$?
if test -f "$cofile"; then
mv "$cofile" "$ofile"
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
elif test -f "${cofile}bj"; then
mv "${cofile}bj" "$ofile"
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
fi
rmdir "$lockdir"
@ -138,5 +342,6 @@ exit $ret
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:

View File

@ -260,12 +260,27 @@ case $host in
AC_DEFINE(HAVE_OPENAL)
LIBS="$LIBS -framework OpenGL -framework OpenAL"
CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers"
AC_SUBST(CPPFLAGS)
dnl - extra hackery needed for X includes
AC_PATH_XTRA
;;
esac
# Detect the host platform and architecture and feed them to the compiler as
# defines
AS_CASE([$host],
[*linux*], [AC_DEFINE(HOST_LINUX)],
[*bsd*] , [AC_DEFINE(HOST_BSD)],
[*mingw*], [AC_DEFINE(HOST_WINDOWS)],
[*darwin*],[AC_DEFINE(HOST_DARWIN)],
[AC_DEFINE(HOST_UNK)]
)
AS_CASE([$host_cpu],
[x86_64], [AC_DEFINE(HOST_64)],
[amd64], [AC_DEFINE(HOST_64)],
[AC_DEFINE(HOST_32)]
)
AC_SUBST(UI_DIR)
AC_SUBST(PO_DIR)

View File

@ -1317,7 +1317,7 @@ struct TSequenceItem_divider : public TSequenceItem
{
IF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[2]++);
MMU_new.div.busy = 0;
#ifdef _WIN64
#ifdef HOST_64
T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, MMU.divResult);
T1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, MMU.divMod);
#else

View File

@ -30,10 +30,11 @@
#include "emufile.h"
#include "firmware.h"
#include "types.h"
#include "utils/task.h"
#include <string>
#if defined(_WINDOWS)
#if defined(HOST_WINDOWS)
#include "pathsettings.h"
#endif
@ -507,7 +508,6 @@ extern struct TCommonSettings {
, DebugConsole(false)
, EnsataEmulation(false)
, cheatsDisable(false)
, num_cores(1)
, rigorous_timing(false)
, advanced_timing(true)
, micMode(InternalNoise)
@ -542,6 +542,8 @@ extern struct TCommonSettings {
#else
use_jit = false;
#endif
num_cores = getOnlineCores();
}
bool GFX3D_HighResolutionInterpolateColor;
bool GFX3D_EdgeMark;

View File

@ -18,7 +18,7 @@
#include "types.h"
#ifdef HAVE_JIT
#if !defined(__x86_64__) && !defined(__LP64) && !defined(__IA64__) && !defined(_M_X64) && !defined(_WIN64) && !defined(_M_IX86) && !defined(__INTEL__) && !defined(__i386__)
#if !defined(HOST_32) && !defined(HOST_64)
#error "ERROR: JIT compiler - unsupported target platform"
#endif
#ifdef _WINDOWS

View File

@ -20,7 +20,7 @@
#define ARM_JIT
#include "types.h"
#ifndef _MSC_VER
#ifndef _MSC_VER
#include <stdint.h>
#endif
@ -31,7 +31,7 @@ void arm_jit_close();
void arm_jit_sync();
template<int PROCNUM> u32 arm_jit_compile();
#if defined(_WINDOWS) || defined(DESMUME_COCOA)
#if defined(HOST_WINDOWS) || defined(HOST_DARWIN)
#define MAPPED_JIT_FUNCS
#endif
#ifdef MAPPED_JIT_FUNCS

View File

@ -23,7 +23,7 @@
#include "debug.h"
#include "utils/xstring.h"
#ifndef _MSC_VER
#ifndef _MSC_VER
#include <stdint.h>
#endif

View File

@ -62,7 +62,7 @@ CommandLine::CommandLine()
, start_paused(FALSE)
, autodetect_method(-1)
{
#ifndef _MSC_VER
#ifndef HOST_WINDOWS
disable_sound = 0;
disable_limiter = 0;
#endif
@ -108,7 +108,7 @@ void CommandLine::loadCommonOptions()
{ "cpu-mode", 0, 0, G_OPTION_ARG_INT, &_cpu_mode, "ARM CPU emulation mode: 0 - interpreter, 1 - dynarec (default 1)", NULL},
{ "jit-size", 0, 0, G_OPTION_ARG_INT, &_jit_size, "ARM JIT block size: 1..100 (1 - accuracy, 100 - faster) (default 100)", NULL},
#endif
#ifndef _MSC_VER
#ifndef HOST_WINDOWS
{ "disable-sound", 0, 0, G_OPTION_ARG_NONE, &disable_sound, "Disables the sound emulation", NULL},
{ "disable-limiter", 0, 0, G_OPTION_ARG_NONE, &disable_limiter, "Disables the 60fps limiter", NULL},
{ "nojoy", 0, 0, G_OPTION_ARG_INT, &_commandline_linux_nojoy, "Disables joystick support", "NOJOY"},

View File

@ -50,7 +50,7 @@ public:
std::string slot1;
std::string console_type;
std::string slot1_fat_dir;
#ifndef _MSC_VER
#ifndef HOST_WINDOWS
int disable_sound;
int disable_limiter;
#endif

View File

@ -92,7 +92,7 @@ public:
};
extern BaseDriver* driver;
#ifndef _WINDOWS
#ifndef HOST_WINDOWS
class UnixDriver : public BaseDriver
{
#ifdef EXPERIMENTAL_WIFI_COMM

View File

@ -64,7 +64,7 @@ size_t EMUFILE_MEMORY::_fread(const void *ptr, size_t bytes){
void EMUFILE_FILE::truncate(s32 length)
{
::fflush(fp);
#ifdef _MSC_VER
#ifdef HOST_WINDOWS
_chsize(_fileno(fp),length);
#else
ftruncate(fileno(fp),length);
@ -279,4 +279,4 @@ void EMUFILE::readMemoryStream(EMUFILE_MEMORY* ms)
fread(&temp[0],size);
ms->fwrite(&temp[0],size);
}
}
}

View File

@ -37,7 +37,7 @@ THE SOFTWARE.
#include "emufile_types.h"
#ifdef _MSC_VER
#ifdef HOST_WINDOWS
#include <io.h>
#else
#include <unistd.h>

View File

@ -770,7 +770,7 @@ static void* RunVideoFilterTask(void *arg)
return NULL;
}
#ifdef _MSC_VER
#ifdef HOST_WINDOWS
void ThreadLockInit(ThreadLock *theLock)
{
InitializeCriticalSection(theLock);

View File

@ -19,7 +19,7 @@
#ifndef _VIDEOFILTER_
#define _VIDEOFILTER_
#if defined(_MSC_VER)
#ifdef HOST_WINDOWS
typedef unsigned __int32 uint32_t;
#include <windows.h>
typedef CRITICAL_SECTION ThreadLock;

View File

@ -29,7 +29,7 @@ static const char InvalidPathChars[] = {
'\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D',
'\x1E', '\x1F'
//but I added this
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
,'\x2F'
#endif
};
@ -145,7 +145,7 @@ std::string Path::GetFileExt(std::string fileName)
}
//-----------------------------------
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
void FCEUD_MakePathDirs(const char *fname)
{
char path[MAX_PATH];

View File

@ -17,25 +17,25 @@
#include <string>
#ifdef _MSC_VER
#ifdef HOST_WINDOWS
#define mkdir _mkdir
#endif
#if defined(_WINDOWS)
#if defined(HOST_WINDOWS)
#include <winsock2.h>
#include <windows.h>
#include <direct.h>
#include "winutil.h"
#include "common.h"
#include "resource.h"
#elif !defined(DESMUME_COCOA)
#elif !defined(HOST_DARWIN)
#include <glib.h>
#endif /* _WINDOWS */
#endif /* HOST_WINDOWS */
#include "time.h"
#include "utils/xstring.h"
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#define FILE_EXT_DELIMITER_CHAR '.'
#define DIRECTORY_DELIMITER_CHAR '\\'
#define ALL_DIRECTORY_DELIMITER_STRING "/\\"
@ -45,7 +45,7 @@
#define ALL_DIRECTORY_DELIMITER_STRING "/"
#endif
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
void FCEUD_MakePathDirs(const char *fname);
#endif
@ -126,7 +126,7 @@ public:
std::vector<std::string> parts = tokenize_str(filename,"|");
SetRomName(parts[parts.size()-1].c_str());
LoadModulePath();
#if !defined(WIN32) && !defined(DESMUME_COCOA)
#if !defined(WIN32) && !defined(HOST_DARWIN)
ReadPathSettings();
#endif
@ -134,7 +134,7 @@ public:
void LoadModulePath()
{
#if defined(_WINDOWS)
#if defined(HOST_WINDOWS)
char *p;
ZeroMemory(pathToModule, sizeof(pathToModule));
@ -149,7 +149,7 @@ public:
{
strcpy(pathToModule,_hack_alternateModulePath);
}
#elif defined(DESMUME_COCOA)
#elif defined(HOST_DARWIN)
std::string pathStr = Path::GetFileDirectoryPath(path);
strncpy(pathToModule, pathStr.c_str(), MAX_PATH);
@ -169,7 +169,7 @@ public:
void GetDefaultPath(char *pathToDefault, const char *key, int maxCount)
{
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
std::string temp = (std::string)"." + DIRECTORY_DELIMITER_CHAR + pathToDefault;
strncpy(pathToDefault, temp.c_str(), maxCount);
#else
@ -179,7 +179,7 @@ public:
void ReadKey(char *pathToRead, const char *key)
{
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
GetPrivateProfileString(SECTION, key, key, pathToRead, MAX_PATH, IniName);
if(strcmp(pathToRead, key) == 0) {
//since the variables are all intialized in this file they all use MAX_PATH
@ -206,7 +206,7 @@ public:
ReadKey(pathToFirmware, FIRMWAREKEY);
ReadKey(pathToLua, LUAKEY);
ReadKey(pathToSlot1D, SLOT1DKEY);
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
GetPrivateProfileString(SECTION, FORMATKEY, "%f_%s_%r", screenshotFormat, MAX_FORMAT, IniName);
savelastromvisit = GetPrivateProfileBool(SECTION, LASTVISITKEY, true, IniName);
currentimageformat = (ImageFormat)GetPrivateProfileInt(SECTION, DEFAULTFORMATKEY, PNG, IniName);
@ -282,7 +282,7 @@ public:
}
strncpy(buffer, thePath.c_str(), MAX_PATH);
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
FCEUD_MakePathDirs(buffer);
#endif
}

View File

@ -33,7 +33,7 @@
#include <math.h>
#include <string.h>
#ifndef _MSC_VER
#ifndef _MSC_VER
#include <stdint.h>
#endif
@ -1099,9 +1099,11 @@ static char SoftRastInit(void)
_HACK_viewer_rasterizerUnit.SLI_VALUE = 0;
rasterizerCores = CommonSettings.num_cores;
if (rasterizerCores > _MAX_CORES)
rasterizerCores = _MAX_CORES;
if(CommonSettings.num_cores <= 1)
if(CommonSettings.num_cores == 1)
{
rasterizerCores = 1;
rasterizerUnit[0].SLI_MASK = 0;

View File

@ -47,7 +47,7 @@
#include "path.h"
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#include "windows/main.h"
#endif

View File

@ -21,7 +21,7 @@
//analyze microsoft compilers
#ifdef _MSC_VER
#define _WINDOWS
#define HOST_WINDOWS
//todo - everyone will want to support this eventually, i suppose
#include "config.h"
#endif
@ -37,7 +37,7 @@
#define IF_DEVELOPER(X)
#endif
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#define HAVE_LIBAGG
#define ENABLE_SSE
#define ENABLE_SSE2

View File

@ -17,7 +17,7 @@
#include <stdio.h>
#include <string>
#ifdef _MSC_VER
#ifdef HOST_WINDOWS
#include <direct.h>
#include <windows.h>
#define __mkdir(x) mkdir(x)
@ -32,7 +32,7 @@
using namespace std;
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#define FS_DIRECTORY_DELIMITER_CHAR "\\"
#else
#define FS_DIRECTORY_DELIMITER_CHAR "/"

View File

@ -19,13 +19,38 @@
#include "task.h"
#include <stdio.h>
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#include <windows.h>
#else
#include <pthread.h>
#if defined HOST_LINUX || defined HOST_DARWIN
#include <unistd.h>
#elif defined HOST_BSD
#include <sys/sysctl.h>
#endif
#endif // HOST_WINDOWS
#ifdef _MSC_VER
// http://stackoverflow.com/questions/150355/programmatically-find-the-number-of-cores-on-a-machine
int getOnlineCores (void)
{
#ifdef HOST_WINDOWS
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
#elif defined HOST_LINUX || defined HOST_DARWIN
return sysconf(_SC_NPROCESSORS_ONLN);
#elif defined HOST_BSD
int cores;
const int mib[4] = { CTL_HW, HW_NCPU, 0, 0 };
const size_t len = sizeof(cores);
sysctl(mib, 2, &cores, &len, NULL, 0);
return (cores < 1) ? 1 : cores;
#else
return 1;
#endif
}
#ifdef HOST_WINDOWS
class Task::Impl {
public:
Impl();

View File

@ -45,5 +45,6 @@ public:
};
int getOnlineCores (void);
#endif

View File

@ -32,7 +32,7 @@
#endif
//todo - everyone will want to support this eventually, i suppose
#if defined(_WINDOWS) || defined(DESMUME_COCOA)
#if defined(HOST_WINDOWS) || defined(HOST_DARWIN)
#include "svnrev.h"
#else
#ifdef SVN_REV

View File

@ -24,7 +24,7 @@
#include "bits.h"
#ifdef _WINDOWS
#ifdef HOST_WINDOWS
#include <winsock2.h>
#include <ws2tcpip.h>
#define socket_t SOCKET