-- | The information from Paths_shake cleaned upmoduleDevelopment.Shake.Internal.Paths(shakeVersionString ,initDataDirectory ,hasManualData ,copyManualData ,readDataFileHTML )whereimportPaths_shake importControl.ExceptionimportControl.Monad.ExtraimportData.VersionimportSystem.DirectoryimportSystem.FilePathimportSystem.Info.ExtraimportSystem.IO.UnsafeimportSystem.Environment.ExtraimportGeneral.Extra importData.FunctorimportqualifiedData.ByteString.LazyasLBSimportPreludeshakeVersionString::StringshakeVersionString =showVersionversion -- We want getDataFileName to be relative to the current directory on program startup,-- even if we issue a change directory command. Therefore, first call caches, future ones read.{-# NOINLINEdataDirs#-}dataDirs::[String]dataDirs =unsafePerformIO$dodatdir <-getDataDir exedir <-takeDirectory<$>getExecutablePath`catchIO `\_->return""curdir <-getCurrentDirectoryreturn$[datdir ]++[exedir |exedir /=""]++[curdir ]-- The data files may be located relative to the current directory, if so cache it in advanceinitDataDirectory::IO()initDataDirectory =void$evaluatedataDirs getDataFile::FilePath->IOFilePathgetDataFile file =doletposs =map(</>file )dataDirs res <-filterMdoesFileExist_ poss caseres of[]->fail$unlines$("Could not find data file "++file ++", looked in:"):map(" "++)poss x :_->returnx hasDataFile::FilePath->IOBoolhasDataFile file =anyM(\dir ->doesFileExist_ $dir </>file )dataDirs readDataFileHTML::FilePath->IOLBS.ByteStringreadDataFileHTML file =LBS.readFile=<<getDataFile ("html"</>file )manualFiles::[FilePath]manualFiles =map("docs/manual"</>)["Build.hs","main.c","constants.c","constants.h","build"<.>ifisWindowsthen"bat"else"sh"]hasManualData::IOBoolhasManualData =allMhasDataFile manualFiles copyManualData::FilePath->IO()copyManualData dest =docreateDirectoryRecursive dest forM_manualFiles $\file ->dosrc <-getDataFile file copyFilesrc (dest </>takeFileNamefile )