rattle-0.2: test/Test/Example/FSATrace.hs
-- | Try replicating the build scripts of fsatrace from:
-- https://github.com/jacereda/fsatrace/blob/master/Makefile
-- (note the two unix.mk and win.mk files)
--
-- We don't deal with the 32bit Windows build since our CI doesn't have a 32bit compiler
module Test.Example.FSATrace(main) where
import System.Info.Extra
import Development.Rattle
import Development.Shake.FilePath
import Test.Type
main :: IO ()
main = testGit "https://github.com/jacereda/fsatrace" $ do
let plat = if isWindows then "win" else "unix"
let srcs = ["src/fsatrace.c", "src/"++plat++"/proc.c", "src/"++plat++"/shm.c"] ++
if isWindows then ["src/win/inject.c","src/win/dbg.c"] else []
let sosrcs = ["src/unix/fsatraceso.c","src/emit.c","src/unix/shm.c","src/unix/proc.c"]
let dllsrcs = map ("src/win/" ++) (words "fsatracedll.c inject.c patch.c hooks.c shm.c handle.c utf8.c dbg.c") ++ ["src/emit.c"]
let cflags = "-g -std=c99 -Wall -O2 -fomit-frame-pointer -fno-stack-protector -MMD -DIS32=0"
let cppflags | isWindows = "-D_WIN32_WINNT=0x600 -isysteminclude/ddk"
| otherwise = "-D_GNU_SOURCE -D_DEFAULT_SOURCE=1"
let ldflags = [] :: [String]
let ldlibs = if isWindows then "-lntdll -lpsapi" else "-ldl -lrt"
let ldobjs = ["CRT_noglob.o" | isWindows && False]
forP_ (srcs ++ if isWindows then dllsrcs else sosrcs) $ \x ->
cmd "gcc -c" ["-fPIC" | not isWindows] cppflags cflags x "-o" (x -<.> "o")
let os = map (-<.> "o")
-- we use the leading _'s on fsatrace stuff so it doesn't conflict with the version
-- we are using to do tracing ourselves
if isWindows then
cmd "gcc -shared" ldflags (os dllsrcs) "-o _fsatrace64.dll" ldlibs
else
cmd "gcc -shared" ldflags (os sosrcs) "-o _fsatrace.so" ldlibs
cmd "gcc" ldflags ldobjs (os srcs) ldlibs "-o" ("_fsatrace" <.> exe)