erlbox 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ pkg
2
+ tmp
3
+ doc
4
+ coverage
5
+ *.tmproj
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2008 The Hive http://www.thehive.com/
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1 @@
1
+ See http://wiki.github.com/toland/erlbox for documentation.
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Erlang Toolbox: Project rakefile
4
+ ## Copyright (c) 2008 The Hive. All rights reserved.
5
+ ##
6
+ ## -------------------------------------------------------------------
7
+
8
+ require 'yaml'
9
+ require 'rake'
10
+ require 'rake/clean'
11
+
12
+ CLEAN.include 'pkg'
13
+
14
+ begin
15
+ require 'jeweler'
16
+
17
+ module Git
18
+ class Lib
19
+ def tag(tag)
20
+ # Force an annotated tag
21
+ command('tag', [tag, '-a', '-m', tag])
22
+ end
23
+ end
24
+ end
25
+
26
+ Jeweler::Tasks.new do |s|
27
+ s.name = 'erlbox'
28
+ s.platform = Gem::Platform::RUBY
29
+ s.author = 'Phillip Toland'
30
+ s.email = 'phil.toland@gmail.com'
31
+ s.homepage = 'http://github.com/toland/erlbox'
32
+ s.summary = 'Erlang Toolbox'
33
+ s.description = 'Rake tasks and helper scripts for building Erlang applications.'
34
+ s.require_path = 'lib'
35
+ s.has_rdoc = false
36
+
37
+ s.rubyforge_project = 'erlbox'
38
+
39
+ s.files.include 'lib/erlbox/eunit'
40
+
41
+ # Dependencies
42
+ s.add_dependency 'rake', '>= 0.8.4'
43
+ end
44
+ rescue LoadError
45
+ puts "Jeweler not available. Install it with: sudo gem install jeweler"
46
+ end
47
+
48
+ task :default => :build
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 1
3
+ :minor: 5
4
+ :patch: 1
data/bin/erlbox ADDED
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env ruby -w
2
+ # -*- ruby -*-
3
+ # Copyright (c) 2009 The Hive http://www.thehive.com/
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ #
23
+
24
+ require 'yaml'
25
+ require 'uri'
26
+
27
+ def erl_root(location = nil)
28
+ cmd = "erl -noshell -eval 'io:format(\"~s\\n\", [code:root_dir()]).' -s erlang halt"
29
+ if location
30
+ cmd = File.join(location, "bin", cmd)
31
+ end
32
+ `#{cmd}`
33
+ end
34
+
35
+ def load_yaml(file)
36
+ filename = File.expand_path(file)
37
+ return nil if not File.exist?(filename)
38
+ YAML::load(File.read(filename))
39
+ end
40
+
41
+ def load_config()
42
+ # Check for existence of the config file -- we MUST have one
43
+ config = load_yaml("~/.erlbox.yaml")
44
+
45
+ # Load the file and make sure required parameters are present
46
+ if config.nil? || config.empty?
47
+ puts "~/.erlbox.yaml does not exist or is empty; basic config required!"
48
+ exit 1
49
+ end
50
+
51
+ # Fix up default repo URL
52
+ if config.has_key?('default_repo')
53
+ url = URI(config['default_repo'])
54
+ if url.scheme == nil or url.scheme == "file":
55
+ config['defaut_repo'] = File.expand_path(url.path)
56
+ end
57
+ end
58
+
59
+ # If erlang repo is specified, expand the path and use that to determine the root
60
+ if config.has_key?('erlang')
61
+ config['erlang_root'] = erl_root(File.expand_path(config['erlang'])).strip()
62
+ else
63
+ config['erlang_root'] = erl_root().strip()
64
+ end
65
+
66
+ if !config.has_key?('site_dir')
67
+ config['site_dir'] = File.join(config['erlang_root'], "lib")
68
+ end
69
+
70
+ config
71
+ end
72
+
73
+ def download_app(appname, appurl)
74
+ # Work directory will be /tmp/erlbox.<pid>
75
+ tmpdir = "/tmp/erlbox_#{appname}.#{Process.pid}"
76
+
77
+ # Clone the desired url using GIT
78
+ # TODO: Support alternative systems
79
+ cmd = "git clone #{appurl} #{tmpdir}/"
80
+ puts cmd
81
+ system cmd
82
+ if $? != 0
83
+ exit 1
84
+ end
85
+
86
+ # Handle git submodules
87
+ if File.exist?("#{tmpdir}/.gitmodules")
88
+ system "(cd #{tmpdir} && git submodule update --init)"
89
+ end
90
+
91
+ # Return the tmp directory path
92
+ puts tmpdir
93
+ tmpdir
94
+ end
95
+
96
+ def cleanup(workdir, is_temp)
97
+ # clean up
98
+ puts "Cleaning up..."
99
+ FileUtils.rm_rf workdir if is_temp
100
+ end
101
+
102
+ def install_deps(workdir, appname = nil, stack = [])
103
+ # Process any dependencies in workdir/erlbox.yaml
104
+ app_config = load_yaml("#{workdir}/erlbox.yaml")
105
+ unless app_config.nil? || app_config.empty?
106
+ deps = app_config['dependencies'] || []
107
+ deps.each do |dep|
108
+ install_app(dep, stack << appname)
109
+ end
110
+ end
111
+ end
112
+
113
+ def install_app(appname, stack = [])
114
+ # Check for a dependency cycle
115
+ if stack.include?(appname)
116
+ puts "#{appname} already scheduled for installation"
117
+ return
118
+ end
119
+
120
+ # Default workdir is current working directory -- examination of appname may
121
+ # override this.
122
+ workdir = ""
123
+ is_temp = false
124
+
125
+ if appname.nil? || appname.empty?
126
+ # Appname was not specified -- we'll try to use the current directory
127
+ workdir = Dir.getwd
128
+ else
129
+ # Parse appname as URI
130
+ appname_uri = URI.parse(appname)
131
+ if appname_uri.scheme == nil or appname_uri.scheme == "file"
132
+ # Expand the file path -- however, it may not match anything local; in that
133
+ # case, prepend the default URL for git repos and try to get it from there.
134
+ appname_path = File.expand_path(appname_uri.path)
135
+ if File.directory?(appname_path)
136
+ workdir = appname_path
137
+ else
138
+ workdir = download_app(appname, File.join(CONFIG['default_repo'], appname))
139
+ is_temp = true
140
+ end
141
+ else
142
+ # Appname is a proper URL -- we'll pass this to git
143
+ workdir = download_app(appname, appname)
144
+ is_temp = true
145
+ end
146
+ end
147
+
148
+ # Now check the work directory for a Rakefile
149
+ if !File.exist?(File.join(workdir, "Rakefile"))
150
+ puts "No Rakefile available for #{appname} in #{workdir}; can't install this app!"
151
+ exit 1
152
+ end
153
+
154
+ appid = `(cd #{workdir} && rake --silent install:appid[#{CONFIG['erlang_root']}])`.strip
155
+ install_dir = File.join(CONFIG['site_dir'], appid)
156
+
157
+ # Check that the target directory doesn't already exist -- bail if it does
158
+ if File.directory?(install_dir)
159
+ puts "#{appid} is already installed...skipping"
160
+ cleanup(workdir, is_temp)
161
+ return
162
+ end
163
+
164
+ install_deps(workdir, appname, stack)
165
+
166
+ # Tell the app to build itself and install in the provided site directory
167
+ # TODO: Handle downloads of pre-built stuff
168
+
169
+ # Run the prepare task in a separate rake process so that computed
170
+ # dependencies will work out right
171
+ system "(cd #{workdir} && rake --silent install:prepare)"
172
+ system "(cd #{workdir} && rake --silent install:build)"
173
+
174
+ if $? == 0
175
+ puts "Installing to #{install_dir}..."
176
+ FileUtils.mkdir install_dir
177
+ FileUtils.cp_r "#{workdir}/ebin", install_dir
178
+ FileUtils.cp_r "#{workdir}/src", install_dir
179
+ FileUtils.cp_r "#{workdir}/include", install_dir if File.exist?("#{workdir}/include")
180
+ FileUtils.cp_r "#{workdir}/priv", install_dir if File.exist?("#{workdir}/priv")
181
+ FileUtils.cp_r "#{workdir}/mibs", install_dir if File.exist?("#{workdir}/mibs")
182
+
183
+ puts "Install successful..."
184
+ cleanup(workdir, is_temp)
185
+ else
186
+ puts "Rake failed! Build files are in '#{workdir}'."
187
+ end
188
+ end
189
+
190
+ CONFIG = load_config()
191
+
192
+ action = ARGV[0]
193
+ case action
194
+ when 'install'
195
+ install_app(ARGV[1])
196
+ when 'cleanup'
197
+ FileUtils.rm_rf Dir.glob("/tmp/erlbox_*")
198
+ when 'ensure'
199
+ install_deps(Dir.getwd())
200
+ else
201
+ puts "Usage: erlbox install ..."
202
+ end
data/erlbox.gemspec ADDED
@@ -0,0 +1,61 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{erlbox}
5
+ s.version = "1.5.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Phillip Toland"]
9
+ s.date = %q{2009-06-22}
10
+ s.default_executable = %q{erlbox}
11
+ s.description = %q{Rake tasks and helper scripts for building Erlang applications.}
12
+ s.email = %q{phil.toland@gmail.com}
13
+ s.executables = ["erlbox"]
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.txt"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "LICENSE",
21
+ "README.txt",
22
+ "Rakefile",
23
+ "VERSION.yml",
24
+ "bin/erlbox",
25
+ "erlbox.gemspec",
26
+ "lib/erlbox.rb",
27
+ "lib/erlbox/build.rb",
28
+ "lib/erlbox/dialyzer.rb",
29
+ "lib/erlbox/driver.rb",
30
+ "lib/erlbox/edoc.rb",
31
+ "lib/erlbox/eunit",
32
+ "lib/erlbox/eunit",
33
+ "lib/erlbox/eunit.rb",
34
+ "lib/erlbox/faxien.rb",
35
+ "lib/erlbox/install.rb",
36
+ "lib/erlbox/recurse.rb",
37
+ "lib/erlbox/release.rb",
38
+ "lib/erlbox/snmp.rb",
39
+ "lib/erlbox/test.rb",
40
+ "lib/erlbox/utils.rb"
41
+ ]
42
+ s.homepage = %q{http://github.com/toland/erlbox}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubyforge_project = %q{erlbox}
46
+ s.rubygems_version = %q{1.3.2}
47
+ s.summary = %q{Erlang Toolbox}
48
+
49
+ if s.respond_to? :specification_version then
50
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
51
+ s.specification_version = 3
52
+
53
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
54
+ s.add_runtime_dependency(%q<rake>, [">= 0.8.4"])
55
+ else
56
+ s.add_dependency(%q<rake>, [">= 0.8.4"])
57
+ end
58
+ else
59
+ s.add_dependency(%q<rake>, [">= 0.8.4"])
60
+ end
61
+ end
@@ -0,0 +1,99 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Erlang Toolbox: Included tasks for building Erlang sources
4
+ ## Copyright (c) 2008 The Hive http://www.thehive.com/
5
+ ##
6
+ ## Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ ## of this software and associated documentation files (the "Software"), to deal
8
+ ## in the Software without restriction, including without limitation the rights
9
+ ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ ## copies of the Software, and to permit persons to whom the Software is
11
+ ## furnished to do so, subject to the following conditions:
12
+ ##
13
+ ## The above copyright notice and this permission notice shall be included in
14
+ ## all copies or substantial portions of the Software.
15
+ ##
16
+ ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ ## THE SOFTWARE.
23
+ ##
24
+ ## -------------------------------------------------------------------
25
+
26
+ puts "WARNING: Debugging is enabled." if debug?
27
+
28
+ ## -------------------------------------------------------------------
29
+ ## Constants
30
+
31
+ PWD = Dir.getwd
32
+
33
+ ERL_SRC = FileList['src/**/*.erl']
34
+ ERL_BEAM = ERL_SRC.pathmap("%{src,ebin}X.beam")
35
+ ERL_PATH = FileList.new
36
+ APP_FILE = FileList["#{PWD}/ebin/*.app"][0]
37
+ APP_NAME = File.basename(APP_FILE, ".app")
38
+
39
+ unless APP_FILE && File.exists?(APP_FILE)
40
+ fail "ERROR: No app file found."
41
+ end
42
+
43
+ ERL_INCLUDE = "./include"
44
+ ERLC_FLAGS = %W( -I#{ERL_INCLUDE} -W )
45
+ ERLC_FLAGS << '+debug_info' if debug?
46
+
47
+ CLEAN.include %w( **/*.beam **/erl_crash.dump )
48
+
49
+ ## -------------------------------------------------------------------
50
+ ## Rules
51
+
52
+ directory 'ebin'
53
+
54
+ rule(%r(^ebin/.*\.beam$) => ["%{ebin,src}X.erl"]) do |t|
55
+ puts "compiling #{t.source}..."
56
+ sh "erlc #{print_flags(ERLC_FLAGS)} #{expand_path(ERL_PATH)} -o ebin #{t.source}"
57
+ end
58
+
59
+ ## -------------------------------------------------------------------
60
+ ## Tasks
61
+
62
+ namespace :build do
63
+
64
+ desc "Verify that all application modules are listed in the app file"
65
+ task :validate_app do
66
+ # Setup app name and build sets of modules from the .app as well as
67
+ # beams that got compiled
68
+ modules = Set.new(erl_app_modules(APP_NAME))
69
+ beams = Set.new(ERL_BEAM.pathmap("%n").to_a)
70
+
71
+ puts "validating #{APP_NAME}.app..."
72
+
73
+ # Identify .beam files which are listed in the .app, but not present in ebin/
74
+ missing_beams = (modules - beams)
75
+ if not missing_beams.empty?
76
+ msg = "One or more modules listed in #{APP_NAME}.app do not exist as .beam:\n"
77
+ missing_beams.each { |m| msg << " * #{m}\n" }
78
+ fail msg
79
+ end
80
+
81
+ # Identify modules which are not listed in the .app, but are present in ebin/
82
+ missing_modules = (beams - modules)
83
+ if not missing_modules.empty?
84
+ msg = "One or more .beam files exist that are not listed in #{APP_NAME}.app:\n"
85
+ missing_modules.each { |m| msg << " * #{m}\n" }
86
+ fail msg
87
+ end
88
+ end
89
+
90
+ desc "Compile Erlang sources to .beam files"
91
+ task :compile => ['ebin'] + ERL_BEAM + [:validate_app]
92
+
93
+ desc "Do a fresh build from scratch"
94
+ task :rebuild => [:clean, :compile]
95
+
96
+ end
97
+
98
+ task :compile => 'build:compile'
99
+ task :default => [:compile]
@@ -0,0 +1,81 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Erlang Toolbox: Included tasks for running Dialyzer
4
+ ## Copyright (c) 2008 The Hive http://www.thehive.com/
5
+ ##
6
+ ## Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ ## of this software and associated documentation files (the "Software"), to deal
8
+ ## in the Software without restriction, including without limitation the rights
9
+ ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ ## copies of the Software, and to permit persons to whom the Software is
11
+ ## furnished to do so, subject to the following conditions:
12
+ ##
13
+ ## The above copyright notice and this permission notice shall be included in
14
+ ## all copies or substantial portions of the Software.
15
+ ##
16
+ ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ ## THE SOFTWARE.
23
+ ##
24
+ ## -------------------------------------------------------------------
25
+ require 'pathname'
26
+
27
+ ## -------------------------------------------------------------------
28
+ ## Constants
29
+
30
+ PLT_LIBS = %w( kernel stdlib )
31
+ PLT_FILE = "#{ENV['HOME']}/.dialyzer_plt"
32
+
33
+ CLEAN.include 'dialyzer.log'
34
+
35
+ ## -------------------------------------------------------------------
36
+ ## Rules
37
+
38
+ rule PLT_FILE do
39
+ puts "generating base PLT file..."
40
+ `dialyzer --build_plt -r #{erl_where('kernel', 'ebin')} --plt #{PLT_FILE}`
41
+ end
42
+
43
+ ## -------------------------------------------------------------------
44
+ ## Tasks
45
+
46
+ namespace :dialyzer do
47
+
48
+ desc "Update your PLT file with the libraries required by this application"
49
+ task :update_plt => PLT_FILE do
50
+ PLT_LIBS.each do |lib|
51
+ puts "adding #{lib} to plt..."
52
+ `dialyzer --add_to_plt -r #{erl_where(lib, 'ebin')} --plt #{PLT_FILE}`
53
+ end
54
+
55
+ ERL_PATH.each do |app_path|
56
+ path = abspath(app_path)
57
+ puts "adding #{path} to plt..."
58
+ `dialyzer --add_to_plt -r #{path} --plt #{PLT_FILE}`
59
+ end
60
+ end
61
+
62
+ task :prepare do
63
+ ERLC_FLAGS << '+debug_info'
64
+ end
65
+
66
+ desc "Run Dialyzer on the compiled beam files"
67
+ task :run => [:prepare] + ERL_BEAM do
68
+ warnings = ENV['WARN']
69
+ if !warnings.nil? && !warnings.empty?
70
+ warn_opts = ' -W' + warnings.split(',').join(' -W')
71
+ else
72
+ warn_opts = ''
73
+ end
74
+
75
+ sh "dialyzer -Iinclude -r ebin --plt #{PLT_FILE}\
76
+ -Werror_handling -Wunmatched_returns #{warn_opts} | tee dialyzer.log"
77
+ end
78
+
79
+ end
80
+
81
+ task :dialyzer => 'dialyzer:run'
@@ -0,0 +1,98 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Erlang Toolbox: Optional tasks for building C extensions
4
+ ## Copyright (c) 2008 The Hive http://www.thehive.com/
5
+ ##
6
+ ## Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ ## of this software and associated documentation files (the "Software"), to deal
8
+ ## in the Software without restriction, including without limitation the rights
9
+ ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ ## copies of the Software, and to permit persons to whom the Software is
11
+ ## furnished to do so, subject to the following conditions:
12
+ ##
13
+ ## The above copyright notice and this permission notice shall be included in
14
+ ## all copies or substantial portions of the Software.
15
+ ##
16
+ ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ ## THE SOFTWARE.
23
+ ##
24
+ ## -------------------------------------------------------------------
25
+
26
+ if !defined?(APP_NAME)
27
+ fail "You must require 'erlbox' before requiring this file"
28
+ end
29
+
30
+ ## -------------------------------------------------------------------
31
+ ## Helpers
32
+
33
+ def dflag()
34
+ debug? ? "-DDEBUG" : ""
35
+ end
36
+
37
+ def erts_dir()
38
+ script = <<-ERL
39
+ io:format("~s\n", [lists:concat([code:root_dir(), "/erts-", erlang:system_info(version)])])
40
+ ERL
41
+ erl_run(script)
42
+ end
43
+
44
+ def ei_dir()
45
+ script = <<-ERL
46
+ io:format("~s\n", [code:lib_dir(erl_interface)])
47
+ ERL
48
+ erl_run(script)
49
+ end
50
+
51
+ def erts_link_cflags()
52
+ if darwin?
53
+ %w(-bundle -flat_namespace -undefined suppress)
54
+ else
55
+ %w(-shared)
56
+ end
57
+ end
58
+
59
+ ## -------------------------------------------------------------------
60
+ ## Constants
61
+
62
+ SRC_DIR = 'c_src'
63
+ C_SRCS = FileList["#{SRC_DIR}/*.c"]
64
+ C_OBJS = C_SRCS.pathmap("%X.o")
65
+
66
+ DRV_DIR = 'priv'
67
+ DRIVER = "#{DRV_DIR}/#{APP_NAME}_drv.so"
68
+
69
+ CC_FLAGS = %W(-g -c -Wall -fPIC -fno-common #{dflag()} -I#{SRC_DIR} -I#{erts_dir()}/include -I#{ei_dir()}/include)
70
+ LD_FLAGS = erts_link_cflags()
71
+ EI_LIBS = %W(-L#{ei_dir()}/lib -lerl_interface -lei)
72
+ LD_LIBS = EI_LIBS
73
+
74
+ CLEAN.include %W( #{SRC_DIR}/*.o #{DRV_DIR}/*.so )
75
+
76
+ ## -------------------------------------------------------------------
77
+ ## Rules
78
+
79
+ directory SRC_DIR
80
+ directory DRV_DIR
81
+
82
+ rule '.o' => ['.c'] do |t|
83
+ puts "compiling #{t.source}..."
84
+ sh "gcc #{print_flags(CC_FLAGS)} #{t.source} -o #{t.name}", :verbose => verbose?
85
+ end
86
+
87
+ file DRIVER => [SRC_DIR, DRV_DIR] + C_OBJS do
88
+ puts "linking #{DRIVER}..."
89
+ sh "gcc -g #{print_flags(LD_FLAGS)} #{C_OBJS.join(' ')} #{print_flags(LD_LIBS)} -o #{DRIVER}", :verbose => verbose?
90
+ end
91
+
92
+ ## -------------------------------------------------------------------
93
+ ## Tasks
94
+
95
+ desc "Compile and link the C port driver"
96
+ task :driver => DRIVER
97
+
98
+ task :compile => :driver
@@ -0,0 +1,43 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Erlang Toolbox: Included tasks for building edoc documentation
4
+ ## Copyright (c) 2008 The Hive http://www.thehive.com/
5
+ ##
6
+ ## Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ ## of this software and associated documentation files (the "Software"), to deal
8
+ ## in the Software without restriction, including without limitation the rights
9
+ ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ ## copies of the Software, and to permit persons to whom the Software is
11
+ ## furnished to do so, subject to the following conditions:
12
+ ##
13
+ ## The above copyright notice and this permission notice shall be included in
14
+ ## all copies or substantial portions of the Software.
15
+ ##
16
+ ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ ## THE SOFTWARE.
23
+ ##
24
+ ## -------------------------------------------------------------------
25
+
26
+ ## -------------------------------------------------------------------
27
+ ## Constants
28
+
29
+ CLOBBER.include 'doc'
30
+
31
+ ## -------------------------------------------------------------------
32
+ ## Tasks
33
+
34
+ namespace :edoc do
35
+
36
+ desc "Generate Edoc documentation"
37
+ task :run do
38
+ sh %Q(erl -noshell -run edoc_run application #{APP_NAME} '"."' "[]" -s init stop)
39
+ end
40
+
41
+ end
42
+
43
+ task :edoc => 'edoc:run'