mtbuild 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +50 -11
- data/lib/mtbuild.rb +2 -0
- data/lib/mtbuild/application_configuration.rb +10 -0
- data/lib/mtbuild/dsl.rb +5 -0
- data/lib/mtbuild/framework_configuration.rb +36 -0
- data/lib/mtbuild/framework_project.rb +33 -0
- data/lib/mtbuild/framework_task.rb +31 -0
- data/lib/mtbuild/organized_package_task.rb +145 -0
- data/lib/mtbuild/project.rb +0 -4
- data/lib/mtbuild/staticlibrary_configuration.rb +3 -6
- data/lib/mtbuild/staticlibrary_project.rb +64 -1
- data/lib/mtbuild/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8b0c1036197b946ec76fce626e6318b9ce62c6b5
|
|
4
|
+
data.tar.gz: f0abf5f39b31506c0a855919937147348540f246
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b88fcc23e4ffc42f9abc717eec9fc2d66381fa1f98815a168a25589afa2d9d14caa7f010f3305edfccaa3689010c17673687ef6bdbb6fd1fb72a8ae774987eaf
|
|
7
|
+
data.tar.gz: a270534effc8dc2d446beb07b638e55eca8a1e8ef56519458aacf4f3f90224ec53a1bfb8de9bd2c53297a075f33ba9f51b30488903438f46cf2ad142907e76fc
|
data/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# MTBuild #
|
|
2
2
|
|
|
3
|
+
[](http://badge.fury.io/rb/mtbuild)
|
|
4
|
+
|
|
3
5
|
MTBuild is MindTribe's Rake-based build system for building C/C++ projects.
|
|
4
6
|
|
|
5
7
|
MTBuild lives here: https://github.com/MindTribe/MTBuild
|
|
@@ -149,7 +151,7 @@ Workspace
|
|
|
149
151
|
|
|
150
152
|
#### Projects ####
|
|
151
153
|
|
|
152
|
-
MTBuild currently defines
|
|
154
|
+
MTBuild currently defines four types of projects.
|
|
153
155
|
|
|
154
156
|
##### Application Project #####
|
|
155
157
|
|
|
@@ -163,6 +165,10 @@ A library project defines one or more configurations that contain settings for b
|
|
|
163
165
|
|
|
164
166
|
A test application project defines one or more configurations that contain settings for building an executable application that is executed after building. This project type generates Rake tasks for compiling source files, linking them into an executable, and then running the executable. This is intended for building and running unit tests as part of the build process.
|
|
165
167
|
|
|
168
|
+
##### Framework Project #####
|
|
169
|
+
|
|
170
|
+
A framework project wraps up a static library and its headers for use by applications. See the "Frameworks" section below for more information.
|
|
171
|
+
|
|
166
172
|
#### Configurations ####
|
|
167
173
|
|
|
168
174
|
A configuration containa build settings for a project. This includes source files, toolchain, dependencies, etc. By defining multiple configurations, a project can be built for different processors (ARM, x86, etc.), different platforms, or simply different settings (debug vs. release). Configurations generate the actual Rake tasks that begin doing work. They are named with a fixed convention that allows you to refer to them in other Rake tasks. The naming scheme is "Project:Configuration". For example, if you declare a project called "MyLibrary" with configuration "Debug", you could list "MyLibrary:Debug" as a dependency in any Rake task and "MyLibrary:Debug" would be built before that task.
|
|
@@ -199,12 +205,12 @@ workspace :MyWorkspace, File.dirname(__FILE__) do |w|
|
|
|
199
205
|
end
|
|
200
206
|
|
|
201
207
|
static_library_project :MyLibrary, File.dirname(__FILE__) do |lib|
|
|
208
|
+
lib.add_api_headers 'include'
|
|
202
209
|
lib.add_configuration :Debug,
|
|
203
210
|
sources: ['src/**/*.c'],
|
|
204
211
|
toolchain: toolchain(:gcc,
|
|
205
212
|
cflags: '-std=c99',
|
|
206
213
|
)
|
|
207
|
-
api_headers: 'include'
|
|
208
214
|
end
|
|
209
215
|
```
|
|
210
216
|
|
|
@@ -223,9 +229,9 @@ workspace :MyLibrary, File.dirname(__FILE__) do |w|
|
|
|
223
229
|
end
|
|
224
230
|
|
|
225
231
|
static_library_project :MyLibrary, File.dirname(__FILE__) do |lib|
|
|
232
|
+
lib.add_api_headers 'include'
|
|
226
233
|
lib.add_configuration :Debug,
|
|
227
|
-
sources: ['src/**/*.c']
|
|
228
|
-
api_headers: 'include'
|
|
234
|
+
sources: ['src/**/*.c']
|
|
229
235
|
end
|
|
230
236
|
```
|
|
231
237
|
|
|
@@ -235,9 +241,9 @@ Configurations can list dependencies that will be built before the configuration
|
|
|
235
241
|
|
|
236
242
|
#### Automatic Library Dependencies ####
|
|
237
243
|
|
|
238
|
-
MTBuild library projects allow you to specify API header
|
|
244
|
+
MTBuild library projects allow you to specify API header locations for framework and static library project configurations. If you list a framework or a static library project as a dependency of an application project, MTbuild will automatically include the framework or library's API header paths when compiling the application. Additionally, it will automatically link the application with the framework or library. This is intended to facilitate the scenario where you're building both a library and an application from a Workspace. To use the library from the application, you simply need to list the library as a dependency and MTBuild will make sure the application can use it.
|
|
239
245
|
|
|
240
|
-
Note that this does not work with non-MTBuild libraries. If you list a non-MTBuild Rake library task as a dependency of a MTBuild project, you will need to manually add the library's headers and library file to the project.
|
|
246
|
+
Note that this does not work with non-MTBuild libraries. If you list a non-MTBuild Rake library task as a dependency of a MTBuild project, you will need to manually add the library's headers and library file to the project. If you have a precompiled 3rd-party library, you might consider wrapping it in a framework project so that you can use the Automatic Library Dependencies mechanism.
|
|
241
247
|
|
|
242
248
|
###### Automatic Library Dependencies Example #####
|
|
243
249
|
|
|
@@ -258,9 +264,9 @@ This defines a library with one configuration called "Debug". The library's API
|
|
|
258
264
|
|
|
259
265
|
```Ruby
|
|
260
266
|
static_library_project :MyLibrary, File.dirname(__FILE__) do |lib|
|
|
267
|
+
lib.add_api_headers 'include'
|
|
261
268
|
lib.add_configuration :Debug,
|
|
262
269
|
sources: ['src/**/*.c'],
|
|
263
|
-
api_headers: 'include',
|
|
264
270
|
toolchain: toolchain(:gcc)
|
|
265
271
|
end
|
|
266
272
|
```
|
|
@@ -283,6 +289,10 @@ application_project :MyApp, File.dirname(__FILE__) do |app|
|
|
|
283
289
|
end
|
|
284
290
|
```
|
|
285
291
|
|
|
292
|
+
#### Frameworks ####
|
|
293
|
+
|
|
294
|
+
MTBuild Frameworks contain pre-compiled objects/libraries and their headers. MTBuild Frameworks generate tasks that don't do anything; however, applications can list Framework configurations as dependencies to take advantage of Automatic Library Dependencies.
|
|
295
|
+
|
|
286
296
|
#### Toolchains ####
|
|
287
297
|
|
|
288
298
|
MTBuild Toolchains generate the individual compile, archival, and link tasks that comprise an application or library. Most of the interesting settings in a project's configuration go in the toolchain. The settings vary based upon the toolchain.
|
|
@@ -415,12 +425,14 @@ For ```configuration_block```, you supply a block that takes one parameter. When
|
|
|
415
425
|
#### add_configuration ####
|
|
416
426
|
Use ```add_configuration(configuration_name, configuration)``` inside of a static library project configuration block to add a build configuration for the library. The ```configuration_name``` parameter expects a symbol that serves as a human-readable name for the configuration. Rake tasks related to this configuration will be namespaced with this symbol. For example, the top-level Rake task for building the "Debug" configuration of "MyLibrary" would be "MyLibrary:Debug". The ```configuration``` parameter expects a hash that contains settings for the configuration.
|
|
417
427
|
|
|
418
|
-
|
|
419
|
-
|
|
428
|
+
#### add_api_headers ####
|
|
429
|
+
Use ```add_api_headers(api_headers)``` inside of a static library project configuration block--before adding configurations--to set the location(s) of the library's API headers. The ```api_headers``` parameter should be one or more API header paths. For example, ```'include'``` or ```['include', 'plugins']```. Note that the API header paths should be relative to the project folder. API header paths should NOT contain one another. For example, do not do this: ```['include', 'include/things']```. You can have subfolders inside of an API header location, but you should only add the topmost folder.
|
|
420
430
|
|
|
421
|
-
|
|
431
|
+
#### build_framework_package ####
|
|
432
|
+
Use ```build_framework_package(configuration_names)``` inside of a static library project configuration block to specify that the library should provide a framework package target. Use ```configuration_names``` to provide a list of configuration names to include in the package. For example, ```'Configuration1'``` or ```['Configuration1', 'Configuration2']```.
|
|
422
433
|
|
|
423
|
-
|
|
434
|
+
##### Static Library Project configuration settings #####
|
|
435
|
+
Static Library Project configurations use the same settings as Application Project configurations.
|
|
424
436
|
|
|
425
437
|
### MTBuild::TestApplicationProject ###
|
|
426
438
|
Define a Test Application Project with the following DSL method:
|
|
@@ -441,6 +453,33 @@ Use ```add_configuration(configuration_name, configuration)``` inside of a test
|
|
|
441
453
|
##### Test Application Project configuration settings #####
|
|
442
454
|
Test Application Project configurations use the same settings as Application Library Project configurations.
|
|
443
455
|
|
|
456
|
+
### MTBuild::FrameworkProject ###
|
|
457
|
+
|
|
458
|
+
Define a Framework Project with the following DSL method:
|
|
459
|
+
|
|
460
|
+
```Ruby
|
|
461
|
+
framework_project(framework_name, project_folder, &configuration_block)
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
```framework_name``` is your desired name for the framework. This should be a symbol such as ```:MyApplication```. It serves as a human-readable name for the framework. Rake tasks related to this framework will be namespaced with this symbol. For example, the top-level Rake task for building the "MyLibrary" framework with a configuration called "Debug" would be "MyLibrary:Debug".
|
|
465
|
+
|
|
466
|
+
```project_folder``` is the location of the project. Project files should be located at or below this location. Typically, you'd simply pass ```File.dirname(__FILE__)``` to use the same folder as the project's Rakefile.
|
|
467
|
+
|
|
468
|
+
For ```configuration_block```, you supply a block that takes one parameter. When MTBuild invokes the block, it will pass an FrameworkProject object as this parameter. Inside the block, you can make FrameworkProject calls on this object to add configurations.
|
|
469
|
+
|
|
470
|
+
#### add_configuration ####
|
|
471
|
+
Use ```add_configuration(configuration_name, configuration)``` inside of a framework project configuration block to add a configuration for the framework. The ```configuration_name``` parameter expects a symbol that serves as a human-readable name for the configuration. Rake tasks related to this configuration will be namespaced with this symbol. For example, the top-level Rake task for building the "Debug" configuration of "MyLibrary" would be "MyLibrary:Debug". The ```configuration``` parameter expects a hash that contains settings for the configuration.
|
|
472
|
+
|
|
473
|
+
#### add_api_headers ####
|
|
474
|
+
Use ```add_api_headers(api_headers)``` inside of a framework project configuration block--before adding configurations--to set the location(s) of the framework's API headers. The ```api_headers``` parameter should be one or more API header paths. For example, ```'include'``` or ```['include', 'plugins']```. Note that the API header paths should be relative to the project folder. API header paths should NOT contain one another. For example, do not do this: ```['include', 'include/things']```. You can have subfolders inside of an API header location, but you should only add the topmost folder.
|
|
475
|
+
|
|
476
|
+
##### Framework Project configuration settings #####
|
|
477
|
+
Framework Project configurations use the same settings as Application Project configurations.
|
|
478
|
+
|
|
479
|
+
Additionally, Framework Project configurations require the following settings:
|
|
480
|
+
|
|
481
|
+
* ```:objects``` - One or more framework object files. For example, ```'MyLibrary.a'```
|
|
482
|
+
|
|
444
483
|
### MTBuild::Toolchain ###
|
|
445
484
|
Define a Toolchain with the following DSL method:
|
|
446
485
|
|
data/lib/mtbuild.rb
CHANGED
|
@@ -4,6 +4,8 @@ require "mtbuild/application"
|
|
|
4
4
|
require "mtbuild/application_project"
|
|
5
5
|
require "mtbuild/application_task"
|
|
6
6
|
require "mtbuild/dsl"
|
|
7
|
+
require "mtbuild/framework_project"
|
|
8
|
+
require "mtbuild/framework_task"
|
|
7
9
|
require "mtbuild/mtbuild"
|
|
8
10
|
require "mtbuild/staticlibrary_project"
|
|
9
11
|
require "mtbuild/staticlibrary_task"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
module MTBuild
|
|
2
2
|
require 'mtbuild/compiled_configuration'
|
|
3
|
+
require 'mtbuild/organized_package_task'
|
|
3
4
|
|
|
4
5
|
# Use this class to create application configurations. You won't typically
|
|
5
6
|
# instantiate this directly. Instead, the ApplicationProject.add_configuration
|
|
@@ -31,6 +32,15 @@ module MTBuild
|
|
|
31
32
|
end
|
|
32
33
|
end
|
|
33
34
|
end
|
|
35
|
+
|
|
36
|
+
namespace @configuration_name do
|
|
37
|
+
OrganizedPackageTask.new("#{@project_name}-#{@configuration_name}", :noversion) do |t|
|
|
38
|
+
t.need_tar_gz = true
|
|
39
|
+
t.add_files_to_folder("", application_binaries+application_files)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
Rake::Task[:"#{@project_name}:#{@configuration_name}:package"].prerequisites.insert(0, :"#{@project_name}:#{@configuration_name}")
|
|
43
|
+
|
|
34
44
|
end
|
|
35
45
|
|
|
36
46
|
end
|
data/lib/mtbuild/dsl.rb
CHANGED
|
@@ -12,6 +12,11 @@ module MTBuild
|
|
|
12
12
|
MTBuild::ApplicationProject.new(application_name, project_folder, &configuration_block)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Defines a FrameworkProject
|
|
16
|
+
def framework_project(framework_name, project_folder, &configuration_block)
|
|
17
|
+
MTBuild::FrameworkProject.new(framework_name, project_folder, &configuration_block)
|
|
18
|
+
end
|
|
19
|
+
|
|
15
20
|
# Defines a StaticLibraryProject
|
|
16
21
|
def static_library_project(library_name, project_folder, &configuration_block)
|
|
17
22
|
MTBuild::StaticLibraryProject.new(library_name, project_folder, &configuration_block)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module MTBuild
|
|
2
|
+
require 'mtbuild/configuration'
|
|
3
|
+
|
|
4
|
+
# Use this class to create framework configurations. You won't typically
|
|
5
|
+
# instantiate this directly. Instead, the FrameworkProject.add_configuration
|
|
6
|
+
# method will create this for you.
|
|
7
|
+
class FrameworkConfiguration < Configuration
|
|
8
|
+
|
|
9
|
+
def initialize(project_name, project_folder, output_folder, configuration_name, configuration, api_headers)
|
|
10
|
+
super project_name, project_folder, output_folder, configuration_name, configuration
|
|
11
|
+
check_configuration(configuration)
|
|
12
|
+
@object_files = Utils.expand_file_list(configuration[:objects], [], @project_folder)
|
|
13
|
+
@api_headers = api_headers
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Create the actual Rake tasks that will perform the configuration's work
|
|
17
|
+
def configure_tasks
|
|
18
|
+
super
|
|
19
|
+
desc "Framework '#{@project_name}' with configuration '#{@configuration_name}'"
|
|
20
|
+
new_task = framework_task @configuration_name => @object_files do |t|
|
|
21
|
+
puts "found framework #{t.name}."
|
|
22
|
+
end
|
|
23
|
+
new_task.api_headers = @api_headers
|
|
24
|
+
new_task.library_files = @object_files
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def check_configuration(configuration)
|
|
30
|
+
super
|
|
31
|
+
fail "No objects specified for #{@project_name}:#{@configuration_name}" if configuration.fetch(:objects, nil).nil?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module MTBuild
|
|
2
|
+
require "mtbuild/framework_configuration"
|
|
3
|
+
require 'mtbuild/project'
|
|
4
|
+
|
|
5
|
+
# This class is used to load frameworks. A framework provides precompiled
|
|
6
|
+
# objects/libraries and API headers. Listing a framework as a dependency in
|
|
7
|
+
# an application will automatically include the framework's API headers and
|
|
8
|
+
# link with its objects/libraries
|
|
9
|
+
class FrameworkProject < Project
|
|
10
|
+
|
|
11
|
+
def initialize(project_name, project_folder, &configuration_block)
|
|
12
|
+
@api_headers = []
|
|
13
|
+
super
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Adds a named FrameworkConfiguration to the project.
|
|
17
|
+
def add_configuration(configuration_name, configuration)
|
|
18
|
+
super
|
|
19
|
+
default_configuration = Workspace.configuration_defaults.fetch(configuration_name, {})
|
|
20
|
+
merged_configuration = Utils.merge_configurations(default_configuration, configuration)
|
|
21
|
+
cfg = FrameworkConfiguration.new(@project_name, @project_folder, effective_output_folder, configuration_name, merged_configuration, @api_headers)
|
|
22
|
+
@configurations << cfg
|
|
23
|
+
return cfg
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Specifies API header locations
|
|
27
|
+
def add_api_headers(api_headers)
|
|
28
|
+
@api_headers += Utils.expand_folder_list(api_headers, @project_folder)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Rake
|
|
2
|
+
|
|
3
|
+
require 'rake'
|
|
4
|
+
|
|
5
|
+
# This is a top-level Rake task for loading a framework
|
|
6
|
+
class FrameworkTask < Task
|
|
7
|
+
|
|
8
|
+
# API header location for the framework
|
|
9
|
+
attr_accessor :api_headers
|
|
10
|
+
|
|
11
|
+
# The framework objects
|
|
12
|
+
attr_accessor :library_files
|
|
13
|
+
|
|
14
|
+
def initialize(task_name, app)
|
|
15
|
+
super
|
|
16
|
+
@api_headers = ''
|
|
17
|
+
@library_files = ''
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module DSL
|
|
23
|
+
|
|
24
|
+
# DSL method to create a framework task.
|
|
25
|
+
def framework_task(*args, &block)
|
|
26
|
+
new_task = Rake::FrameworkTask.define_task(*args, &block)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
module MTBuild
|
|
2
|
+
|
|
3
|
+
require 'rake'
|
|
4
|
+
require 'rake/packagetask'
|
|
5
|
+
require 'pathname'
|
|
6
|
+
|
|
7
|
+
# Create a packaging task that will package files into distributable packages
|
|
8
|
+
# (e.g zip archive or tar files). The files are organized in folders inside the
|
|
9
|
+
# package.
|
|
10
|
+
#
|
|
11
|
+
# The OrganizedPackageTask will create the following targets:
|
|
12
|
+
#
|
|
13
|
+
# +:package+ ::
|
|
14
|
+
# Create all the requested package files.
|
|
15
|
+
#
|
|
16
|
+
# +:clobber_package+ ::
|
|
17
|
+
# Delete all the package files. This target is automatically
|
|
18
|
+
# added to the main clobber target.
|
|
19
|
+
#
|
|
20
|
+
# +:repackage+ ::
|
|
21
|
+
# Rebuild the package files from scratch, even if they are not out
|
|
22
|
+
# of date.
|
|
23
|
+
#
|
|
24
|
+
# <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tgz"</tt> ::
|
|
25
|
+
# Create a gzipped tar package (if <em>need_tar</em> is true).
|
|
26
|
+
#
|
|
27
|
+
# <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.gz"</tt> ::
|
|
28
|
+
# Create a gzipped tar package (if <em>need_tar_gz</em> is true).
|
|
29
|
+
#
|
|
30
|
+
# <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.bz2"</tt> ::
|
|
31
|
+
# Create a bzip2'd tar package (if <em>need_tar_bz2</em> is true).
|
|
32
|
+
#
|
|
33
|
+
# <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.zip"</tt> ::
|
|
34
|
+
# Create a zip package archive (if <em>need_zip</em> is true).
|
|
35
|
+
#
|
|
36
|
+
# Example:
|
|
37
|
+
#
|
|
38
|
+
# Rake::OrganizedPackageTask.new("MyPackage", "1.2.3") do |p|
|
|
39
|
+
# p.need_tar = true
|
|
40
|
+
# p.add_files_to_folder('bin', 'bin', '**/*')
|
|
41
|
+
# p.package_files.include("lib/**/*.rb")
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
class OrganizedPackageTask < Rake::PackageTask
|
|
45
|
+
|
|
46
|
+
# Add files to a folder in the package
|
|
47
|
+
def add_files_to_folder(package_folder, included_files, excluded_files=[])
|
|
48
|
+
file_list = Utils.expand_file_list(included_files, excluded_files)
|
|
49
|
+
package_file_list = file_list.collect{ |f| File.join(package_dir_path, package_folder, File.basename(f)) }
|
|
50
|
+
@origin_files += file_list
|
|
51
|
+
@destination_files += package_file_list
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Add folder to a folder in the package
|
|
55
|
+
def add_folders_to_folder(package_folder, folders, excluded_files=[])
|
|
56
|
+
folders.each do |folder|
|
|
57
|
+
file_list = Utils.expand_file_list('/**/*', excluded_files, folder)
|
|
58
|
+
package_file_list = file_list.collect{ |f| File.join(package_dir_path, package_folder, get_relative_path(folder,f)) }
|
|
59
|
+
@origin_files += file_list
|
|
60
|
+
@destination_files += package_file_list
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Hide the PackageTask package_files because this class doesn't use it
|
|
65
|
+
private :package_files
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def init(name, version)
|
|
70
|
+
super
|
|
71
|
+
fail "Version required (or :noversion)" if @version.nil?
|
|
72
|
+
@version = nil if :noversion == @version
|
|
73
|
+
@destination_files = []
|
|
74
|
+
@origin_files = []
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def get_relative_path(parent, child)
|
|
78
|
+
child = Pathname.new(child)
|
|
79
|
+
parent = Pathname.new(parent)
|
|
80
|
+
return child.relative_path_from(parent).to_s
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def define
|
|
84
|
+
desc "Build the package"
|
|
85
|
+
task :package
|
|
86
|
+
|
|
87
|
+
desc "Force a rebuild of the package files"
|
|
88
|
+
task :repackage => [:clobber_package, :package]
|
|
89
|
+
|
|
90
|
+
desc "Remove package products"
|
|
91
|
+
task :clobber_package do
|
|
92
|
+
rm_r package_dir rescue nil
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
task :clobber => [:clobber_package]
|
|
96
|
+
|
|
97
|
+
[
|
|
98
|
+
[need_tar, tgz_file, "z"],
|
|
99
|
+
[need_tar_gz, tar_gz_file, "z"],
|
|
100
|
+
[need_tar_bz2, tar_bz2_file, "j"]
|
|
101
|
+
].each do |(need, file, flag)|
|
|
102
|
+
if need
|
|
103
|
+
task :package => ["#{package_dir}/#{file}"]
|
|
104
|
+
file "#{package_dir}/#{file}" =>
|
|
105
|
+
[package_dir_path] + @origin_files + @destination_files do
|
|
106
|
+
chdir(package_dir) do
|
|
107
|
+
sh %{#{@tar_command} #{flag}cvf #{file} #{package_name}}
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
if need_zip
|
|
114
|
+
task :package => ["#{package_dir}/#{zip_file}"]
|
|
115
|
+
file "#{package_dir}/#{zip_file}" =>
|
|
116
|
+
[package_dir_path] + @origin_files + @destination_files do
|
|
117
|
+
chdir(package_dir) do
|
|
118
|
+
sh %{#{@zip_command} -r #{zip_file} #{package_name}}
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
directory package_dir_path
|
|
124
|
+
|
|
125
|
+
@destination_files.each_index do |i|
|
|
126
|
+
origin_file = @origin_files[i]
|
|
127
|
+
destination_file = @destination_files[i]
|
|
128
|
+
|
|
129
|
+
file destination_file => [origin_file, package_dir_path] do
|
|
130
|
+
fdir = File.dirname(destination_file)
|
|
131
|
+
mkdir_p(fdir) unless File.exist?(fdir)
|
|
132
|
+
if File.directory?(origin_file)
|
|
133
|
+
mkdir_p(destination_file)
|
|
134
|
+
else
|
|
135
|
+
rm_f destination_file
|
|
136
|
+
safe_ln(origin_file, destination_file)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
self
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
data/lib/mtbuild/project.rb
CHANGED
|
@@ -6,12 +6,9 @@ module MTBuild
|
|
|
6
6
|
# method will create this for you.
|
|
7
7
|
class StaticLibraryConfiguration < CompiledConfiguration
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def initialize(project_name, project_folder, output_folder, configuration_name, configuration)
|
|
13
|
-
super
|
|
14
|
-
@api_headers = Utils.expand_folder_list(configuration.fetch(:api_headers, []), @project_folder)
|
|
9
|
+
def initialize(project_name, project_folder, output_folder, configuration_name, configuration, api_headers)
|
|
10
|
+
@api_headers = api_headers
|
|
11
|
+
super project_name, project_folder, output_folder, configuration_name, configuration
|
|
15
12
|
end
|
|
16
13
|
|
|
17
14
|
# Create the actual Rake tasks that will perform the configuration's work
|
|
@@ -1,21 +1,84 @@
|
|
|
1
1
|
module MTBuild
|
|
2
2
|
require "mtbuild/staticlibrary_configuration"
|
|
3
|
+
require 'mtbuild/organized_package_task'
|
|
3
4
|
require 'mtbuild/project'
|
|
4
5
|
|
|
5
6
|
# This class is used to build static libraries. A static library has
|
|
6
7
|
# compilation and archival phases that produce a binary library package.
|
|
7
8
|
class StaticLibraryProject < Project
|
|
8
9
|
|
|
10
|
+
def initialize(project_name, project_folder, &configuration_block)
|
|
11
|
+
@framework_configurations = []
|
|
12
|
+
@api_headers = []
|
|
13
|
+
super
|
|
14
|
+
if @framework_configurations.count > 0
|
|
15
|
+
configure_framework_tasks
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
9
19
|
# Adds a named static library configuration to the project.
|
|
10
20
|
def add_configuration(configuration_name, configuration)
|
|
11
21
|
super
|
|
12
22
|
default_configuration = Workspace.configuration_defaults.fetch(configuration_name, {})
|
|
13
23
|
merged_configuration = Utils.merge_configurations(default_configuration, configuration)
|
|
14
|
-
cfg = StaticLibraryConfiguration.new(@project_name, @project_folder, effective_output_folder, configuration_name, merged_configuration)
|
|
24
|
+
cfg = StaticLibraryConfiguration.new(@project_name, @project_folder, effective_output_folder, configuration_name, merged_configuration, @api_headers)
|
|
15
25
|
@configurations << cfg
|
|
16
26
|
return cfg
|
|
17
27
|
end
|
|
18
28
|
|
|
29
|
+
# Provides a framework package target that builds a framework package with the specified configurations
|
|
30
|
+
def build_framework_package(configuration_names)
|
|
31
|
+
@framework_configurations += Utils.ensure_array(configuration_names)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Specifies API header locations
|
|
35
|
+
def add_api_headers(api_headers)
|
|
36
|
+
@api_headers += Utils.expand_folder_list(api_headers, @project_folder)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def configure_framework_tasks
|
|
42
|
+
namespace @project_name do
|
|
43
|
+
framework_task = OrganizedPackageTask.new("#{@project_name}", :noversion) do |t|
|
|
44
|
+
t.need_tar_gz = true
|
|
45
|
+
t.add_folders_to_folder("Headers", @api_headers)
|
|
46
|
+
@framework_configurations.each do |framework_configuration|
|
|
47
|
+
configuration_name = "#{@project_name}:#{framework_configuration}"
|
|
48
|
+
configuration_task = Rake.application.lookup(configuration_name)
|
|
49
|
+
fail "Unable to locate configuration: #{configuration_name}" if configuration_task.nil?
|
|
50
|
+
fail "Configuration is not a library configuration: #{configuration_name}" unless configuration_task.respond_to? :library_files
|
|
51
|
+
|
|
52
|
+
t.add_files_to_folder("Libraries/#{framework_configuration}", configuration_task.library_files)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
framework_rakefile = File.join(framework_task.package_dir_path, "Rakefile.rb")
|
|
57
|
+
file framework_rakefile do |f|
|
|
58
|
+
fdir = File.dirname(framework_rakefile)
|
|
59
|
+
mkdir_p(fdir) unless File.exist?(fdir)
|
|
60
|
+
|
|
61
|
+
File.open(framework_rakefile, 'w') do |f|
|
|
62
|
+
f.puts("framework_project :#{@project_name}, File.dirname(__FILE__) do |lib|")
|
|
63
|
+
f.puts(" lib.add_api_headers 'Headers'")
|
|
64
|
+
@framework_configurations.each do |framework_configuration|
|
|
65
|
+
configuration_name = "#{@project_name}:#{framework_configuration}"
|
|
66
|
+
configuration_task = Rake.application.lookup(configuration_name)
|
|
67
|
+
f.puts(" lib.add_configuration :#{framework_configuration},")
|
|
68
|
+
f.puts(" objects: ['Libraries/#{framework_configuration}/*']")
|
|
69
|
+
end
|
|
70
|
+
f.puts("end")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@framework_configurations.each do |framework_configuration|
|
|
75
|
+
Rake::Task[:"#{@project_name}:package"].prerequisites.insert(0, :"#{@project_name}:#{framework_configuration}")
|
|
76
|
+
Rake::Task[:"#{@project_name}:package"].prerequisites.insert(0, framework_rakefile)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
19
82
|
end
|
|
20
83
|
|
|
21
84
|
end
|
data/lib/mtbuild/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mtbuild
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jerry Ryle
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-05-
|
|
11
|
+
date: 2014-05-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -107,7 +107,11 @@ files:
|
|
|
107
107
|
- lib/mtbuild/compiled_configuration.rb
|
|
108
108
|
- lib/mtbuild/configuration.rb
|
|
109
109
|
- lib/mtbuild/dsl.rb
|
|
110
|
+
- lib/mtbuild/framework_configuration.rb
|
|
111
|
+
- lib/mtbuild/framework_project.rb
|
|
112
|
+
- lib/mtbuild/framework_task.rb
|
|
110
113
|
- lib/mtbuild/mtbuild.rb
|
|
114
|
+
- lib/mtbuild/organized_package_task.rb
|
|
111
115
|
- lib/mtbuild/project.rb
|
|
112
116
|
- lib/mtbuild/staticlibrary_configuration.rb
|
|
113
117
|
- lib/mtbuild/staticlibrary_project.rb
|
|
@@ -138,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
138
142
|
requirements:
|
|
139
143
|
- - '>='
|
|
140
144
|
- !ruby/object:Gem::Version
|
|
141
|
-
version:
|
|
145
|
+
version: 1.9.1
|
|
142
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
147
|
requirements:
|
|
144
148
|
- - '>='
|