diff --git a/source/amx/CMakeLists.txt b/source/amx/CMakeLists.txt index 62daa8f..608cbdb 100644 --- a/source/amx/CMakeLists.txt +++ b/source/amx/CMakeLists.txt @@ -1,4 +1,4 @@ -project(pawnamx) +project(pawnamx C) cmake_minimum_required(VERSION 2.8) # check for optional include files @@ -50,9 +50,6 @@ if(WIN32) set_target_properties(amxArgs PROPERTIES LINK_FLAGS "/export:amx_ArgsInit /export:amx_ArgsCleanup /export:amx_ArgsSetCmdLine") endif() endif() -if(UNIX) - add_custom_command(TARGET amxArgs POST_BUILD COMMAND strip ARGS -K amx_ArgsInit -K amx_ArgsCleanup -K amx_ArgsSetCmdLine ${CMAKE_BINARY_DIR}/amxArgs.so) -endif() # amxDGram set(DGRAM_SRCS amxdgram.c amx.c) @@ -66,9 +63,6 @@ if(WIN32) set_target_properties(amxDGram PROPERTIES LINK_FLAGS "/export:amx_DGramInit /export:amx_DGramCleanup") endif() endif() -if(UNIX) - add_custom_command(TARGET amxDGram POST_BUILD COMMAND strip ARGS -K amx_DGramInit -K amx_DGramCleanup ${CMAKE_BINARY_DIR}/amxDGram.so) -endif() # amxFile set(FILE_SRCS amxfile.c amx.c) @@ -82,9 +76,6 @@ if(WIN32) set_target_properties(amxFile PROPERTIES LINK_FLAGS "/export:amx_FileInit /export:amx_FileCleanup") endif() endif() -if(UNIX) - add_custom_command(TARGET amxFile POST_BUILD COMMAND strip ARGS -K amx_FileInit -K amx_FileCleanup ${CMAKE_BINARY_DIR}/amxFile.so) -endif() # amxFixed set(FIXED_SRCS fixed.c amx.c) @@ -100,7 +91,6 @@ if(WIN32) endif() if(UNIX) target_link_libraries(amxFixed m) - add_custom_command(TARGET amxFixed POST_BUILD COMMAND strip ARGS -K amx_FixedInit -K amx_FixedCleanup ${CMAKE_BINARY_DIR}/amxFixed.so) endif() # amxFloat @@ -117,7 +107,6 @@ if(WIN32) endif() if(UNIX) target_link_libraries(amxFloat m) - add_custom_command(TARGET amxFloat POST_BUILD COMMAND strip ARGS -K amx_FloatInit -K amx_FloatInit ${CMAKE_BINARY_DIR}/amxFloat.so) endif() # amxProcess @@ -143,7 +132,6 @@ if(WIN32) endif() if(UNIX) target_link_libraries(amxProcess dl) - add_custom_command(TARGET amxProcess POST_BUILD COMMAND strip ARGS -K amx_ProcessInit -K amx_ProcessCleanup ${CMAKE_BINARY_DIR}/amxProcess.so) endif() # amxString @@ -158,9 +146,6 @@ if(WIN32) set_target_properties(amxString PROPERTIES LINK_FLAGS "/export:amx_StringInit /export:amx_StringCleanup") endif() endif() -if(UNIX) - add_custom_command(TARGET amxString POST_BUILD COMMAND strip ARGS -K amx_StringInit -K amx_StringCleanup ${CMAKE_BINARY_DIR}/amxString.so) -endif() # amxTime set(TIME_SRCS amxtime.c amx.c) @@ -174,9 +159,6 @@ if(WIN32) set_target_properties(amxTime PROPERTIES LINK_FLAGS "/export:amx_TimeInit /export:amx_TimeCleanup") endif() endif() -if(UNIX) - add_custom_command(TARGET amxTime POST_BUILD COMMAND strip ARGS -K amx_TimeInit -K amx_TimeCleanup ${CMAKE_BINARY_DIR}/amxTime.so) -endif() # -------------------------------------------------------------------------- # Simple run-time (example program) diff --git a/source/amx/osdefs.h b/source/amx/osdefs.h index 29804ab..ae9162a 100644 --- a/source/amx/osdefs.h +++ b/source/amx/osdefs.h @@ -37,6 +37,8 @@ #if defined __FreeBSD__ #include +#elif defined __APPLE__ + #include #elif defined LINUX #include #endif diff --git a/source/compiler/CMakeLists.txt b/source/compiler/CMakeLists.txt index 6f0feda..6db9580 100644 --- a/source/compiler/CMakeLists.txt +++ b/source/compiler/CMakeLists.txt @@ -1,4 +1,4 @@ -project(pawnc) +project(pawnc C) cmake_minimum_required(VERSION 2.8) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake) @@ -22,6 +22,17 @@ if(HAVE_ALLOCA_H) add_definitions(-DHAVE_ALLOCA_H) endif() +# check for optional library functions +include(CheckFunctionExists) +check_function_exists(strlcpy HAVE_STRLCPY) +if(HAVE_STRLCPY) + add_definitions(-DHAVE_STRLCPY) +endif() +check_function_exists(strlcat HAVE_STRLCAT) +if(HAVE_STRLCAT) + add_definitions(-DHAVE_STRLCAT) +endif() + if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS /J) endif() @@ -66,10 +77,6 @@ add_library(pawnc SHARED ${PAWNC_SRCS}) if(WATCOM) #Watcom C/C++ does not support a .DEF file for the exports set_target_properties(pawnc PROPERTIES LINK_FLAGS "/exp=libpawnc") endif() -if(UNIX AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - # Unix exports all symbols by default; we want only a very select few exported symbols - add_custom_command(TARGET pawnc POST_BUILD COMMAND strip ARGS -K pc_compile -K pc_addconstant -K pc_addtag -K pc_enablewarning ${CMAKE_BINARY_DIR}/libpawnc.so) -endif() # The Pawn compiler driver (console program) set(PAWNCC_SRCS pawncc.c) diff --git a/source/compiler/libpawnc.c b/source/compiler/libpawnc.c index 025ef01..c12031a 100644 --- a/source/compiler/libpawnc.c +++ b/source/compiler/libpawnc.c @@ -178,6 +178,43 @@ void *pc_createsrc(char *filename) return fopen(filename,"wt"); } +/* pc_createtmpsrc() + * Creates a temporary source file with a unique name for writing. + * Return: + * The function must return a pointer, which is used as a "magic cookie" to + * all I/O functions. When failing to open the file for reading, the + * function must return NULL. + */ +void *pc_createtmpsrc(char **filename) +{ + char *tname=NULL; + FILE *ftmp=NULL; + + #if defined __WIN32__ || defined _WIN32 + tname=_tempnam(NULL,"pawn"); + ftmp=fopen(tname,"wt"); + #elif defined __MSDOS__ || defined _Windows + tname=tempnam(NULL,"pawn"); + ftmp=fopen(tname,"wt"); + #else + static const char template[]="/tmp/pawnXXXXXX"; + ftmp=NULL; + if ((tname=malloc(sizeof(template)))!=NULL) { + int fdtmp; + strncpy(tname,template,sizeof(template)); + if ((fdtmp=mkstemp(tname)) >= 0) { + ftmp=fdopen(fdtmp,"wt"); + } else { + free(tname); + tname=NULL; + } /* if */ + } /* if */ + #endif + if (filename!=NULL) + *filename=tname; + return ftmp; +} + /* pc_closesrc() * Closes a source file (or include file). The "handle" parameter has the * value that pc_opensrc() returned in an earlier call. diff --git a/source/compiler/lstring.c b/source/compiler/lstring.c index b21f352..bbd359f 100644 --- a/source/compiler/lstring.c +++ b/source/compiler/lstring.c @@ -7,7 +7,7 @@ #include "lstring.h" -#if !defined HAVE_SAFESTR +#if !defined HAVE_STRLCPY /* $OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */ @@ -63,6 +63,10 @@ strlcpy(char *dst, const char *src, size_t siz) return(s - src - 1); /* count does not include NUL */ } +#endif /* if !defined HAVE_STRLCPY */ + +#if !defined HAVE_STRLCAT + /* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ /* @@ -121,4 +125,4 @@ strlcat(char *dst, const char *src, size_t siz) return(dlen + (s - src)); /* count does not include NUL */ } -#endif /* #if !defined HAVE_SAFESTR */ +#endif /* #if !defined HAVE_STRLCAT */ diff --git a/source/compiler/lstring.h b/source/compiler/lstring.h index 1e7e048..25c0873 100644 --- a/source/compiler/lstring.h +++ b/source/compiler/lstring.h @@ -7,11 +7,20 @@ #define HAVE_SAFESTR #endif -#if !defined HAVE_SAFESTR +#if defined HAVE_SAFESTR + #define HAVE_STRLCPY + #define HAVE_STRLCAT +#endif + +#if !defined HAVE_STRLCPY size_t strlcpy(char *dst, const char *src, size_t siz); +#endif + +#if !defined HAVE_STRLCAT + size_t strlcat(char *dst, const char *src, size_t siz); diff --git a/source/compiler/memfile.h b/source/compiler/memfile.h index 5b4930f..8cef0d0 100644 --- a/source/compiler/memfile.h +++ b/source/compiler/memfile.h @@ -8,7 +8,7 @@ #ifndef _INCLUDE_MEMFILE_H #define _INCLUDE_MEMFILE_H -#ifdef MACOS +#ifdef __APPLE__ #include #else #include diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index 53d4483..ee3959f 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -40,6 +40,10 @@ #include /* from BinReloc, see www.autopackage.org */ #endif +#if defined __APPLE__ + #include +#endif + #if defined FORTIFY #include #endif @@ -250,6 +254,43 @@ void *pc_createsrc(char *filename) return fopen(filename,"w"); } +/* pc_createtmpsrc() + * Creates a temporary source file with a unique name for writing. + * Return: + * The function must return a pointer, which is used as a "magic cookie" to + * all I/O functions. When failing to open the file for reading, the + * function must return NULL. + */ +void *pc_createtmpsrc(char **filename) +{ + char *tname=NULL; + FILE *ftmp=NULL; + + #if defined __WIN32__ || defined _WIN32 + tname=_tempnam(NULL,"pawn"); + ftmp=fopen(tname,"wt"); + #elif defined __MSDOS__ || defined _Windows + tname=tempnam(NULL,"pawn"); + ftmp=fopen(tname,"wt"); + #else + static const char template[]="/tmp/pawnXXXXXX"; + ftmp=NULL; + if ((tname=malloc(sizeof(template)))!=NULL) { + int fdtmp; + strncpy(tname,template,sizeof(template)); + if ((fdtmp=mkstemp(tname)) >= 0) { + ftmp=fdopen(fdtmp,"wt"); + } else { + free(tname); + tname=NULL; + } /* if */ + } /* if */ + #endif + if (filename!=NULL) + *filename=tname; + return ftmp; +} + /* pc_closesrc() * Closes a source file (or include file). The "handle" parameter has the * value that pc_opensrc() returned in an earlier call. @@ -472,19 +513,7 @@ int pc_compile(int argc, char *argv[]) char *tname,*sname; FILE *ftmp,*fsrc; int fidx; - #if defined __WIN32__ || defined _WIN32 - tname=_tempnam(NULL,"pawn"); - #elif defined __MSDOS__ || defined _Windows - tname=tempnam(NULL,"pawn"); - #elif defined(MACOS) && !defined(__MACH__) - /* tempnam is not supported for the Macintosh CFM build. */ - error(104,get_sourcefile(1)); - tname=NULL; - sname=NULL; - #else - tname=tempnam(NULL,"pawn"); - #endif - ftmp=(FILE*)pc_createsrc(tname); + ftmp=pc_createtmpsrc(&tname); for (fidx=0; (sname=get_sourcefile(fidx))!=NULL; fidx++) { unsigned char tstring[128]; fsrc=(FILE*)pc_opensrc(sname); diff --git a/source/linux/sclinux.h b/source/linux/sclinux.h index f22497a..3b4af2c 100644 --- a/source/linux/sclinux.h +++ b/source/linux/sclinux.h @@ -40,6 +40,12 @@ # define __BIG_ENDIAN BIG_ENDIAN #endif +#if defined __APPLE__ +# define __BYTE_ORDER BYTE_ORDER +# define __LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN +# define __BIG_ENDIAN __DARWIN_BIG_ENDIAN +#endif + #if !defined __BYTE_ORDER # error "Can't figure computer byte order (__BYTE_ORDER macro not found)" #endif