distil 0.10.4 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/Rakefile +2 -1
  2. data/VERSION +1 -1
  3. data/assets/distil.js +359 -0
  4. data/bin/distil +33 -10
  5. data/distil.gemspec +35 -24
  6. data/lib/distil/configurable/file-set.rb +86 -0
  7. data/lib/distil/configurable/interpolated.rb +36 -0
  8. data/lib/distil/configurable/output-path.rb +25 -0
  9. data/lib/distil/configurable/project-path.rb +25 -0
  10. data/lib/distil/configurable.rb +164 -0
  11. data/lib/distil/error-reporter.rb +63 -0
  12. data/lib/distil/product/concatenated.rb +85 -0
  13. data/lib/distil/product/css-product.rb +37 -0
  14. data/lib/distil/product/debug.rb +34 -0
  15. data/lib/distil/product/javascript-base-product.rb +35 -0
  16. data/lib/distil/product/javascript-doc-product.rb +61 -0
  17. data/lib/distil/product/javascript-product.rb +131 -0
  18. data/lib/distil/product/minified.rb +32 -0
  19. data/lib/distil/product.rb +97 -0
  20. data/lib/distil/project/distil-project.rb +99 -0
  21. data/lib/distil/project/external-project.rb +53 -0
  22. data/lib/distil/project.rb +78 -0
  23. data/lib/distil/source-file/css-file.rb +14 -0
  24. data/lib/distil/source-file/html-file.rb +14 -0
  25. data/lib/distil/source-file/javascript-file.rb +17 -0
  26. data/lib/distil/source-file/json-file.rb +16 -0
  27. data/lib/distil/source-file.rb +172 -0
  28. data/lib/distil/target.rb +235 -0
  29. data/lib/distil/task/css-dependency-task.rb +64 -0
  30. data/lib/distil/task/jsl-dependency-task.rb +49 -0
  31. data/lib/distil/task/nib-task.rb +72 -0
  32. data/lib/distil/task/validate-js-task.rb +75 -0
  33. data/lib/distil/task.rb +50 -0
  34. data/lib/distil.rb +72 -0
  35. data/lib/jsl.conf +4 -0
  36. data/vendor/jsl-0.3.0/src/Makefile.ref +16 -6
  37. data/vendor/jsl-0.3.0/src/config.mk +32 -2
  38. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.ref +1 -2
  39. data/vendor/jsl-0.3.0/src/jsl.c +124 -13
  40. data/vendor/jsl-0.3.0/src/rules.mk +2 -1
  41. metadata +49 -28
  42. data/lib/bootstrap-template.js +0 -58
  43. data/lib/configurable.rb +0 -161
  44. data/lib/file-set.rb +0 -49
  45. data/lib/file-types/css-file.rb +0 -12
  46. data/lib/file-types/html-file.rb +0 -11
  47. data/lib/file-types/javascript-file.rb +0 -24
  48. data/lib/file-types/json-file.rb +0 -17
  49. data/lib/filter.rb +0 -41
  50. data/lib/filters/css-filter.rb +0 -58
  51. data/lib/filters/file-reference-filter.rb +0 -30
  52. data/lib/filters/jsl-dependency-filter.rb +0 -44
  53. data/lib/project.rb +0 -174
  54. data/lib/source-file.rb +0 -197
  55. data/lib/target.rb +0 -102
  56. data/lib/task.rb +0 -212
  57. data/lib/tasks/copy-task.rb +0 -17
  58. data/lib/tasks/css-task.rb +0 -12
  59. data/lib/tasks/javascript-task.rb +0 -206
  60. data/lib/tasks/multiple-output-task.rb +0 -140
  61. data/lib/tasks/output-task.rb +0 -76
  62. data/lib/tasks/single-output-task.rb +0 -104
  63. data/lib/tasks/test-task.rb +0 -280
