import Distribution.Simple
import Distribution.Simple.Program
import Distribution.Simple.Setup
import Distribution.Simple.LocalBuildInfo
import Distribution.Verbosity
import Distribution.PackageDescription
import Distribution.Text
import Distribution.System
import System.Directory (doesFileExist)
main :: IO ()
main = defaultMainWithHooks dshHooks
dshHooks :: UserHooks
dshHooks = simpleUserHooks {
preConf = dshPreConf
, preBuild = dshPreBuild
, postBuild = dshPostBuild
}
dshPreConf :: Args -> ConfigFlags -> IO HookedBuildInfo
dshPreConf args flags = do
db <- configureAllKnownPrograms silent defaultProgramConfiguration
_ <- requireProgram verbose (simpleProgram "sh") db
_ <- requireProgram verbose (simpleProgram "rm") db
_ <- requireProgram verbose (simpleProgram "cp") db
_ <- requireProgram verbose (simpleProgram "tar") db
_ <- requireProgram verbose (simpleProgram "pwd") db
_ <- requireProgram verbose (simpleProgram "make") db
_ <- requireProgram verbose (simpleProgram "ar") db
_ <- requireProgram verbose (simpleProgram "ld") db
(preConf simpleUserHooks) args flags
dshPreBuild :: Args -> BuildFlags -> IO HookedBuildInfo
dshPreBuild args flags = do
db <- configureAllKnownPrograms silent defaultProgramConfiguration
(sh,_) <- requireProgram verbose (simpleProgram "sh") db
let cflags = case buildArch of
I386 -> "-m32"
X86_64 -> "-m64"
PPC -> "-m32"
PPC64 -> "-m64"
Sparc -> "-m64"
Arm -> "-m32"
Mips -> "-m64"
SH -> "-m32"
IA64 -> "-m64"
S390 -> "-m32"
Alpha -> "-m64"
Hppa -> "-m64"
Rs6000 -> "-m64"
M68k -> "-m32"
Vax -> "-m32"
_ -> ""
let script = [ "rm -r -f pathfinder"
, "tar xzf pathfinder.tar.gz"
, "cd pathfinder"
, "export CFLAGS=' " ++ cflags ++ " -fno-jump-tables -fPIC '"
, "sh configure --prefix=`pwd` --enable-static --disable-shared"
, "make"
, "make install"
, "cd lib"
, "ar x libpf_ferry.a"
, "ld -r *.o -o CC_Pathfinder.o"
]
writeFile "pathfinder_pre_build.sh" (unlines script)
runProgramInvocation verbose (programInvocation sh ["pathfinder_pre_build.sh"])
(preBuild simpleUserHooks) args flags
dshPostBuild :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
dshPostBuild args flags desc info = do
(postBuild simpleUserHooks) args flags desc info
let dshBuildDir = buildDir info
let dshVersion = display (pkgVersion (package desc))
db <- configureAllKnownPrograms silent defaultProgramConfiguration
(sh,_) <- requireProgram verbose (simpleProgram "sh") db
pb <- doesFileExist (dshBuildDir ++ "/libHSPathfinder-" ++ dshVersion ++ "_p.a")
let script = [ "ar -r -s "
++ dshBuildDir ++ "/libHSPathfinder-" ++ dshVersion ++ ".a "
++ " pathfinder/lib/CC_Pathfinder.o "
, if pb
then "ar -r -s "
++ dshBuildDir ++ "/libHSPathfinder-" ++ dshVersion ++ "_p.a "
++ " pathfinder/lib/CC_Pathfinder.o "
else []
, "cp "
++ dshBuildDir ++ "/HSPathfinder-" ++ dshVersion ++ ".o "
++ "pathfinder/lib/HS_Pathfinder.o"
, "ld -x -r -o "
++ dshBuildDir ++ "/HSPathfinder-" ++ dshVersion ++ ".o "
++ " pathfinder/lib/HS_Pathfinder.o "
++ " pathfinder/lib/CC_Pathfinder.o "
]
writeFile "pathfinder_post_build.sh" (unlines script)
runProgramInvocation verbose (programInvocation sh ["pathfinder_post_build.sh"])