Merge pull request #137 from uucidl/building-on-appveyor

Building on appveyor
This commit is contained in:
Meredith L. Patterson 2015-08-12 10:01:03 +02:00
commit a7a5e8cfad
21 changed files with 305 additions and 13 deletions

19
appveyor.yml Normal file
View file

@ -0,0 +1,19 @@
platform:
- x86
- x64
version: 1.0.{build}
os: Visual Studio 2015
build_script:
- '@echo off'
- setlocal
- ps: >-
If ($env:Platform -Match "x86") {
$env:VCVARS_PLATFORM="x86"
} Else {
$env:VCVARS_PLATFORM="amd64"
}
- call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM%
- call tools\windows\build.bat
# FIXME(windows) TODO(uucidl): reactivate examples
# - call tools\windows\build_examples.bat
- exit /b 0

View file

@ -5,6 +5,7 @@ Import('env testruns')
dist_headers = [
"hammer.h",
"allocator.h",
"compiler_specifics.h",
"glue.h",
"internal.h"
]
@ -61,6 +62,7 @@ misc_hammer_parts = [
'desugar.c',
'glue.c',
'hammer.c',
'platform_bsdlike.c',
'pprint.c',
'registry.c',
'system_allocator.c']

View file

@ -22,7 +22,7 @@ struct HCFStack_ {
};
#ifndef UNUSED
#define UNUSED __attribute__((unused))
#define UNUSED H_GCC_ATTRIBUTE((unused))
#endif
static inline HCFChoice* h_cfstack_new_choice_raw(HAllocator *mm__, HCFStack *stk__) UNUSED;

View file

@ -126,7 +126,7 @@ HParseResult* grow(HParserCacheKey *k, HParseState *state, HRecursionHead *head)
h_hashtable_put(state->recursion_heads, &k->input_pos, head);
HParserCacheValue *old_cached = h_hashtable_get(state->cache, k);
if (!old_cached || PC_LEFT == old_cached->value_type)
errx(1, "impossible match");
h_platform_errx(1, "impossible match");
HParseResult *old_res = old_cached->right;
// rewind the input
@ -148,7 +148,7 @@ HParseResult* grow(HParserCacheKey *k, HParseState *state, HRecursionHead *head)
state->input_stream = cached->input_stream;
return cached->right;
} else {
errx(1, "impossible match");
h_platform_errx(1, "impossible match");
}
}
} else {
@ -173,7 +173,7 @@ HParseResult* lr_answer(HParserCacheKey *k, HParseState *state, HLeftRec *growab
return grow(k, state, growable->head);
}
} else {
errx(1, "lrAnswer with no head");
h_platform_errx(1, "lrAnswer with no head");
}
}

View file

@ -5,7 +5,7 @@
#include <gtest/gtest.h>
#include <hammer/hammer.hpp>
#define HAMMER_DECL_UNUSED __attribute__((unused))
#define HAMMER_DECL_UNUSED H_GCC_ATTRIBUTE((unused))
static ::testing::AssertionResult ParseFails (hammer::Parser parser,
const std::string &input) HAMMER_DECL_UNUSED;

View file