@@ -0,0 +1,235 @@
1
+ module Distil
2
+
3
+ class Target < Configurable
4
+ include ErrorReporter
5
+
6
+ attr_accessor :project, :assets
7
+
8
+ option :version, String
9
+ option :name, String
10
+ option :notice_file, ProjectPath, "$(source_folder)/NOTICE", :aliases=>['notice']
11
+ option :target_type, String, FRAMEWORK_TYPE, :aliases=>['type'], :valid_values=>[FRAMEWORK_TYPE, APP_TYPE]
12
+
13
+ option :include_files, FileSet, :aliases=>['source']
14
+ option :exclude_files, FileSet, :aliases=>['exclude']
15
+
16
+ option :include_projects, [], :aliases=>['include']
17
+
18
+ option :validate, true
19
+ option :generate_docs, false
20
+
21
+ option :minify, true
22
+ option :compress, true
23
+
24
+ def initialize(settings, project)
25
+ @project=project
26
+
27
+ super(settings, project)
28
+
29
+ @assets= Set.new
30
+ @probed= Set.new
31
+ @contents= {}
32
+ @asset_aliases= {}
33
+
34
+ if !include_files
35
+ self.include_files= FileSet.new
36
+ end
37
+
38
+ if !exclude_files
39
+ self.exclude_files= FileSet.new
40
+ end
41
+
42
+ include_projects.each { |p|
43
+ external_project= project.external_project_with_name(p)
44
+ if !external_project
45
+ raise ValidationError.new("No such external project: #{p}")
46
+ end
47
+
48
+ if (WEAK_LINKAGE==external_project.linkage)
49
+ external_project.linkage= STRONG_LINKAGE
50
+ end
51
+ }
52
+ end
53
+
54
+ def source_folder
55
+ project.source_folder
56
+ end
57
+
58
+ def tasks
59
+ @tasks ||= Task.tasks.map { |task| task.new(@extras.clone, self) }
60
+ end
61
+
62
+ def products
63
+ return @products if @products
64
+
65
+ product_types= [CssProduct, CssDebugProduct, JavascriptProduct, JavascriptDebugProduct]
66
+ if minify
67
+ product_types << CssMinifiedProduct
68
+ product_types << JavascriptMinifiedProduct
69
+ end
70
+
71
+ if generate_docs
72
+ product_types << JavascriptDocProduct
73
+ end
74
+
75
+ @products=[]
76
+ product_types.each { |t|
77
+ product= t.new(@extras.clone, self)
78
+ product.files= files
79
+ @products << product if !product.files.empty?
80
+ }
81
+
82
+ @products
83
+ end
84
+
85
+ def notice_text
86
+ @notice_text if @notice_text
87
+
88
+ if (nil==@notice_text)
89
+ if (!File.exists?(notice_file))
90
+ @notice_text= ""
91
+ else
92
+ text= File.read(notice_file).strip
93
+ text= " #{text}".gsub(/\n/, "\n ")
94
+ @notice_text= "/*!\n#{text}\n*/\n\n"
95
+ end
96
+ end
97
+ end
98
+
99
+ def include_file(file)
100
+ return if @probed.include?(file)
101
+ return if @files.include?(file)
102
+ return if !include_files.include?(file)
103
+ return if exclude_files.include?(file)
104
+
105
+ @probed << file
106
+
107
+ tasks.each { |t| t.include_file(file) }
108
+
109
+ file.dependencies.each { |d| include_file(d) }
110
+ @assets.merge(file.assets)
111
+ @assets << file
112
+ @files << file
113
+ end
114
+
115
+ def files
116
+ return @files if @files
117
+
118
+ @probed= Set.new
119
+ @files= []
120
+
121
+ tasks.each { |t|
122
+ extra_files= t.find_files
123
+ extra_files.each { |f| include_files.include_file(f) }
124
+ }
125
+
126
+ include_files.each { |i| include_file(i) }
127
+
128
+ @files
129
+ end
130
+
131
+ def symlink_assets
132
+ folders= []
133
+
134
+ assets.each { |a|
135
+ path= a.file_path || a.relative_to_folder(source_folder)
136
+
137
+ parts= File.dirname(path).split(File::SEPARATOR)
138
+ if ('.'==parts[0])
139
+ product_path= File.join(output_folder, path)
140
+ FileUtils.rm product_path if File.exists? product_path
141
+ File.symlink a.relative_to_folder(output_folder), product_path
142
+ next
143
+ end
144
+
145
+ for i in (0..parts.length-1)
146
+ f= parts[0..i].join(File::SEPARATOR)
147
+ if !folders.include?(f)
148
+ folders << f
149
+ end
150
+ end
151
+
152
+ }
153
+
154
+ folders.sort!
155
+
156
+ folders.each { |f|
157
+ src_folder= File.join(source_folder, f)
158
+ product_folder= File.join(project.output_folder, f)
159
+
160
+ next if File.exists?(product_folder)
161
+ File.symlink src_folder, product_folder
162
+ }
163
+ end
164
+
165
+ def copy_assets
166
+ assets.each { |a|
167
+ a.copy_to(project.output_folder, source_folder)
168
+ }
169
+ end
170
+
171
+ def build_assets
172
+ if (RELEASE_MODE==project.mode)
173
+ copy_assets
174
+ else
175
+ symlink_assets
176
+ end
177
+ end
178
+
179
+ def add_asset(asset)
180
+ @assets << asset
181
+ end
182
+
183
+ def set_alias_for_asset(asset_alias, asset_file)
184
+ @assets << asset_file
185
+ @asset_aliases[asset_file.to_s]= asset_alias
186
+ end
187
+
188
+ def alias_for_asset(asset_file)
189
+ full_path= asset_file.to_s
190
+ @asset_aliases[full_path] || asset_file.relative_to_folder(source_folder)
191
+ end
192
+
193
+ def build
194
+ puts "\n#{name}:\n\n"
195
+
196
+ tasks.each { |t| t.process_files(files) }
197
+
198
+ products.each { |p| p.write_output }
199
+
200
+ build_assets
201
+ end
202
+
203
+ def find_file(file, source_file=nil)
204
+ return nil if project.external_projects.nil?
205
+
206
+ parts= file.split(File::SEPARATOR)
207
+ project_name= parts[0]
208
+
209
+ external_project= project.external_project_with_name(project_name)
210
+ return nil if !external_project
211
+
212
+ if 1==parts.length
213
+ return SourceFile::from_path(external_project.product_name(:import, source_file.extension))
214
+ else
215
+ return SourceFile::from_path(File.join(external_project.source_folder, *parts[1..-1]))
216
+ end
217
+ end
218
+
219
+ def get_content_for_file(file)
220
+ file=SourceFile.from_path(file) if !file.is_a?(SourceFile)
221
+ @contents[file.to_s] ||= file.content
222
+ end
223
+
224
+ def set_content_for_file(file, content)
225
+ @contents[file.to_s] = content
226
+ end
227
+
228
+ end
229
+
230
+ end
231
+
232
+ # load all the other target types
233
+ # Dir.glob("#{File.dirname(__FILE__)}/target/*-target.rb") { |file|
234
+ # require file
235
+ # }
@@ -0,0 +1,64 @@
1
+ module Distil
2
+
3
+ CSS_IMPORT_REGEX = /@import\s+url\("?(.*\.css)"?\)/
4
+
5
+ class CssDependencyFilter < Task
6
+
7
+ def handles_file(file)
8
+ return ["css"].include?(file.content_type)
9
+ end
10
+
11
+ def include_file(file)
12
+ return if !handles_file(file)
13
+
14
+ content= target.get_content_for_file(file)
15
+
16
+ # Replace all ' (single quotes) with " (double quotes)
17
+ content.gsub!(/\'/,'"')
18
+ # Force a newline after a rule terminating ; (semi-colon)
19
+ content.gsub!(/;(\n|\r)*/, ";\n")
20
+
21
+ source_folder= get_option("source_folder")
22
+
23
+ # Rewrites the 'url("...")' rules to a relative path
24
+ # based on the location of the new concatenated CSS file.
25
+ line_num=0
26
+
27
+ lines= content.split("\n")
28
+
29
+ lines.each { |line|
30
+
31
+ line_num+=1
32
+
33
+ line.gsub!(CSS_IMPORT_REGEX) { |match|
34
+ css_file= File.join(file.parent_folder, $1)
35
+
36
+ if (!File.exists?(css_file))
37
+ file.error "Imported CSS file not found: #{$1}", line_num
38
+ # leave the @import rule in place
39
+ match
40
+ else
41
+ file.add_dependency(SourceFile.from_path(css_file))
42
+ end
43
+ }
44
+
45
+ line.gsub!(/url\("?(.*\.(jpg|png|gif))"?\)/) { |match|
46
+ image_file= File.join(file.parent_folder, $1)
47
+
48
+ if (!File.exists?(image_file))
49
+ file.warning "Resource not found: #{$1} (#{image_file})", line_num
50
+ "url(\"#{$1}\")"
51
+ else
52
+ asset= SourceFile.from_path(image_file)
53
+ file.add_asset(asset)
54
+ "url(\"#{asset.relative_to_folder(source_folder)}\")"
55
+ end
56
+ }
57
+ }
58
+
59
+ target.set_content_for_file(file, lines.join("\n"))
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,49 @@
1
+ module Distil
2
+
3
+ JSL_IMPORT_REGEX= /\/\*jsl:import\s+([^\*]*)\*\//
4
+
5
+ class JslDependencyTask < Task
6
+
7
+ def handles_file(file)
8
+ return ["js"].include?(file.content_type)
9
+ end
10
+
11
+ def include_file(file)
12
+ return if !handles_file(file)
13
+
14
+ content= target.get_content_for_file(file).split("\n")
15
+
16
+ line_num=0
17
+
18
+ content.each { |line|
19
+
20
+ line_num+=1
21
+
22
+ # handle dependencies
23
+ line.gsub!(JSL_IMPORT_REGEX) { |match|
24
+
25
+ import_file= File.expand_path(File.join(file.parent_folder, $1))
26
+ if (File.exists?(import_file))
27
+ file.add_dependency SourceFile.from_path(import_file)
28
+ else
29
+ dependency= target.find_file($1, file)
30
+ if (dependency)
31
+ file.add_dependency dependency
32
+ else
33
+ file.error "Missing import file: #{$1}", line_num
34
+ end
35
+ end
36
+
37
+ # replace jsl import with empty string
38
+ ""
39
+
40
+ }
41
+
42
+ }
43
+
44
+ target.set_content_for_file(file, content.join("\n"))
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,72 @@
1
+ module Distil
2
+
3
+ NIB_ASSET_REGEX= /(NIB\.asset(?:Url)?)\(['"]([^)]+)['"]\)/
4
+
5
+ class NibTask < Task
6
+ include ErrorReporter
7
+
8
+ def handles_file(file)
9
+ return ["js"].include?(file.content_type)
10
+ end
11
+
12
+ def preprocess_file(nib_name, nib_folder, file)
13
+ return if !handles_file(file)
14
+
15
+ content= target.get_content_for_file(file).split("\n")
16
+
17
+ line_num=0
18
+
19
+ content.each { |line|
20
+
21
+ line_num+=1
22
+
23
+ # handle dependencies
24
+ line.gsub!(NIB_ASSET_REGEX) { |match|
25
+ asset_file= File.expand_path(File.join(file.parent_folder, $2))
26
+ asset_file= SourceFile.from_path(asset_file)
27
+ if (!File.exists?(asset_file))
28
+ file.warning "Asset not found: #{$2} (#{asset_file})", line_num
29
+ "#{$0}"
30
+ else
31
+ "#{$1}(\"#{asset_file.relative_to_folder(target.source_folder)}\")"
32
+ # "#{$1}(\"#{nib_name}##{asset_file.relative_to_folder(nib_folder)}\")"
33
+ end
34
+ }
35
+
36
+ }
37
+
38
+ target.set_content_for_file(file, content.join("\n"))
39
+ end
40
+
41
+ def include_file(file)
42
+
43
+ return if !File.fnmatch("**/*.jsnib/*.js", file)
44
+ # puts "Nib asset: #{file}"
45
+ match= file.to_s.match(/([^\.\/]+).jsnib\/(.*)\.js/)
46
+ return if match[1]!=match[2]
47
+
48
+ nib_name= match[1]
49
+ nib_folder= File.dirname(file)
50
+
51
+ preprocess_file(nib_name, nib_folder, file)
52
+
53
+
54
+ # Found main js file inside the JSNib add assets for all the other files
55
+ target.set_alias_for_asset("#{match[1]}##{match[2]}", file)
56
+ Dir.glob("#{File.dirname(file)}/**/*") { |asset|
57
+ next if File.directory?(asset) || asset.to_s==file.to_s
58
+
59
+ asset= SourceFile.from_path(asset)
60
+ preprocess_file(nib_name, nib_folder, asset)
61
+ file.add_asset(asset)
62
+
63
+ if 'html'==asset.content_type
64
+ target.set_alias_for_asset("#{nib_name}##{asset.relative_to_folder(nib_folder)}", asset)
65
+ end
66
+ }
67
+
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,75 @@
1
+ module Distil
2
+
3
+ LINT_COMMAND= "#{VENDOR_DIR}/jsl-0.3.0/bin/jsl"
4
+ # LINT_COMMAND= "/Users/jeff/.gem/ruby/1.8/gems/distil-0.10.2/vendor/jsl-0.3.0/bin/jsl"
5
+
6
+ class ValidateJsTask < Task
7
+
8
+ include ErrorReporter
9
+
10
+ option :jsl_conf, "#{LIB_DIR}/jsl.conf"
11
+
12
+ def handles_file(file)
13
+ return ["js"].include?(file.content_type)
14
+ end
15
+
16
+ def process_files(files)
17
+ return if (!File.exists?(LINT_COMMAND))
18
+
19
+ tmp= Tempfile.new("jsl.conf")
20
+
21
+ conf_files= [ "jsl.conf",
22
+ "#{ENV['HOME']}/.jsl.conf",
23
+ jsl_conf
24
+ ]
25
+
26
+ jsl_conf= conf_files.find { |f| File.exists?(f) }
27
+
28
+ tmp << File.read(jsl_conf)
29
+ tmp << "\n"
30
+
31
+ tmp << "+define distil\n"
32
+
33
+ # add aliases
34
+ target.project.external_projects.each { |project|
35
+ import_file= project.product_name(:import, 'js')
36
+ next if !File.exist?(import_file)
37
+ tmp << "+alias #{project.name} #{import_file}\n"
38
+ }
39
+
40
+ files.each { |f|
41
+ next if !handles_file(f)
42
+ tmp << "+process #{f}\n"
43
+ }
44
+
45
+ tmp.close()
46
+
47
+ command= "#{LINT_COMMAND} -nologo -nofilelisting -conf #{tmp.path}"
48
+
49
+ stdin, stdout, stderr= Open3.popen3(command)
50
+ stdin.close
51
+ output= stdout.read
52
+ errors= stderr.read
53
+
54
+ tmp.delete
55
+
56
+ output= output.split("\n")
57
+ summary= output.pop
58
+ match= summary.match(/(\d+)\s+error\(s\), (\d+)\s+warning\(s\)/)
59
+ if (match)
60
+ @@error_count+= match[1].to_i
61
+ @@warning_count+= match[2].to_i
62
+ end
63
+
64
+ output= output.join("\n")
65
+
66
+ if (!output.empty?)
67
+ puts output
68
+ puts
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,50 @@
1
+ require 'set'
2
+
3
+ module Distil
4
+
5
+ class Task < Configurable
6
+
7
+ def initialize(options, target)
8
+ @target= target
9
+ super(options, target)
10
+ end
11
+
12
+ def project
13
+ target.project
14
+ end
15
+
16
+ def target
17
+ @target
18
+ end
19
+
20
+ @@tasks= []
21
+ def self.inherited(subclass)
22
+ @@tasks << subclass
23
+ end
24
+
25
+ def self.tasks
26
+ @@tasks
27
+ end
28
+
29
+ def handles_file?(file)
30
+ false
31
+ end
32
+
33
+ def find_files
34
+ []
35
+ end
36
+
37
+ def include_file(file)
38
+ end
39
+
40
+ def process_files(files)
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ # load all the other task types
48
+ Dir.glob("#{LIB_DIR}/distil/task/*-task.rb") { |file|
49
+ require file
50
+ }
data/lib/distil.rb ADDED
@@ -0,0 +1,72 @@
1
+ require "set"
2
+ require 'yaml'
3
+ require 'tempfile'
4
+ require 'fileutils'
5
+ require 'zlib'
6
+ require "open3"
7
+ require 'uri'
8
+
9
+ def class_attr(*rest)
10
+ rest.each { |name|
11
+ class_eval %(
12
+ def self.#{name}(*rest)
13
+ if (rest.length>0)
14
+ @#{name}= rest[0]
15
+ else
16
+ @#{name} || (superclass.respond_to?(name) ? superclass.#{name} : nil)
17
+ end
18
+ end
19
+ def self.#{name}=(value)
20
+ @#{name}= value
21
+ end
22
+ def #{name}
23
+ @#{name} || self.class.#{name}
24
+ end
25
+ def #{name}=(value)
26
+ @#{name}=value
27
+ end
28
+ )
29
+ }
30
+ end
31
+
32
+ def exist?(path, file)
33
+ File.file?(File.join(path, file))
34
+ end
35
+
36
+ module Distil
37
+
38
+ FRAMEWORK_TYPE = "framework"
39
+ APP_TYPE = "application"
40
+
41
+ WEAK_LINKAGE = 'weak'
42
+ STRONG_LINKAGE = 'strong'
43
+ LAZY_LINKAGE = 'lazy'
44
+
45
+ DEBUG_MODE = 'debug'
46
+ RELEASE_MODE = 'release'
47
+
48
+ end
49
+
50
+ # Do a simple token substitution. Tokens begin and end with @.
51
+ def replace_tokens(string, params)
52
+ return string.gsub(/(\n[\t ]*)?@([^@ \t\r\n]*)@/) { |m|
53
+ key= $2
54
+ ws= $1
55
+ value= params[key]||m;
56
+ if (ws && ws.length)
57
+ ws + value.split("\n").join(ws);
58
+ else
59
+ value
60
+ end
61
+ }
62
+ end
63
+
64
+
65
+
66
+ require 'distil/error-reporter'
67
+ require 'distil/configurable'
68
+ require 'distil/source-file'
69
+ require 'distil/task'
70
+ require 'distil/product'
71
+ require 'distil/target'
72
+ require 'distil/project'
data/lib/jsl.conf CHANGED
@@ -46,6 +46,10 @@
46
46
  +legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax
47
47
  +jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax
48
48
  +useless_comparison # useless comparison; comparing identical expressions
49
+ +with_statement # with statement hides undeclared variables; use temporary variable instead
50
+ +trailing_comma_in_array # extra comma is not recommended in array initializers
51
+ +assign_to_function_call # assignment to a function call
52
+ +parseint_missing_radix # parseInt missing radix parameter
49
53
 
50
54
 
51
55
  ### Output format
@@ -89,9 +89,14 @@ LDFLAGS += -lm
89
89
  endif
90
90
 
91
91
  # Prevent floating point errors caused by VC++ optimizations
92
- ifeq ($(OS_ARCH),WINNT)
93
- CFLAGS += /Op
94
- endif # WINNT
92
+ ifdef USE_MSVC
93
+ _MSC_VER = $(shell $(CC) 2>&1 | sed -n 's/.*Compiler Version \([0-9]*\)\.\([0-9]*\).*/\1\2/p')
94
+ ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER)))
95
+ CFLAGS += -Op
96
+ else
97
+ CFLAGS += -fp:precise
98
+ endif
99
+ endif # USE_MSVC
95
100
 
