From 242562ca08001dfc9116c5698a5bcdacda0839d2 Mon Sep 17 00:00:00 2001 From: Mateusz Date: Sun, 27 Nov 2016 18:55:29 +0100 Subject: [PATCH] Removed the whitespaces between MakeGStorable and their arguments. Fixes issue #1 on OSX. Removed the tests related to bad numbering of fields. --- .travis.yml | 163 ++++++++++++++++++ ChangeLog.md | 20 +++ README.md | 2 + derive-storable.cabal | 20 ++- src/Foreign/Storable/Generic/Instances.hs | 82 ++++----- .../Generic/Internal/GStorable'Spec.hs | 27 +-- .../Foreign/Storable/Generic/InternalSpec.hs | 1 + 7 files changed, 244 insertions(+), 71 deletions(-) create mode 100644 .travis.yml create mode 100644 ChangeLog.md diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..a3072e7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,163 @@ +# This is the complex Travis configuration, which is intended for use +# on open source libraries which need compatibility across multiple GHC +# versions, must work with cabal-install, and should be +# cross-platform. For more information and other options, see: +# +# https://docs.haskellstack.org/en/stable/travis_ci/ +# +# Copy these contents into the root directory of your Github project in a file +# named .travis.yml + +# Use new container infrastructure to enable caching +sudo: false + +# Do not choose a language; we provide our own build tools. +language: generic + +# Caching so the next build will be fast too. +cache: + directories: + - $HOME/.ghc + - $HOME/.cabal + - $HOME/.stack + - $HOME/.gcc + +# The different configurations we want to test. We have BUILD=cabal which uses +# cabal-install, and BUILD=stack which uses Stack. More documentation on each +# of those below. +# +# We set the compiler values here to tell Travis to use a different +# cache file per set of arguments. +# +# If you need to have different apt packages for each combination in the +# matrix, you can use a line such as: +# addons: {apt: {packages: [libfcgi-dev,libgmp-dev]}} +matrix: + include: +# - env: BUILD=cabal GHCVER=7.10.3 CABALVER=1.22 HAPPYVER=1.19.5 ALEXVER=3.1.7 GCCVER=6 COMPILER=gcc-6 +# compiler: ": #GHC 7.10.3" +# addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,happy-1.19.5,alex-3.1.7,gcc-6], sources: [hvr-ghc,ubuntu-toolchain-r-test ]}} +# - env: BUILD=cabal GHCVER=8.0.1 CABALVER=1.24 HAPPYVER=1.19.5 ALEXVER=3.1.7 GCCVER=6 COMPILER=gcc-6 +# compiler: ": #GHC 8.0.1" +# addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1,happy-1.19.5,alex-3.1.7,gcc-6], sources: [hvr-ghc,ubuntu-toolchain-r-test]}} +# +# # Build with the newest GHC and cabal-install. This is an accepted failure, +# # see below. +# - env: BUILD=cabal GHCVER=head CABALVER=head HAPPYVER=1.19.5 ALEXVER=3.1.7 GCCVER=6 +# compiler: ": #GHC HEAD" +# addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5,alex-3.1.7,gcc-6], sources: [hvr-ghc,ubuntu-toolchain-r-test]}} +# +# + - env: BUILD=stack ARGS="--resolver lts-6" + compiler: ": #stack 7.10.3 osx" + os: osx +# + - env: BUILD=stack ARGS="--resolver lts-7" + compiler: ": #stack 8.0.1 osx" + os: osx +# + - env: BUILD=stack ARGS="--resolver nightly" + compiler: ": #stack nightly osx" + os: osx +# +# allow_failures: +# - env: BUILD=cabal GHCVER=head CABALVER=head HAPPYVER=1.19.5 ALEXVER=3.1.7 GCCVER=6 +# - env: BUILD=stack ARGS="--resolver nightly" + +before_install: +# Using compiler above sets CC to an invalid value, so unset it +- unset CC +# We want to always allow newer versions of packages when building on GHC HEAD +- CABALARGS=" --ghc-options=-I/usr/lib/gcc/x86_64-linux-gnu/6/include/" +- if [ "x$GHCVER" = "xhead" ]; then CABALARGS=--allow-newer; fi +# Set paths +- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$HOME/.local/bin:/opt/alex/$ALEXVER/bin:/opt/happy/$HAPPYVER/bin:$HOME/.cabal/bin:$HOME/.gcc/bin:$PATH +# Set the GCC... + +- if [ $BUILD == "cabal"]; then + mkdir -p ~/.gcc/bin; + ln -s /usr/bin/gcc-6 $HOME/.gcc/bin/gcc; + fi +# - echo `gcc --version` +# - echo `whereis gcc` +# - echo `find /usr/ -type f -name stdalign.h` +- export C_INCLUDE_PATH=$/usr/lib/x86_64-linux-gnu/$GCCVER/include:$C_INCLUDE_PATH +# Download and unpack the stack executable +- mkdir -p ~/.local/bin +- | + if [ `uname` = "Darwin" ] + then + travis_retry curl --insecure -L https://www.stackage.org/stack/osx-x86_64 | tar xz --strip-components=1 --include '*/stack' -C ~/.local/bin + else + travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack' + fi + + # Use the more reliable S3 mirror of Hackage + mkdir -p $HOME/.cabal + echo 'remote-repo: hackage.haskell.org:http://hackage.fpcomplete.com/' > $HOME/.cabal/config + echo 'remote-repo-cache: $HOME/.cabal/packages' >> $HOME/.cabal/config + + if [ "$CABALVER" != "1.16" ] + then + echo 'jobs: $ncpus' >> $HOME/.cabal/config + fi + +install: +- if [ $BUILD == "cabal"]; then + mkdir -p ~/.gcc/include; + ln -s /usr/lib/gcc/x86_64-linux-gnu/6/include/ $HOME/.gcc/include/; + fi +# - find /usr/ -type f -name stdalign.h +- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]" +- if [ -f configure.ac ]; then autoreconf -i; fi +- | + set -ex + case "$BUILD" in + stack) + stack init + if [ "$?" -ne 0]; then + stack solver + fi; + stack --no-terminal --install-ghc $ARGS test --bench --only-dependencies + ;; + cabal) + cabal --version + travis_retry cabal update + + # Get the list of packages from the stack.yaml file + PACKAGES=$(stack --install-ghc query locals | grep '^ *path' | sed 's@^ *path:@@') + + cabal install --only-dependencies --enable-tests --enable-benchmarks --force-reinstalls --ghc-options=-O0 --reorder-goals --max-backjumps=-1 $CABALARGS $PACKAGES + ;; + esac + set +ex + +script: +- | + set -ex + case "$BUILD" in + stack) + stack --no-terminal $ARGS test --bench --no-run-benchmarks --haddock --no-haddock-deps + ;; + cabal) + cabal install --enable-tests --enable-benchmarks --force-reinstalls --ghc-options=-O0 --reorder-goals --max-backjumps=-1 $CABALARGS $PACKAGES + + ORIGDIR=$(pwd) + for dir in $PACKAGES + do + cd $dir + cabal check || [ "$CABALVER" == "1.16" ] + cabal sdist + PKGVER=$(cabal info . | awk '{print $2;exit}') + SRC_TGZ=$PKGVER.tar.gz + cd dist + tar zxfv "$SRC_TGZ" + cd "$PKGVER" + cabal configure --enable-tests + cabal build + cd $ORIGDIR + done + ;; + esac + set +ex + diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..0ecd2b0 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,20 @@ +# Revision history for derive-storable + +## 0.1.0.4 -- 2016-11-29 + +* Fixed the bug with Foreign.Storable.Generic.Internal.Instances module. +* Removed two tests related to numbering of fields. + +## 0.1.0.3 -- 2016-09-19 + +* Changed the link in README to hackage repository. + +## 0.1.0.2 -- 2016-09-11 + +* Changed generic-storable to derive-storable in README.md +* Added README.md to the package + + +## 0.1.0.0 -- 2016-09-08 + +* First version. Released on an unsuspecting world. diff --git a/README.md b/README.md index a1ec8ab..2b97c61 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Introduction +[![Build Status](https://travis-ci.org/mkloczko/derive-storable.svg?branch=master)](https://travis-ci.org/mkloczko/derive-storable) + The `derive-storable` package allows you to automatically generate Storable instances for your datatypes. It uses GHC.Generics, which allows the coders to derive certain instances automatically. To derive a (G)Storable instance, the data-type has to: * have only one constructor. diff --git a/derive-storable.cabal b/derive-storable.cabal index ccad498..d827c04 100644 --- a/derive-storable.cabal +++ b/derive-storable.cabal @@ -1,10 +1,9 @@ name: derive-storable -version: 0.1.0.3 -synopsis: Derive Storable instances with help of GHC.Generics. +version: 0.1.0.4 +synopsis: Derive Storable instances with GHC.Generics. -description: The package allows for automatic derivation of Storable instances - with C-like memory layout. +description: Derive Storable instances with GHC.Generics. The derived Storable instances have the same alignment as C structs. homepage: https://www.github.com/mkloczko/derive-storable/ license: MIT @@ -48,3 +47,16 @@ test-suite spec build-depends: base >= 4.8 && < 4.10, derive-storable, hspec == 2.2.*, QuickCheck == 2.8.* default-language: Haskell2010 + + +source-repository head + type: git + location: https://github.com/mkloczko/derive-storable + branch: master + + +source-repository this + type: git + location: https://github.com/mkloczko/derive-storable + branch: master + tag: bb5cc5d3fa34c8346fda84898606ea3c120ea131 diff --git a/src/Foreign/Storable/Generic/Instances.hs b/src/Foreign/Storable/Generic/Instances.hs index 6807202..6b6aad6 100644 --- a/src/Foreign/Storable/Generic/Instances.hs +++ b/src/Foreign/Storable/Generic/Instances.hs @@ -52,54 +52,54 @@ MakeGStorable(Word16) MakeGStorable(Word32) MakeGStorable(Word64) -MakeGStorable (Fingerprint) +MakeGStorable(Fingerprint) -- C primitives -MakeGStorable (CUIntMax) -MakeGStorable (CIntMax) -MakeGStorable (CSUSeconds) -MakeGStorable (CUSeconds) -MakeGStorable (CTime) -MakeGStorable (CClock) -MakeGStorable (CSigAtomic) -MakeGStorable (CPtrdiff) -MakeGStorable (CDouble) -MakeGStorable (CFloat) -MakeGStorable (CULLong) -MakeGStorable (CLLong) -MakeGStorable (CULong) -MakeGStorable (CLong) -MakeGStorable (CUInt) -MakeGStorable (CInt) -MakeGStorable (CUShort) -MakeGStorable (CShort) -MakeGStorable (CUChar) -MakeGStorable (CSChar) -MakeGStorable (CChar) +MakeGStorable(CUIntMax) +MakeGStorable(CIntMax) +MakeGStorable(CSUSeconds) +MakeGStorable(CUSeconds) +MakeGStorable(CTime) +MakeGStorable(CClock) +MakeGStorable(CSigAtomic) +MakeGStorable(CPtrdiff) +MakeGStorable(CDouble) +MakeGStorable(CFloat) +MakeGStorable(CULLong) +MakeGStorable(CLLong) +MakeGStorable(CULong) +MakeGStorable(CLong) +MakeGStorable(CUInt) +MakeGStorable(CInt) +MakeGStorable(CUShort) +MakeGStorable(CShort) +MakeGStorable(CUChar) +MakeGStorable(CSChar) +MakeGStorable(CChar) -- Ptr -MakeGStorable (IntPtr) -MakeGStorable (WordPtr) +MakeGStorable(IntPtr) +MakeGStorable(WordPtr) -MakeGStorable ((StablePtr a)) -MakeGStorable ((Ptr a)) -MakeGStorable ((FunPtr a)) +MakeGStorable((StablePtr a)) +MakeGStorable((Ptr a)) +MakeGStorable((FunPtr a)) -- Posix -MakeGStorable (Fd) -MakeGStorable (CRLim) -MakeGStorable (CTcflag) -MakeGStorable (CSpeed) -MakeGStorable (CCc) -MakeGStorable (CUid) -MakeGStorable (CNlink) -MakeGStorable (CGid) -MakeGStorable (CSsize) -MakeGStorable (CPid) -MakeGStorable (COff) -MakeGStorable (CMode) -MakeGStorable (CIno) -MakeGStorable (CDev) +MakeGStorable(Fd) +MakeGStorable(CRLim) +MakeGStorable(CTcflag) +MakeGStorable(CSpeed) +MakeGStorable(CCc) +MakeGStorable(CUid) +MakeGStorable(CNlink) +MakeGStorable(CGid) +MakeGStorable(CSsize) +MakeGStorable(CPid) +MakeGStorable(COff) +MakeGStorable(CMode) +MakeGStorable(CIno) +MakeGStorable(CDev) diff --git a/test/Spec/Foreign/Storable/Generic/Internal/GStorable'Spec.hs b/test/Spec/Foreign/Storable/Generic/Internal/GStorable'Spec.hs index 86f2bc0..1f07e77 100644 --- a/test/Spec/Foreign/Storable/Generic/Internal/GStorable'Spec.hs +++ b/test/Spec/Foreign/Storable/Generic/Internal/GStorable'Spec.hs @@ -1,6 +1,7 @@ {-#LANGUAGE ScopedTypeVariables #-} {-#LANGUAGE DeriveGeneric #-} {-#LANGUAGE DataKinds #-} +{-#LANGUAGE GADTs #-} module Foreign.Storable.Generic.Internal.GStorable'Spec where @@ -135,19 +136,6 @@ spec = do v1 `shouldBe` (v2_a :*: v2_b) ) - it "crashes when ix /= number of fields" $ do - property (\(GenericType (val1 :: f p)) -> do - let offsets = internalOffsets val1 - no_fields = gnumberOf' val1 - -- The bad index - bad_ix <- generate $ suchThat arbitrary (/=no_fields) - -- Poked area - ptr <- mallocBytes $ internalSizeOf val1 - -- The test - (gpeekByteOff' offsets bad_ix ptr 0 :: IO (f p)) `shouldThrow` anyException - -- Freeing the pointer - free ptr - ) describe "gpokeByteOff' " $ do it "instance M1 is equal to: gpokeByteOff' offs ix ptr off val" $ do property (\(GenericType (val :: f p)) -> do @@ -228,16 +216,3 @@ spec = do -- Check: bytes1 `shouldBe` bytes2 ) - it "crashes when ix /= number of fields" $ do - property (\(GenericType (val1 :: f p)) -> do - let offsets = internalOffsets val1 - no_fields = gnumberOf' val1 - -- The bad index - bad_ix <- generate $ suchThat arbitrary (/=no_fields) - -- Poked area - ptr <- mallocBytes $ internalSizeOf val1 - -- The test - gpokeByteOff' offsets bad_ix ptr 0 val1 `shouldThrow` anyException - -- Freeing the pointer - free ptr - ) diff --git a/test/Spec/Foreign/Storable/Generic/InternalSpec.hs b/test/Spec/Foreign/Storable/Generic/InternalSpec.hs index fc5c4e0..32cb4d3 100644 --- a/test/Spec/Foreign/Storable/Generic/InternalSpec.hs +++ b/test/Spec/Foreign/Storable/Generic/InternalSpec.hs @@ -1,6 +1,7 @@ {-#LANGUAGE ScopedTypeVariables #-} {-#LANGUAGE DeriveGeneric #-} {-#LANGUAGE DataKinds #-} +{-#LANGUAGE GADTs #-} module Foreign.Storable.Generic.InternalSpec where