forked from tweag/rules_haskell
-
Notifications
You must be signed in to change notification settings - Fork 0
/
start
executable file
·136 lines (109 loc) · 3.46 KB
/
start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/sh
MIN_BAZEL_MAJOR=0
MIN_BAZEL_MINOR=21
set -e
check_files_dont_exist () {
if [ -e WORKSPACE ] || [ -e BUILD ] || [ -e BazelExample.hs ]
then
echo "Current directory already has WORKSPACE and/or BUILD and/or BazelExample.hs files." >/dev/stderr
exit 1
fi
}
check_bazel_version () {
local actual_raw=$(bazel version | egrep '^Build label:' | egrep -o '[0-9.]+')
IFS=. read actual_major actual_minor actual_patch <<EOF
$actual_raw
EOF
local expected=$MIN_BAZEL_MAJOR.$MIN_BAZEL_MINOR.0
local cmp=$expected'\n'$actual
if ! ( [ "$actual_major" -gt "$MIN_BAZEL_MAJOR" ] || (
[ "$actual_major" -eq "$MIN_BAZEL_MAJOR" ] &&
[ "$actual_minor" -ge "$MIN_BAZEL_MINOR" ] ) )
then
echo "Need at least Bazel v${expected}. v${actual_raw} detected." >/dev/stderr
exit 1
fi
}
check_files_dont_exist
check_bazel_version
cat > WORKSPACE <<"EOF"
# Give your project a name. :)
workspace(name = "YOUR_PROJECT_NAME_HERE")
# Load the repository rule to download an http archive.
load(
"@bazel_tools//tools/build_defs/repo:http.bzl",
"http_archive"
)
# Download `rules_haskell`.
# and make it accessible `@io_tweag_rules_haskell`.
http_archive(
name = "io_tweag_rules_haskell",
strip_prefix = "rules_haskell-master",
urls = ["https://github.com/tweag/rules_haskell/archive/master.tar.gz"],
# sha256 = "431d492a8ee6a110cdf42496181c9d27225dfb997379e64a148eb8e69f272ab7",
)
# TODO: get rid the `rules_nixpkgs` repository dependency for bindists
# https://github.com/tweag/rules_haskell/issues/715
rules_nixpkgs_version = "0.5.2"
http_archive(
name = "io_tweag_rules_nixpkgs",
sha256 = "5a384daa57b49abf9f0b672852f1a66a3c52aecf9d4d2ac64f6de0fd307690c8",
strip_prefix = "rules_nixpkgs-%s" % rules_nixpkgs_version,
urls = ["https://github.com/tweag/rules_nixpkgs/archive/v%s.tar.gz" % rules_nixpkgs_version],
)
load(
"@io_tweag_rules_haskell//haskell:repositories.bzl",
"haskell_repositories"
)
# `haskell_repositories()` sets up all bazel dependencies
# required by `rules_haskell`.
haskell_repositories()
load(
"@io_tweag_rules_haskell//haskell:haskell.bzl",
"haskell_register_ghc_bindists",
)
# Registers a haskell toolchain with a GHC binary
# downloaded from haskell.org.
haskell_register_ghc_bindists(version = "8.6.3")
EOF
cat > BUILD.bazel <<"EOF"
# Set all target’s visibility in this package to "public".
package(default_visibility = ["//visibility:public"])
# Load `rules_haskell` rules.
load(
"@io_tweag_rules_haskell//haskell:haskell.bzl",
"haskell_toolchain",
"haskell_import",
"haskell_library",
"haskell_binary",
)
# `haskell_import` can access builtin GHC packages
# and assign them a bazel target name, so that they
# can be referenced as dependencies.
haskell_import(name = "base")
# You can add your own libraries with `haskell_library`.
# haskell_library(
# name = "MY_LIBRARY_NAME",
# src_strip_prefix = "src",
# srcs = glob(['src/**/*.hs']),
# deps = [
# "base_pkg"
# ],
# )
# An example binary using the Prelude module from the
# GHC base package, to print the hello world.
haskell_binary(
name = "example",
srcs = [":Example.hs"],
deps = [":base"],
)
EOF
cat > Example.hs <<"EOF"
module Main where
import Prelude (putStrLn)
main = putStrLn "Hello from rules_haskell!"
EOF
cat <<"EOF"
WORKSPACE and initial BUILD files created. To run Bazel and build the example:
$ bazel run //:example
EOF