96
101
  #
97
102
  # Ask perl what flags it was built with, so we can build js with similar flags
@@ -332,11 +337,15 @@ endif
332
337
  # special rule for jsmath.o since we want to incrementally link
333
338
  # against fdlibm to pull in only what is needed
334
339
  $(OBJDIR)/jsmath.o: jsmath.c jsmath.h jslibmath.h $(FDLIBM_LIBRARY)
335
- ifneq (,$(filter OS2 WINNT,$(OS_ARCH)))
340
+ ifeq ($(OS_ARCH),OS2)
341
+ $(CC) -Fo$(JSMATH_PRELINK) -c $(CFLAGS) $<
342
+ else
343
+ ifdef USE_MSVC
336
344
  $(CC) -Fo$(JSMATH_PRELINK) -c $(CFLAGS) $<
337
345
  else
338
346
  $(CC) -o $(JSMATH_PRELINK) -c $(CFLAGS) $<
339
347
  endif
348
+ endif
340
349
 
341
350
  ifeq ($(OS_ARCH),QNX)
342
351
  ifneq ($(OS_TARGET),NTO)
@@ -345,12 +354,13 @@ else
345
354
  $(LD) $(DASH_R) -o $@ $(JSMATH_PRELINK) $(FDLIBM_LIBRARY)
346
355
  endif
347
356
  else
348
- ifdef USE_MSVC
357
+ ifeq ($(OS_ARCH),WINNT)
349
358
  @echo Warning: to use $(LIBRARY) must also link against $(FDLIBM_LIBRARY)
350
359
  @cp $(JSMATH_PRELINK) $@
351
- endif
360
+ else
352
361
  $(LD) $(DASH_R) -o $@ $(JSMATH_PRELINK) $(FDLIBM_LIBRARY)
353
362
  endif
363
+ endif
354
364
 
355
365
  # Note: generated headers must be built before descending
356
366
  # into fdlibm directory