ckick 0.1.0 → 0.1.1
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 +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 [](https://travis-ci.org/jonathangingras/ckick)
|
1
|
+
# CKick [](https://travis-ci.org/jonathangingras/ckick) [](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
|