ckick 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +1 -0
- data/ckick.gemspec +1 -0
- data/lib/ckick.rb +18 -0
- data/lib/ckick/array.rb +3 -0
- data/lib/ckick/cflag.rb +4 -1
- data/lib/ckick/ckickfile.rb +3 -0
- data/lib/ckick/compiler_flag.rb +11 -0
- data/lib/ckick/cxxflag.rb +4 -1
- data/lib/ckick/dependencies.rb +17 -1
- data/lib/ckick/executable.rb +3 -0
- data/lib/ckick/find_plugin.rb +4 -0
- data/lib/ckick/hash.rb +7 -1
- data/lib/ckick/hash_elements.rb +14 -0
- data/lib/ckick/hashable.rb +5 -0
- data/lib/ckick/include_path.rb +4 -0
- data/lib/ckick/library.rb +7 -0
- data/lib/ckick/library_link.rb +12 -0
- data/lib/ckick/library_path.rb +4 -0
- data/lib/ckick/nil_class.rb +2 -0
- data/lib/ckick/path.rb +5 -0
- data/lib/ckick/plugin.rb +2 -0
- data/lib/ckick/plugin/clang_complete.rb +3 -1
- data/lib/ckick/plugin_delegate.rb +3 -0
- data/lib/ckick/project.rb +37 -2
- data/lib/ckick/sub_directory.rb +27 -1
- data/lib/ckick/target.rb +11 -0
- data/lib/ckick/version.rb +3 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f67bdb5b93f95f17d249d3ebb736234f169eeaf
|
4
|
+
data.tar.gz: 260c7c593b1ffba404fa08609d694841baf8261b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9d498bd063661c4904ce9c1c68a0feebcb42a167383c87f2e029ff58211a0fd5464307838336e5cf0f9b614a57f814abc9ee5c8bfc69c36b406fbbba09ed77f
|
7
|
+
data.tar.gz: c919cec6a8393f0c34c80590d695398322c739f95035b82048f74672b2b4bedbd42b7b5e48b04fec3af5a460d98ee5594f10814d748037287e1201283efd588c
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# CKick [![Build Status](https://travis-ci.org/jonathangingras/ckick.svg?branch=master)](https://travis-ci.org/jonathangingras/ckick)
|
1
|
+
# CKick [![Build Status](https://travis-ci.org/jonathangingras/ckick.svg?branch=master)](https://travis-ci.org/jonathangingras/ckick) [![Code Climate](https://codeclimate.com/github/jonathangingras/ckick/badges/gpa.svg)](https://codeclimate.com/github/jonathangingras/ckick)
|
2
2
|
|
3
3
|
CKick is a simple gem that helps to kick start a C/C++ project using CMake with an arbitrary structure.
|
4
4
|
Using a `CKickfile`, ckick is able to generate an whole project structure without having to write any `CMakeLists.txt` by your own.
|
data/Rakefile
CHANGED
data/ckick.gemspec
CHANGED
data/lib/ckick.rb
CHANGED
@@ -7,48 +7,66 @@ require "ckick/project"
|
|
7
7
|
require "ckick/find_plugin"
|
8
8
|
require "ckick/ckickfile"
|
9
9
|
|
10
|
+
# CKick module
|
11
|
+
# contains all CKick core code
|
10
12
|
module CKick
|
13
|
+
# location of the resource directory.
|
14
|
+
# +RESOURCE_DIR+ contains default project files and non-code utilities
|
11
15
|
RESOURCE_DIR = File.join(File.dirname(File.dirname(__FILE__)), "resource")
|
12
16
|
|
17
|
+
# :nodoc:
|
13
18
|
class Error < ::Exception
|
14
19
|
end
|
15
20
|
|
21
|
+
# :nodoc:
|
16
22
|
class BadFlagError < Error
|
17
23
|
end
|
18
24
|
|
25
|
+
# :nodoc:
|
19
26
|
class NoSuchDirectoryError < Error
|
20
27
|
end
|
21
28
|
|
29
|
+
# :nodoc:
|
22
30
|
class IllegalInitializationError < Error
|
23
31
|
end
|
24
32
|
|
33
|
+
# :nodoc:
|
25
34
|
class NoNameError < Error
|
26
35
|
end
|
27
36
|
|
37
|
+
# :nodoc:
|
28
38
|
class NoSourceError < Error
|
29
39
|
end
|
30
40
|
|
41
|
+
# :nodoc:
|
31
42
|
class BadProjectNameError < Error
|
32
43
|
end
|
33
44
|
|
45
|
+
# :nodoc:
|
34
46
|
class BadSourceError < Error
|
35
47
|
end
|
36
48
|
|
49
|
+
# :nodoc:
|
37
50
|
class BadLibError < Error
|
38
51
|
end
|
39
52
|
|
53
|
+
# :nodoc:
|
40
54
|
class BadIncludePathError < Error
|
41
55
|
end
|
42
56
|
|
57
|
+
# :nodoc:
|
43
58
|
class BadLibraryPathError < Error
|
44
59
|
end
|
45
60
|
|
61
|
+
# :nodoc:
|
46
62
|
class BadSubDirectoryError < Error
|
47
63
|
end
|
48
64
|
|
65
|
+
# :nodoc:
|
49
66
|
class NoParentDirError < Error
|
50
67
|
end
|
51
68
|
|
69
|
+
# :nodoc:
|
52
70
|
class BadFileContentError < Error
|
53
71
|
end
|
54
72
|
end
|
data/lib/ckick/array.rb
CHANGED
data/lib/ckick/cflag.rb
CHANGED
@@ -6,9 +6,12 @@ require "ckick/compiler_flag"
|
|
6
6
|
|
7
7
|
module CKick
|
8
8
|
|
9
|
+
# C compiler flag representation
|
9
10
|
class CFlag < CompilerFlag
|
11
|
+
|
12
|
+
# appends ${CMAKE_C_FLAGS} (CMake C compiler flags)
|
10
13
|
def cmake
|
11
|
-
%Q
|
14
|
+
%Q|set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} #{@content}")|
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
data/lib/ckick/ckickfile.rb
CHANGED
@@ -5,6 +5,9 @@
|
|
5
5
|
require "json"
|
6
6
|
|
7
7
|
module CKick
|
8
|
+
# loads a CKickfile in +dir+
|
9
|
+
# * +dir+ - directory containing file, defaults to Dir.pwd
|
10
|
+
# * +filename+ - filename, defaults to "CKickfile"
|
8
11
|
def self.load_ckickfile(dir=Dir.pwd, filename="CKickfile")
|
9
12
|
JSON.parse(File.read(File.join(dir, filename)), symbolize_names: true)
|
10
13
|
end
|
data/lib/ckick/compiler_flag.rb
CHANGED
@@ -2,11 +2,17 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
module CKick
|
6
7
|
|
8
|
+
#represents a compiler flag to pass to the compiler
|
7
9
|
class CompilerFlag
|
10
|
+
# raw flag
|
8
11
|
attr_reader :content
|
9
12
|
|
13
|
+
# * +args+ - Hash containing flag data as String
|
14
|
+
# ==== Input hash keys
|
15
|
+
# * +:flag+ - raw flag content, must be String
|
10
16
|
def initialize args={}
|
11
17
|
raise IllegalInitializationError, "No flag provided to compiler flag" unless args.is_a?(Hash) && !args.empty?
|
12
18
|
flag = args[:flag] || nil
|
@@ -15,22 +21,27 @@ module CKick
|
|
15
21
|
@content = args[:flag]
|
16
22
|
end
|
17
23
|
|
24
|
+
# converts to String, flag as is
|
18
25
|
def to_s
|
19
26
|
@content
|
20
27
|
end
|
21
28
|
|
29
|
+
# converts to hash element: String
|
22
30
|
def to_hash_element
|
23
31
|
@content
|
24
32
|
end
|
25
33
|
|
34
|
+
# raw flag
|
26
35
|
def raw_flag
|
27
36
|
@content
|
28
37
|
end
|
29
38
|
|
39
|
+
# overrides Object#eql? for uniqueness
|
30
40
|
def eql? other
|
31
41
|
@content.eql? other.content
|
32
42
|
end
|
33
43
|
|
44
|
+
# overrides Object#hash for uniqueness
|
34
45
|
def hash
|
35
46
|
@content.hash
|
36
47
|
end
|
data/lib/ckick/cxxflag.rb
CHANGED
@@ -6,9 +6,12 @@ require "ckick/compiler_flag"
|
|
6
6
|
|
7
7
|
module CKick
|
8
8
|
|
9
|
+
# C++ compiler flag representation
|
9
10
|
class CXXFlag < CompilerFlag
|
11
|
+
|
12
|
+
# appends ${CMAKE_CXX_FLAGS} (CMake C++ compiler flags)
|
10
13
|
def cmake
|
11
|
-
%Q
|
14
|
+
%Q|set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} #{@content}")|
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
data/lib/ckick/dependencies.rb
CHANGED
@@ -11,9 +11,16 @@ require "ckick/hashable"
|
|
11
11
|
|
12
12
|
module CKick
|
13
13
|
|
14
|
+
# Project dependency settings, such as include path, library path, and compiler flags
|
14
15
|
class Dependencies
|
15
16
|
include Hashable
|
16
17
|
|
18
|
+
# * +args+ - Dependencies hash (directly the CKickfile :dependencies element parsed with keys as Symbol), must be a Hash
|
19
|
+
# ====== Input hash keys
|
20
|
+
# * +:cflags+ - C language specific flags, for e.g. '-std=c89', '-Wall', etc., must be an Array of String
|
21
|
+
# * +:cxxflags+ - C++ language specific flags, for e.g. '-std=c++11', '-fno-exceptions', etc., must be an Array of String
|
22
|
+
# * +:include+ - Array of paths to append the include path (-I compiler option; include_directories() CMake command)
|
23
|
+
# * +:lib+ - Array of paths to append the link path (-L compiler option; link_directories() CMake command)
|
17
24
|
def initialize args={}
|
18
25
|
raise IllegalInitializationError unless args.is_a?(Hash)
|
19
26
|
|
@@ -21,7 +28,7 @@ module CKick
|
|
21
28
|
raise IllegalInitializationError, "cflags provided to dependencies is not an Array" unless cflags.is_a?(Array)
|
22
29
|
@cflags = cflags.collect do |flag|
|
23
30
|
CFlag.new(flag: flag)
|
24
|
-
|
31
|
+
end
|
25
32
|
|
26
33
|
cxxflags = args[:cxxflags] || []
|
27
34
|
raise IllegalInitializationError, "cxxflags provided to dependencied is not an Array" unless cxxflags.is_a?(Array)
|
@@ -42,27 +49,36 @@ module CKick
|
|
42
49
|
end
|
43
50
|
end
|
44
51
|
|
52
|
+
# converts to Hash (usable in CKickfile)
|
45
53
|
def to_hash
|
46
54
|
to_no_empty_value_hash
|
47
55
|
end
|
48
56
|
|
57
|
+
# CMakeLists's section content
|
49
58
|
def cmake
|
50
59
|
[@cflags, @cxxflags, @include, @lib].flatten(1).collect do |unit|
|
51
60
|
unit.cmake
|
52
61
|
end.join("\n")
|
53
62
|
end
|
54
63
|
|
64
|
+
# compiler flags in an Array
|
55
65
|
def flags
|
56
66
|
[@cflags, @cxxflags, @include, @lib].flatten(1).uniq.collect do |flag|
|
57
67
|
flag.raw_flag
|
58
68
|
end
|
59
69
|
end
|
60
70
|
|
71
|
+
# appends include path (-I) with +path+
|
72
|
+
#
|
73
|
+
# +path+ - include path, must be a CKick::IncludePath
|
61
74
|
def add_include(path)
|
62
75
|
raise BadIncludePathError, "path must be a CKick::IncludePath object" unless path.is_a?(IncludePath)
|
63
76
|
@include << path unless @include.include?(path)
|
64
77
|
end
|
65
78
|
|
79
|
+
# appends link path (-L) with +path+
|
80
|
+
#
|
81
|
+
# +path+ - link path, must be a CKick::LibraryPath
|
66
82
|
def add_lib(path)
|
67
83
|
raise BadLibraryPathError, "path must be a CKick::LibraryPath object" unless path.is_a?(LibraryPath)
|
68
84
|
@lib << path unless @lib.include?(path)
|
data/lib/ckick/executable.rb
CHANGED
data/lib/ckick/find_plugin.rb
CHANGED
@@ -2,9 +2,12 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
module CKick
|
7
|
+
# CKick::Plugin load path
|
6
8
|
$PLUGIN_PATH = [File.join(File.absolute_path(File.dirname(__FILE__)), "plugin")]
|
7
9
|
|
10
|
+
# finds ruby source files in $PLUGIN_PATH
|
8
11
|
def self.find_builtin_plugins
|
9
12
|
res = []
|
10
13
|
$PLUGIN_PATH.each do |dir|
|
@@ -16,6 +19,7 @@ module CKick
|
|
16
19
|
res.flatten(1)
|
17
20
|
end
|
18
21
|
|
22
|
+
# requires all ruby source files in $PLUGIN_PATH
|
19
23
|
def self.load_builtin_plugins
|
20
24
|
find_builtin_plugins.each do |file|
|
21
25
|
require file[0..-4]
|
data/lib/ckick/hash.rb
CHANGED
@@ -4,7 +4,10 @@
|
|
4
4
|
|
5
5
|
require "ckick/array"
|
6
6
|
|
7
|
+
# :nodoc:
|
7
8
|
class Hash
|
9
|
+
# transforms keys recursively
|
10
|
+
# * +block+ - transform operation
|
8
11
|
def array_aware_deep_transform_keys(&block)
|
9
12
|
result = {}
|
10
13
|
each do |key, value|
|
@@ -19,14 +22,17 @@ class Hash
|
|
19
22
|
result
|
20
23
|
end
|
21
24
|
|
25
|
+
# transforms each String-key to Symbol-key
|
22
26
|
def array_aware_deep_symbolize_keys
|
23
|
-
array_aware_deep_transform_keys{ |key| key.to_sym rescue key }
|
27
|
+
array_aware_deep_transform_keys { |key| key.to_sym rescue key }
|
24
28
|
end
|
25
29
|
|
30
|
+
# copy of the hash without pairs of +keys+
|
26
31
|
def without(*keys)
|
27
32
|
dup.without!(*keys)
|
28
33
|
end
|
29
34
|
|
35
|
+
# removes each pair of +keys+
|
30
36
|
def without!(*keys)
|
31
37
|
reject! { |key| keys.include?(key) }
|
32
38
|
end
|
data/lib/ckick/hash_elements.rb
CHANGED
@@ -2,37 +2,49 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
class String
|
7
|
+
#converts to hash-serializable value
|
6
8
|
def to_hash_element
|
7
9
|
self
|
8
10
|
end
|
9
11
|
end
|
10
12
|
|
13
|
+
# :nodoc:
|
11
14
|
class Fixnum
|
15
|
+
#converts to hash-serializable value
|
12
16
|
def to_hash_element
|
13
17
|
self
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
21
|
+
# :nodoc:
|
17
22
|
class Float
|
23
|
+
#converts to hash-serializable value
|
18
24
|
def to_hash_element
|
19
25
|
self
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
29
|
+
# :nodoc:
|
23
30
|
class TrueClass
|
31
|
+
#converts to hash-serializable value
|
24
32
|
def to_hash_element
|
25
33
|
self
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
37
|
+
# :nodoc:
|
29
38
|
class FalseClass
|
39
|
+
#converts to hash-serializable value
|
30
40
|
def to_hash_element
|
31
41
|
self
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
45
|
+
# :nodoc:
|
35
46
|
class Array
|
47
|
+
#converts to hash-serializable value
|
36
48
|
def to_hash_element
|
37
49
|
collect do |element|
|
38
50
|
if element.respond_to?(:to_hash)
|
@@ -44,7 +56,9 @@ class Array
|
|
44
56
|
end
|
45
57
|
end
|
46
58
|
|
59
|
+
# :nodoc:
|
47
60
|
class NilClass
|
61
|
+
#converts to hash-serializable value
|
48
62
|
def to_hash_element
|
49
63
|
self
|
50
64
|
end
|
data/lib/ckick/hashable.rb
CHANGED
@@ -6,7 +6,11 @@ require "ckick/hash"
|
|
6
6
|
require "ckick/hash_elements"
|
7
7
|
|
8
8
|
module CKick
|
9
|
+
|
10
|
+
# mixin enabling hash serialization
|
9
11
|
module Hashable
|
12
|
+
|
13
|
+
# transforms object to Hash such that { :instance_variable => value }
|
10
14
|
def to_hash
|
11
15
|
a = {}
|
12
16
|
instance_variables_as_key_values.each do |name, obj|
|
@@ -15,6 +19,7 @@ module CKick
|
|
15
19
|
a
|
16
20
|
end
|
17
21
|
|
22
|
+
# transforms object to Hash such that { :instance_variable => value }, excluding any pair where value responds +true+ to :empty? method
|
18
23
|
def to_no_empty_value_hash
|
19
24
|
a = {}
|
20
25
|
instance_variables_as_key_values.each do |name, obj|
|
data/lib/ckick/include_path.rb
CHANGED
@@ -6,11 +6,15 @@ require "ckick/path"
|
|
6
6
|
|
7
7
|
module CKick
|
8
8
|
|
9
|
+
#Represents a compiler include path (-I option or CMake include_directories() fonction)
|
9
10
|
class IncludePath < Path
|
11
|
+
|
12
|
+
#compiler flag as is
|
10
13
|
def raw_flag
|
11
14
|
"-I#{@path}"
|
12
15
|
end
|
13
16
|
|
17
|
+
#cmake code content
|
14
18
|
def cmake
|
15
19
|
%Q{include_directories(#{@path})}
|
16
20
|
end
|
data/lib/ckick/library.rb
CHANGED
@@ -6,13 +6,19 @@ require "ckick/target"
|
|
6
6
|
|
7
7
|
module CKick
|
8
8
|
|
9
|
+
# represents an library target (in respect to CMake add_library() command)
|
9
10
|
class Library < Target
|
11
|
+
|
12
|
+
# * +args+ - Target hash (directly a CKickfile library target element's hash parsed with keys as Symbol), must be a Hash
|
13
|
+
# ====== CKick::Library specific input hash keys (in addition of CKick::Target ones)
|
14
|
+
# * +:shared+ - whether or not this library should be a dynamic library (shared object) or a static library (archive)
|
10
15
|
def initialize args={}
|
11
16
|
super args
|
12
17
|
|
13
18
|
@shared = args[:shared] || false
|
14
19
|
end
|
15
20
|
|
21
|
+
# converts to Hash (for CKickfile)
|
16
22
|
def to_hash
|
17
23
|
if @shared
|
18
24
|
return super
|
@@ -21,6 +27,7 @@ module CKick
|
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
30
|
+
# CMakeLists content of the target
|
24
31
|
def cmake
|
25
32
|
res = []
|
26
33
|
|
data/lib/ckick/library_link.rb
CHANGED
@@ -2,28 +2,40 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
module CKick
|
6
7
|
|
8
|
+
# Represents a library link
|
9
|
+
# (-l compiler option or library name to be passed to CMake target_link_libraries() function)
|
7
10
|
class LibraryLink
|
8
11
|
|
12
|
+
# initializes object with an Hash
|
13
|
+
# hash keys:
|
14
|
+
# * +:name+ - library name (lib#{name}.a/.so) as is
|
9
15
|
def initialize args={}
|
10
16
|
name = args[:name] || ""
|
11
17
|
raise CKick::IllegalInitializationError, "No name provided to library link" unless name.is_a?(String) && !name.empty?
|
12
18
|
@name = name
|
13
19
|
end
|
14
20
|
|
21
|
+
# converts to hashable element
|
22
|
+
# name as is
|
15
23
|
def to_hash_element
|
16
24
|
@name
|
17
25
|
end
|
18
26
|
|
27
|
+
# converts to String
|
28
|
+
# name as is
|
19
29
|
def to_s
|
20
30
|
@name
|
21
31
|
end
|
22
32
|
|
33
|
+
# corresponding compiler link flag (-l option)
|
23
34
|
def raw_flag
|
24
35
|
"-l#{@name}"
|
25
36
|
end
|
26
37
|
|
38
|
+
# cmake code content (only library name, not command)
|
27
39
|
def cmake
|
28
40
|
@name
|
29
41
|
end
|
data/lib/ckick/library_path.rb
CHANGED
@@ -6,11 +6,15 @@ require "ckick/path"
|
|
6
6
|
|
7
7
|
module CKick
|
8
8
|
|
9
|
+
# Represents a library link path (in respect to compiler -L option and CMake link_directories() fonction)
|
9
10
|
class LibraryPath < Path
|
11
|
+
|
12
|
+
#compiler flag as is
|
10
13
|
def raw_flag
|
11
14
|
"-L#{@path}"
|
12
15
|
end
|
13
16
|
|
17
|
+
#cmake code content
|
14
18
|
def cmake
|
15
19
|
"link_directories(#{@path})"
|
16
20
|
end
|
data/lib/ckick/nil_class.rb
CHANGED
data/lib/ckick/path.rb
CHANGED
@@ -2,11 +2,14 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
module CKick
|
6
7
|
|
8
|
+
# Represents a file system path, it must exist
|
7
9
|
class Path
|
8
10
|
attr_reader :path
|
9
11
|
|
12
|
+
#initializes path, path must exist
|
10
13
|
def initialize args={}
|
11
14
|
raise IllegalInitializationError, "needs :path parameter" unless args.is_a?(Hash) && args[:path].is_a?(String)
|
12
15
|
raise NoSuchDirectoryError, "invalid path #{args[:path]}" unless Dir.exist?(args[:path])
|
@@ -14,10 +17,12 @@ module CKick
|
|
14
17
|
@path = args[:path]
|
15
18
|
end
|
16
19
|
|
20
|
+
#returns path as is
|
17
21
|
def to_s
|
18
22
|
@path
|
19
23
|
end
|
20
24
|
|
25
|
+
#converts to hash-serializable element
|
21
26
|
def to_hash_element
|
22
27
|
@path
|
23
28
|
end
|
data/lib/ckick/plugin.rb
CHANGED
@@ -4,10 +4,12 @@
|
|
4
4
|
|
5
5
|
require "ckick/plugin"
|
6
6
|
|
7
|
+
# Creates a .clang_complete file for clang auto completion
|
7
8
|
class ClangComplete < CKick::Plugin
|
8
|
-
# Creates a .clang_complete file for clang auto completion
|
9
9
|
|
10
|
+
# assembles project flags and writes a .clang_complete file at project root
|
10
11
|
def call(project)
|
12
|
+
# :nodoc:
|
11
13
|
def clang_complete project
|
12
14
|
project.dependencies.flags.join("\n")
|
13
15
|
end
|
@@ -2,10 +2,13 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# :nodoc:
|
5
6
|
module CKick
|
6
7
|
|
8
|
+
# :nodoc:
|
7
9
|
module PluginDelegate
|
8
10
|
|
11
|
+
# :nodoc:
|
9
12
|
def self.find(plugin)
|
10
13
|
Object.const_get(plugin[:name]).new(plugin[:args] || {})
|
11
14
|
end
|
data/lib/ckick/project.rb
CHANGED
@@ -11,13 +11,36 @@ require "ckick/plugin_delegate"
|
|
11
11
|
|
12
12
|
module CKick
|
13
13
|
|
14
|
+
# This class represents a CMake project (as a main CMakeLists)
|
14
15
|
class Project
|
15
16
|
include Hashable
|
16
|
-
attr_reader :subdirs, :dependencies, :root, :build_dir
|
17
17
|
|
18
|
+
# each project CKick::SubDirectory
|
19
|
+
attr_reader :subdirs
|
20
|
+
|
21
|
+
# project CKick::Dependencies
|
22
|
+
attr_reader :dependencies
|
23
|
+
|
24
|
+
# project root directory
|
25
|
+
attr_reader :root
|
26
|
+
|
27
|
+
# project build directory
|
28
|
+
attr_reader :build_dir
|
29
|
+
|
30
|
+
# project name match pattern
|
18
31
|
NAME_MATCH = /^[[A-Z][a-z]_[0-9]]+$/
|
32
|
+
|
33
|
+
# version match
|
19
34
|
CMAKE_VERSION_MATCH = /^[0-9](\.[0-9]){0,2}$/
|
20
35
|
|
36
|
+
# * +args+ - project hash (directly the CKickfile parsed with keys as Symbol), must be a Hash
|
37
|
+
# ====== Input hash keys
|
38
|
+
# * +:name+ - project name, must respect NAME_MATCH
|
39
|
+
# * +:cmake_min_version+ - CMake minimum version (must be String), defaults to '3', must match CMAKE_VERSION_MATCH
|
40
|
+
# * +:root+ - Project root directory, usually '.'
|
41
|
+
# * +:build_dir+ - Project build directory, usually 'build'
|
42
|
+
# * +:subdirs+ - subdirectories (in respect to CMake subdirectory() command), must be a Array of Hash passed to SubDirectory::new
|
43
|
+
# * +:plugins+ - Array of Hash containing {:name => CKick::Plugin class name, :args => args for respective :initialize method }
|
21
44
|
def initialize args
|
22
45
|
name = args[:name] || ""
|
23
46
|
raise IllegalInitializationError, "name must be a non-empty string only containing alphanumeric characters" unless name.is_a?(String) && name.match(NAME_MATCH)
|
@@ -54,23 +77,28 @@ module CKick
|
|
54
77
|
init_subdirs
|
55
78
|
end
|
56
79
|
|
80
|
+
# set the project name, must match NAME_MATCH
|
57
81
|
def set_name(name)
|
58
82
|
raise BadProjectNameError, "project name must be a non-empty alphanumeric string" unless name.is_a?(String) && name.match(NAME_MATCH)
|
59
83
|
@name = name
|
60
84
|
end
|
61
85
|
|
86
|
+
# convert to String -> the project name as is
|
62
87
|
def to_s
|
63
88
|
@name
|
64
89
|
end
|
65
90
|
|
91
|
+
# convert to Hash (to CKickfile)
|
66
92
|
def to_hash
|
67
93
|
to_no_empty_value_hash.without(:subdirs_initiated)
|
68
94
|
end
|
69
95
|
|
96
|
+
# project root directory path
|
70
97
|
def path
|
71
98
|
@root
|
72
99
|
end
|
73
100
|
|
101
|
+
# creates the project CMake structure
|
74
102
|
def create_structure
|
75
103
|
raise "SubDirectories have not been initiated" unless @subdirs_initiated
|
76
104
|
|
@@ -86,6 +114,7 @@ module CKick
|
|
86
114
|
call_plugins
|
87
115
|
end
|
88
116
|
|
117
|
+
# register an additionnal CKick::Plugin or block
|
89
118
|
def register_plugin(plugin=nil, &block)
|
90
119
|
raise ArgumentError, "" unless plugin.is_a?(::CKick::Plugin) || block
|
91
120
|
|
@@ -96,6 +125,7 @@ module CKick
|
|
96
125
|
end
|
97
126
|
end
|
98
127
|
|
128
|
+
# main project's CMakeLists.txt content
|
99
129
|
def cmake
|
100
130
|
append_plugin_paths
|
101
131
|
|
@@ -119,6 +149,7 @@ module CKick
|
|
119
149
|
|
120
150
|
private
|
121
151
|
|
152
|
+
# called at the end of Project::new
|
122
153
|
def init_subdirs
|
123
154
|
@subdirs.each do |subdir|
|
124
155
|
subdir.__send__ :set_parent, path
|
@@ -127,6 +158,7 @@ module CKick
|
|
127
158
|
@subdirs_initiated = true
|
128
159
|
end
|
129
160
|
|
161
|
+
# appends include path and library path by each CKick::Plugin#include and CKick::Plugin#lib
|
130
162
|
def append_plugin_paths
|
131
163
|
@plugins.each do |plugin|
|
132
164
|
plugin.include(self).each do |path|
|
@@ -138,22 +170,25 @@ module CKick
|
|
138
170
|
end
|
139
171
|
end
|
140
172
|
|
173
|
+
# ran before structure creation (calls each CKick::Plugin#run)
|
141
174
|
def run_plugins
|
142
175
|
@plugins.each do |plugin|
|
143
176
|
plugin.run(self) if plugin.respond_to? :run
|
144
177
|
end
|
145
178
|
end
|
146
179
|
|
180
|
+
# ran after structure creation (calls each CKick::Plugin#call)
|
147
181
|
def call_plugins
|
148
182
|
@plugins.each do |plugin|
|
149
183
|
plugin.call self
|
150
184
|
end
|
151
185
|
end
|
152
186
|
|
187
|
+
# plugins CMakeLists.txt content section in main CMakeLists.txt content
|
153
188
|
def plugins_cmake
|
154
189
|
res = "##ckick plugins section##\n"
|
155
190
|
|
156
|
-
def plugin_name(plugin)
|
191
|
+
def plugin_name(plugin) #:nodoc:
|
157
192
|
if plugin.respond_to?(:name)
|
158
193
|
return plugin.name
|
159
194
|
else
|
data/lib/ckick/sub_directory.rb
CHANGED
@@ -11,11 +11,26 @@ require "ckick/path_delegate"
|
|
11
11
|
|
12
12
|
module CKick
|
13
13
|
|
14
|
+
# Represents a project sub directory (in respect to CMake sub_directory() command)
|
14
15
|
class SubDirectory
|
15
16
|
include Hashable
|
16
17
|
|
17
|
-
|
18
|
+
# directory name
|
19
|
+
attr_reader :name
|
18
20
|
|
21
|
+
# parent directory
|
22
|
+
attr_reader :parent_dir
|
23
|
+
|
24
|
+
# whether or not this directory has targets and a CMakeLists.txt
|
25
|
+
attr_reader :has_cmake
|
26
|
+
|
27
|
+
# * +args+ - SubDirectory hash (directly a CKickfile :subdirs Array element parsed with keys as Symbol), must be a Hash
|
28
|
+
# ====== Input hash keys
|
29
|
+
# * +:name+ - subdirectory name
|
30
|
+
# * +:libraries+ - libraries built in this subdirectory (in respect to CMake add_library() command), Array of Hash each containing information for CKick::Library::new
|
31
|
+
# * +:executables+ - executables built in this subdirectory (in respect to CMake add_executable() command), Array of Hash each containing information for CKick::Executable::new
|
32
|
+
# * +:subdirs+ - recursive subdirectories (in respect to CMake subdirectory() command), must be a Array of Hash passed to CKick::SubDirectory::new
|
33
|
+
# * +:has_cmake+ - whether or not this subdirectory has a CMakeLists.txt (consequently builds targets or not)
|
19
34
|
def initialize args={}
|
20
35
|
name = args[:name]
|
21
36
|
raise IllegalInitializationError, "no name provided to sub directory" unless name.is_a?(String) && !name.empty?
|
@@ -52,10 +67,12 @@ module CKick
|
|
52
67
|
@parent_dir = nil
|
53
68
|
end
|
54
69
|
|
70
|
+
# converts to String, subdirectory name as is
|
55
71
|
def to_s
|
56
72
|
@name
|
57
73
|
end
|
58
74
|
|
75
|
+
# converts to Hash (to CKickfile :subdirs element)
|
59
76
|
def to_hash
|
60
77
|
if !@has_cmake
|
61
78
|
return to_no_empty_value_hash.without(:parent_dir)
|
@@ -63,11 +80,15 @@ module CKick
|
|
63
80
|
to_no_empty_value_hash.without(:parent_dir, :has_cmake)
|
64
81
|
end
|
65
82
|
|
83
|
+
# subdirectory path
|
66
84
|
def path
|
67
85
|
raise NoParentDirError, "sub directory #{@name} has no parent set" unless @parent_dir
|
68
86
|
File.join(@parent_dir, @name)
|
69
87
|
end
|
70
88
|
|
89
|
+
# creates subdirectory structure
|
90
|
+
#
|
91
|
+
# this method is called recursively on subdirectories
|
71
92
|
def create_structure
|
72
93
|
PathDelegate.create_directory(path)
|
73
94
|
|
@@ -84,6 +105,7 @@ module CKick
|
|
84
105
|
end
|
85
106
|
end
|
86
107
|
|
108
|
+
# subdirectory CMakeLists.txt file content
|
87
109
|
def cmake
|
88
110
|
res = ''
|
89
111
|
|
@@ -101,10 +123,14 @@ module CKick
|
|
101
123
|
|
102
124
|
private
|
103
125
|
|
126
|
+
# Array of all targets ( CKick::Target ) contained in this subdirectory
|
104
127
|
def targets
|
105
128
|
@executables + @libraries
|
106
129
|
end
|
107
130
|
|
131
|
+
# sets parent directory path
|
132
|
+
#
|
133
|
+
# this method is called recursively on subdirectories
|
108
134
|
def set_parent(parent_dir)
|
109
135
|
@parent_dir = parent_dir
|
110
136
|
|
data/lib/ckick/target.rb
CHANGED
@@ -9,9 +9,15 @@ require "ckick/hashable"
|
|
9
9
|
|
10
10
|
module CKick
|
11
11
|
|
12
|
+
# common representation of targets to build, such as executables and libraries
|
12
13
|
class Target
|
13
14
|
include Hashable
|
14
15
|
|
16
|
+
# * +args+ - Target hash (directly a CKickfile target element's hash parsed with keys as Symbol), must be a Hash
|
17
|
+
# ====== Input hash keys
|
18
|
+
# * +:name+ - name of the target
|
19
|
+
# * +:source+ - either a String (single-source file) or Array of String (multiple source files)
|
20
|
+
# * +:libs+ - names of the libraries to link to the target, must be Array of String
|
15
21
|
def initialize args={}
|
16
22
|
raise IllegalInitializationError unless args.is_a?(Hash) && !args.empty?
|
17
23
|
|
@@ -46,14 +52,17 @@ module CKick
|
|
46
52
|
@parent_dir = nil
|
47
53
|
end
|
48
54
|
|
55
|
+
# converts to Hash (for CKickfile)
|
49
56
|
def to_hash
|
50
57
|
to_no_empty_value_hash.without(:parent_dir)
|
51
58
|
end
|
52
59
|
|
60
|
+
# converts to String, the target's name as is
|
53
61
|
def to_s
|
54
62
|
@name
|
55
63
|
end
|
56
64
|
|
65
|
+
# Array of source file paths
|
57
66
|
def paths
|
58
67
|
raise NoParentDirError, "No parent directory has been set for target #{@name}" unless @parent_dir
|
59
68
|
res = []
|
@@ -63,6 +72,7 @@ module CKick
|
|
63
72
|
res
|
64
73
|
end
|
65
74
|
|
75
|
+
# creates target's structure (each missing source file)
|
66
76
|
def create_structure
|
67
77
|
paths.each do |path|
|
68
78
|
unless File.exist? path
|
@@ -73,6 +83,7 @@ module CKick
|
|
73
83
|
|
74
84
|
private
|
75
85
|
|
86
|
+
# set's parent directory
|
76
87
|
def set_parent(parent_dir)
|
77
88
|
@parent_dir = parent_dir
|
78
89
|
end
|
data/lib/ckick/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ckick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Gingras
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 4.2.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 4.2.2
|
55
69
|
description: CKick is a simple gem that helps to kick start a C/C++ project using
|
56
70
|
CMake with an arbitrary structure. Using a CKickfile (a simple JSON), ckick is able
|
57
71
|
to generate an whole project structure without having to write any CMakeLists.txt
|