@ -11,7 +11,7 @@ while(<>) {
} elsif (/^HAMMER_FN_DECL\(([^,]*), ([^,]*), ([^)]*)\);/) {
print "$1 $2($3);\n";
print "$1 $2__m(HAllocator* mm__, $3);\n";
} elsif (/^HAMMER_FN_DECL_VARARGS_ATTR\((__attribute__\(\([^)]*\)\)), ([^,]*), ([^,]*), ([^)]*)\);/) {
} elsif (/^HAMMER_FN_DECL_VARARGS_ATTR\((H_GCC_ATTRIBUTE\(\([^)]*\)\)), ([^,]*), ([^,]*), ([^)]*)\);/) {
print "$2 $3($4, ...);\n";
print "$2 $3__m(HAllocator *mm__, $4, ...);\n";
print "$2 $3__a(void* args);\n";

16
src/compiler_specifics.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef HAMMER_COMPILER_SPECIFICS__H
#define HAMMER_COMPILER_SPECIFICS__H
#if defined(__clang__) || defined(__GNUC__)
#define H_GCC_ATTRIBUTE(x) __attribute__(x)
#else
#define H_GCC_ATTRIBUTE(x)
#endif
#if defined(_MSC_VER)
#define H_MSVC_DECLSPEC(x) __declspec(x)
#else
#define H_MSVC_DECLSPEC(x)
#endif
#endif

View file

@ -17,7 +17,6 @@
#include <assert.h>
#include <ctype.h>
#include <err.h>
#include <limits.h>
#include <stdarg.h>
#include <string.h>

View file

@ -17,6 +17,9 @@
#ifndef HAMMER_HAMMER__H
#define HAMMER_HAMMER__H
#include "compiler_specifics.h"
#ifndef HAMMER_INTERNAL__NO_STDARG_H
#include <stdarg.h>
#endif // HAMMER_INTERNAL__NO_STDARG_H
@ -434,7 +437,7 @@ HAMMER_FN_DECL_NOARG(HParser*, h_nothing_p);
*
* Result token type: TT_SEQUENCE
*/
HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, HParser* p);
HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_sequence, HParser* p);
/**
* Given an array of parsers, p_array, apply each parser in order. The
@ -443,7 +446,7 @@ HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_sequence, HPa
*
* Result token type: The type of the first successful parser's result.
*/
HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, HParser* p);
HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_choice, HParser* p);
/**
* Given a null-terminated list of parsers, match a permutation phrase of these
@ -469,7 +472,7 @@ HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_choice, HPars
*
* Result token type: TT_SEQUENCE
*/
HAMMER_FN_DECL_VARARGS_ATTR(__attribute__((sentinel)), HParser*, h_permutation, HParser* p);
HAMMER_FN_DECL_VARARGS_ATTR(H_GCC_ATTRIBUTE((sentinel)), HParser*, h_permutation, HParser* p);
/**
* Given two parsers, p1 and p2, this parser succeeds in the following

View file

@ -24,9 +24,9 @@
#define HAMMER_INTERNAL__H
#include <stdint.h>
#include <assert.h>
#include <err.h>
#include <string.h>
#include "hammer.h"
#include "platform.h"
/* "Internal" in this case means "we're not ready to commit
* to a public API." Many structures and routines here will be
@ -38,7 +38,7 @@
#else
#define assert_message(check, message) do { \
if (!(check)) \
errx(1, "Assertion failed (programmer error): %s", message); \
h_platform_errx(1, "Assertion failed (programmer error): %s", message); \
} while(0)
#endif

View file

@ -246,7 +246,7 @@ static HParseResult* parse_length_value(void *env, HParseState *state) {
if (!len)
return NULL;
if (len->ast->token_type != TT_UINT)
errx(1, "Length parser must return an unsigned integer");
h_platform_errx(1, "Length parser must return an unsigned integer");
// TODO: allocate this using public functions
HRepeat repeat = {
.p = lv->value,

18
src/platform.h Normal file
View file

@ -0,0 +1,18 @@
#ifndef HAMMER_PLATFORM__H
#define HAMMER_PLATFORM__H
/**
* @file interface between hammer and the operating system /
* underlying platform.
*/
#include "compiler_specifics.h"
/* Error Reporting */
/* BSD errx function, seen in err.h */
H_MSVC_DECLSPEC(noreturn) \
void h_platform_errx(int err, const char* format, ...) \
H_GCC_ATTRIBUTE((noreturn, format (printf,2,3)));
#endif

10
src/platform_bsdlike.c Normal file
View file

@ -0,0 +1,10 @@
#include "platform.h"
#include <err.h>
#include <stdarg.h>
void h_platform_errx(int err, const char* format, ...) {
va_list ap;
va_start(ap, format);
verrx(err, format, ap);
}

10
src/platform_win32.c Normal file
View file

@ -0,0 +1,10 @@
#include "platform.h"
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
void h_platform_errx(int err, const char* format, ...) {
// FIXME(windows) TODO(uucidl): to be implemented
ExitProcess(err);
}

1
tools/windows/README.md Normal file
View file

