-- This file is part of Qtah. -- -- Copyright 2015-2021 The Qtah Authors. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU Lesser General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public License -- along with this program. If not, see . module Graphics.UI.Qtah.Generator.Enum (installEnumCalculator) where import qualified Data.ByteString.Lazy as B import Data.Maybe (isJust) import Foreign.Hoppy.Generator.Hook ( EnumEvaluator, enumEvaluatorArgsKeepOutputsOnFailure, hookEvaluateEnums, interpretOutputToEvaluateEnums, makeCppSourceToEvaluateEnums, ) import Foreign.Hoppy.Generator.Spec (Interface, interfaceModifyHooks) import Foreign.Hoppy.Generator.Util (withTempDirectory) import Graphics.UI.Qtah.Generator.Config ( qmakeArguments, qmakeExecutable, ) import System.Directory (withCurrentDirectory) import System.FilePath (()) import System.IO (hPutStrLn, stderr) import System.Process (callProcess, readProcess) installEnumCalculator :: Interface -> Interface installEnumCalculator = interfaceModifyHooks $ \hooks -> hooks { hookEvaluateEnums = calculateEnumValues } calculateEnumValues :: EnumEvaluator calculateEnumValues args = withTempDirectory "qtahenum" removeBuildFailures $ \dir -> withCurrentDirectory dir $ do let sourceFile = "qtahenum.cpp" qmakeFile = "qtahenum.pro" B.writeFile sourceFile $ makeCppSourceToEvaluateEnums args writeFile qmakeFile $ unlines [ "# This file is generated by qtah-generator." , "" , "QT += core gui" , "greaterThan(QT_MAJOR_VERSION, 4): QT += widgets" -- Prevent separate debug/ and release/ build directories caused by this -- flag being enabled by default on Windows (see issue #50). , "CONFIG -= debug_and_release" , "CONFIG += cmdline" , "TARGET = qtahenum" , "SOURCES += " ++ sourceFile ] callProcess qmakeExecutable $ qmakeArguments ++ [qmakeFile] -- TODO This should read from a QTAH_MAKE environment variable: callProcess "make" [] out <- readProcess ("." "qtahenum") [] "" result <- case interpretOutputToEvaluateEnums args out of Left err -> do hPutStrLn stderr err return Nothing Right values -> return $ Just values let remove = False && (isJust result || removeBuildFailures) return (remove, result) where removeBuildFailures = not $ enumEvaluatorArgsKeepOutputsOnFailure args