diff options
author | pacien | 2021-06-29 13:14:14 +0200 |
---|---|---|
committer | pacien | 2021-06-29 13:14:14 +0200 |
commit | 671a372d87ff8311956f9158e8885ffc254fe1bc (patch) | |
tree | 67283cf21bc4e1264587633199d523ff372cbe4f | |
parent | 622af23bb3ce8d6dc8dc1d658cb7f01bc905ef2c (diff) | |
download | ldgallery-671a372d87ff8311956f9158e8885ffc254fe1bc.tar.gz |
compiler: add "portable" target
This adds a build flag for generating a portable version of the compiler
binary which make it look in its own runtime directory for its assets.
This is useful in particular for the portable release tarballs which
contain the web viewer at the same location instead of a pre-defined one
in the FHS.
GitHub: closes #286
-rw-r--r-- | compiler/app/Main.hs | 29 | ||||
-rw-r--r-- | compiler/app/ViewerDist.hs | 39 | ||||
-rw-r--r-- | compiler/package.yaml | 14 |
3 files changed, 65 insertions, 17 deletions
diff --git a/compiler/app/Main.hs b/compiler/app/Main.hs index dc97b38..3e6f254 100644 --- a/compiler/app/Main.hs +++ b/compiler/app/Main.hs | |||
@@ -19,7 +19,7 @@ | |||
19 | module Main where | 19 | module Main where |
20 | 20 | ||
21 | import GHC.Generics (Generic) | 21 | import GHC.Generics (Generic) |
22 | import Paths_ldgallery_compiler (version, getDataFileName) | 22 | import Paths_ldgallery_compiler (version) |
23 | import Control.Monad (when) | 23 | import Control.Monad (when) |
24 | import Data.Functor ((<&>)) | 24 | import Data.Functor ((<&>)) |
25 | import Data.Maybe (isJust) | 25 | import Data.Maybe (isJust) |
@@ -31,7 +31,7 @@ import System.Console.CmdArgs | |||
31 | 31 | ||
32 | import Compiler | 32 | import Compiler |
33 | import Files (readDirectory, copyTo, remove) | 33 | import Files (readDirectory, copyTo, remove) |
34 | 34 | import ViewerDist (viewerDistPath) | |
35 | 35 | ||
36 | newtype ViewerConfig = ViewerConfig | 36 | newtype ViewerConfig = ViewerConfig |
37 | { galleryRoot :: String | 37 | { galleryRoot :: String |
@@ -106,10 +106,7 @@ main = | |||
106 | do | 106 | do |
107 | opts <- cmdArgs options | 107 | opts <- cmdArgs options |
108 | buildGallery opts | 108 | buildGallery opts |
109 | 109 | deployViewer opts | |
110 | when (isJust $ withViewer opts) $ do | ||
111 | viewerDist <- viewerDistPath $ withViewer opts | ||
112 | deployViewer viewerDist opts | ||
113 | 110 | ||
114 | where | 111 | where |
115 | gallerySubdir :: String | 112 | gallerySubdir :: String |
@@ -118,11 +115,6 @@ main = | |||
118 | viewerConfig :: ViewerConfig | 115 | viewerConfig :: ViewerConfig |
119 | viewerConfig = ViewerConfig (gallerySubdir ++ "/") | 116 | viewerConfig = ViewerConfig (gallerySubdir ++ "/") |
120 | 117 | ||
121 | viewerDistPath :: Maybe FilePath -> IO FilePath | ||
122 | viewerDistPath (Just "") = getDataFileName "viewer" | ||
123 | viewerDistPath (Just dist) = return dist | ||
124 | viewerDistPath Nothing = fail "No viewer distribution" | ||
125 | |||
126 | buildGallery :: Options -> IO () | 118 | buildGallery :: Options -> IO () |
127 | buildGallery opts = | 119 | buildGallery opts = |
128 | checkDistinctPaths (inputDir opts) (outputDir opts) | 120 | checkDistinctPaths (inputDir opts) (outputDir opts) |
@@ -146,10 +138,11 @@ main = | |||
146 | | isJust withViewer = outputDir </> gallerySubdir | 138 | | isJust withViewer = outputDir </> gallerySubdir |
147 | | otherwise = outputDir | 139 | | otherwise = outputDir |
148 | 140 | ||
149 | deployViewer :: FilePath -> Options -> IO () | 141 | deployViewer :: Options -> IO () |
150 | deployViewer distPath Options{outputDir, cleanOutput} = | 142 | deployViewer Options{withViewer = Nothing} = pure () |
143 | deployViewer Options{withViewer = Just viewerPath, outputDir, cleanOutput} = | ||
151 | when cleanOutput (cleanViewerDir outputDir) | 144 | when cleanOutput (cleanViewerDir outputDir) |
152 | >> copyViewer distPath outputDir | 145 | >> viewerDistOr viewerPath >>= deployTo outputDir |
153 | >> writeJSON (outputDir </> "config.json") viewerConfig | 146 | >> writeJSON (outputDir </> "config.json") viewerConfig |
154 | 147 | ||
155 | where | 148 | where |
@@ -159,8 +152,12 @@ main = | |||
159 | <&> filter (/= gallerySubdir) | 152 | <&> filter (/= gallerySubdir) |
160 | >>= mapM_ (remove . (target </>)) | 153 | >>= mapM_ (remove . (target </>)) |
161 | 154 | ||
162 | copyViewer :: FilePath -> FilePath -> IO () | 155 | viewerDistOr :: FilePath -> IO FilePath |
163 | copyViewer dist target = | 156 | viewerDistOr "" = viewerDistPath |
157 | viewerDistOr custom = pure custom | ||
158 | |||
159 | deployTo :: FilePath -> FilePath -> IO () | ||
160 | deployTo target dist = | ||
164 | putStrLn "Copying viewer webapp" | 161 | putStrLn "Copying viewer webapp" |
165 | >> readDirectory dist | 162 | >> readDirectory dist |
166 | >>= copyTo target | 163 | >>= copyTo target |
diff --git a/compiler/app/ViewerDist.hs b/compiler/app/ViewerDist.hs new file mode 100644 index 0000000..2b80ffc --- /dev/null +++ b/compiler/app/ViewerDist.hs | |||
@@ -0,0 +1,39 @@ | |||
1 | -- ldgallery - A static generator which turns a collection of tagged | ||
2 | -- pictures into a searchable web gallery. | ||
3 | -- | ||
4 | -- Copyright (C) 2021 Pacien TRAN-GIRARD | ||
5 | -- | ||
6 | -- This program is free software: you can redistribute it and/or modify | ||
7 | -- it under the terms of the GNU Affero General Public License as | ||
8 | -- published by the Free Software Foundation, either version 3 of the | ||
9 | -- License, or (at your option) any later version. | ||
10 | -- | ||
11 | -- This program is distributed in the hope that it will be useful, | ||
12 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | -- GNU Affero General Public License for more details. | ||
15 | -- | ||
16 | -- You should have received a copy of the GNU Affero General Public License | ||
17 | -- along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
18 | |||
19 | {-# LANGUAGE CPP #-} | ||
20 | |||
21 | module ViewerDist where | ||
22 | |||
23 | #ifndef FLAG_PORTABLE | ||
24 | |||
25 | import Paths_ldgallery_compiler (getDataFileName) | ||
26 | |||
27 | viewerDistPath = getDataFileName "viewer" | ||
28 | |||
29 | #else | ||
30 | |||
31 | import Data.Functor ((<&>)) | ||
32 | import System.FilePath (takeDirectory, (</>)) | ||
33 | import System.Environment (getExecutablePath) | ||
34 | |||
35 | viewerDistPath = fmap takeDirectory getExecutablePath <&> (</> "viewer") | ||
36 | |||
37 | #endif | ||
38 | |||
39 | viewerDistPath :: IO FilePath | ||
diff --git a/compiler/package.yaml b/compiler/package.yaml index faa2174..b02a40a 100644 --- a/compiler/package.yaml +++ b/compiler/package.yaml | |||
@@ -5,7 +5,7 @@ github: "pacien/ldgallery" | |||
5 | license: AGPL-3 | 5 | license: AGPL-3 |
6 | author: "Pacien TRAN-GIRARD, Guillaume FOUET" | 6 | author: "Pacien TRAN-GIRARD, Guillaume FOUET" |
7 | maintainer: "" | 7 | maintainer: "" |
8 | copyright: "2019-2020 Pacien TRAN-GIRARD, Guillaume FOUET" | 8 | copyright: "2019-2021 Pacien TRAN-GIRARD, Guillaume FOUET" |
9 | 9 | ||
10 | extra-source-files: | 10 | extra-source-files: |
11 | - readme.md | 11 | - readme.md |
@@ -54,6 +54,15 @@ data-files: ["**/*"] | |||
54 | library: | 54 | library: |
55 | source-dirs: src | 55 | source-dirs: src |
56 | 56 | ||
57 | flags: | ||
58 | portable: | ||
59 | description: > | ||
60 | Make the output binary portable. | ||
61 | It will look in its own runtime location for its assets instead of | ||
62 | absolute installation paths. | ||
63 | manual: true | ||
64 | default: false | ||
65 | |||
57 | executables: | 66 | executables: |
58 | ldgallery: | 67 | ldgallery: |
59 | main: Main.hs | 68 | main: Main.hs |
@@ -64,6 +73,9 @@ executables: | |||
64 | - -with-rtsopts=-N | 73 | - -with-rtsopts=-N |
65 | dependencies: | 74 | dependencies: |
66 | - ldgallery-compiler | 75 | - ldgallery-compiler |
76 | when: | ||
77 | - condition: flag(portable) | ||
78 | cpp-options: -DFLAG_PORTABLE | ||
67 | 79 | ||
68 | tests: | 80 | tests: |
69 | ldgallery-compiler-test: | 81 | ldgallery-compiler-test: |