@ -0,0 +1 @@
Support tools for the Windows (win32/win64) port.

47
tools/windows/build.bat Normal file
View file

@ -0,0 +1,47 @@
@echo off
setlocal
REM This script must be run after vcvarsall.bat has been run,
REM so that cl.exe is in your path.
where cl.exe || goto vsmissing_err
REM HEREPATH is <drive_letter>:<script_directory>
set HEREPATH=%~d0%~p0
REM Set up SRC, BUILD and CLFLAGS
call %HEREPATH%\env.bat
call %HEREPATH%\clvars.bat
echo SRC=%SRC%, BUILD=%BUILD%
echo Building with flags: %CLFLAGS%
pushd %SRC%
mkdir %BUILD%\obj
del /Q %BUILD%\obj\
cl.exe -nologo -FC -EHsc -Z7 -Oi -GR- -Gm- %CLFLAGS% -c ^
@%HEREPATH%\hammer_lib_src_list ^
-Fo%BUILD%\obj\
if %errorlevel% neq 0 goto err
lib.exe %BUILD%\obj\*.obj -OUT:%BUILD%\hammer.lib
echo STATIC_LIBRARY %BUILD%\hammer.lib
if %errorlevel% neq 0 goto err
popd
REM TODO(uucidl): how to build and run the tests? They are written with glib.h
REM which might be a challenge on windows. On the other hand the API of glib.h
REM does not seem too hard to reimplement.
echo SUCCESS: Successfully built
endlocal
exit /b 0
:vsmissing_err
echo ERROR: CL.EXE missing. Have you run vcvarsall.bat?
exit /b 1
:err
endlocal
echo ERROR: Failed to build
exit /b %errorlevel%

View file

@ -0,0 +1,53 @@
@echo off
setlocal
REM This script must be run after vcvarsall.bat has been run,
REM so that cl.exe is in your path.
where cl.exe || goto vsmissing_err
REM HEREPATH is <drive_letter>:<script_directory>
set HEREPATH=%~d0%~p0
REM Set up SRC, BUILD and CLFLAGS
call %HEREPATH%\env.bat
call %HEREPATH%\clvars.bat
echo SRC=%SRC%, BUILD=%BUILD%
echo CLFLAGS=%CLFLAGS%
set HAMMERLIB=%BUILD%\hammer.lib
REM Now let's build some example programs
cl.exe -nologo %CLFLAGS% examples\base64.c %HAMMERLIB% -Fo%BUILD%\ -Fe%BUILD%\
if %errorlevel% neq 0 goto err
echo PROGRAM build\base64.exe
cl.exe -nologo %CLFLAGS% examples\base64_sem1.c %HAMMERLIB% -Fo%BUILD%\ -Fe%BUILD%\
if %errorlevel% neq 0 goto err
echo PROGRAM build\base64_sem1.exe
cl.exe -nologo %CLFLAGS% examples\base64_sem2.c %HAMMERLIB% -Fo%BUILD%\ -Fe%BUILD%\
if %errorlevel% neq 0 goto err
echo PROGRAM build\base64_sem2.exe
REM FIXME(windows) TODO(uucidl): dns.c only works on posix
REM cl.exe -nologo %CLFLAGS% examples\dns.c %HAMMERLIB% -Fo%BUILD%\ -Fe%BUILD%\
REM if %errorlevel% neq 0 goto err
REM echo PROGRAM build\dns.exe
REM FIXME(windows) TODO(uucidl): grammar.c needs to be fixed
cl.exe -nologo %CLFLAGS% examples\ties.c examples\grammar.c %HAMMERLIB% -Fo%BUILD%\ -Fe%BUILD%\
if %errorlevel% neq 0 goto err
echo PROGRAM build\ties.exe
echo SUCCESS: Successfully built
endlocal
exit /b 0
:vsmissing_err
echo ERROR: CL.EXE missing. Have you run vcvarsall.bat?
exit /b 1
:err
echo ERROR: Failed to build
endlocal
exit /b %errorlevel%

59
tools/windows/clvars.bat Normal file
View file

@ -0,0 +1,59 @@
REM Don't call me directly
REM Exports CLFLAGS
REM Start with the most strict warning level
set WARNINGS=-W4 -Wall -WX
REM c4457 (declaration shadowing function parameter)
REM FIXME(windows) TODO(uucidl): remove occurence of c4457 and reactivate
REM FIXME(windows) TODO(uucidl): remove occurence of c4456 and reactivate
REM see -Wshadow
set WARNINGS=%WARNINGS% -wd4457 -wd4456
REM c4701 (potentially unitialized local variable)
REM FIXME(windows) TODO(uucidl): remove occurence of c4701 if possible
set WARNINGS=%WARNINGS% -wd4701
REM We disable implicit casting warnings (c4244), as they occur too often here.
REM Its gcc/clang counterpart is Wconversion which does not seem to
REM be enabled by default.
REM See: [[https://gcc.gnu.org/wiki/NewWconversion#Frequently_Asked_Questions]]
REM
REM Likewise for c4242 (conversion with potential loss of data) and c4267
REM (conversion away from size_t to a smaller type) and c4245 (conversion
REM from int to size_t signed/unsigned mismatch)
set WARNINGS=%WARNINGS% -wd4242 -wd4244 -wd4245 -wd4267
REM c4100 (unreferenced formal parameter) is equivalent to -Wno-unused-parameter
set WARNINGS=%WARNINGS% -wd4100
REM c4200 (zero-sized array) is a C idiom supported by C99
set WARNINGS=%WARNINGS% -wd4200
REM c4204 (non-constant aggregate initializers) ressembles C99 support
set WARNINGS=%WARNINGS% -wd4204
REM c4201 (anonymous unions) ressembles C11 support.
REM see -std=gnu99 vs -std=c99
set WARNINGS=%WARNINGS% -wd4201
REM c4820 (warnings about padding) and c4324 (intentional padding) are
REM not useful
set WARNINGS=%WARNINGS% -wd4820 -wd4324
REM c4710 (inlining could not be performed) is not useful
set WARNINGS=%WARNINGS% -wd4710
REM c4255 ( () vs (void) ambiguity) is not useful
set WARNINGS=%WARNINGS% -wd4255
REM c4127 (conditional expression is constant) is not useful
set WARNINGS=%WARNINGS% -wd4127
REM c4668 (an undefined symbol in a preprocessor directive) is not useful
set WARNINGS=%WARNINGS% -wd4668
REM we use sprintf so this should be enabled
set DEFINES=-D_CRT_SECURE_NO_WARNINGS
set CLFLAGS=-Od -Z7 %DEFINES% %WARNINGS% -Debug

16
tools/windows/env.bat Normal file
View file

@ -0,0 +1,16 @@
REM Don't call me directly.
REM
REM Expects HEREPATH (this directory)
REM Exports SRC (hammer's src directory)
REM Exports BUILD (hammer's build directory)
set TOP=%HEREPATH%..\..
REM Get canonical path for TOP
pushd .
cd %TOP%
set TOP=%CD%
popd
set SRC=%TOP%\src
set BUILD=%TOP%\build

View file

@ -0,0 +1,38 @@
platform_win32.c
allocator.c
bitreader.c
bitwriter.c
cfgrammar.c
desugar.c
glue.c
hammer.c
parsers/action.c
parsers/and.c
parsers/attr_bool.c
parsers/butnot.c
parsers/ch.c
parsers/charset.c
parsers/difference.c
parsers/end.c
parsers/endianness.c
parsers/epsilon.c
parsers/ignore.c
parsers/ignoreseq.c
parsers/indirect.c
parsers/int_range.c
parsers/many.c
parsers/not.c
parsers/optional.c
parsers/permutation.c
parsers/sequence.c
parsers/token.c
parsers/unimplemented.c
parsers/whitespace.c
parsers/xor.c
parsers/value.c
backends/packrat.c
backends/llk.c
backends/glr.c
backends/lalr.c
backends/lr.c
backends/lr0.c

1
tools/windows/status.bat Normal file
View file

@ -0,0 +1 @@
git grep "FIXME(windows)"