ckick 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +3 -0
- data/LICENSE +373 -0
- data/README.md +20 -0
- data/Rakefile +6 -0
- data/bin/ckick +84 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ckick.gemspec +27 -0
- data/lib/ckick.rb +54 -0
- data/lib/ckick/array.rb +19 -0
- data/lib/ckick/cflag.rb +15 -0
- data/lib/ckick/ckickfile.rb +11 -0
- data/lib/ckick/compiler_flag.rb +39 -0
- data/lib/ckick/cxxflag.rb +15 -0
- data/lib/ckick/dependencies.rb +72 -0
- data/lib/ckick/executable.rb +23 -0
- data/lib/ckick/find_plugin.rb +25 -0
- data/lib/ckick/hash.rb +33 -0
- data/lib/ckick/hash_elements.rb +51 -0
- data/lib/ckick/hashable.rb +44 -0
- data/lib/ckick/include_path.rb +19 -0
- data/lib/ckick/library.rb +37 -0
- data/lib/ckick/library_link.rb +32 -0
- data/lib/ckick/library_path.rb +19 -0
- data/lib/ckick/nil_class.rb +8 -0
- data/lib/ckick/path.rb +26 -0
- data/lib/ckick/path_delegate.rb +29 -0
- data/lib/ckick/plugin.rb +47 -0
- data/lib/ckick/plugin/clang_complete.rb +19 -0
- data/lib/ckick/plugin/gtest.rb +44 -0
- data/lib/ckick/plugin/resource/build-gtest.cmake +17 -0
- data/lib/ckick/plugin_delegate.rb +15 -0
- data/lib/ckick/project.rb +173 -0
- data/lib/ckick/sub_directory.rb +121 -0
- data/lib/ckick/target.rb +81 -0
- data/lib/ckick/version.rb +7 -0
- data/resource/default_cxx_project.json +40 -0
- metadata +129 -0
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "ckick"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/ckick.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ckick/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ckick"
|
8
|
+
spec.version = CKick::VERSION
|
9
|
+
spec.authors = ["Jonathan Gingras"]
|
10
|
+
spec.email = ["jonathan.gingras.1@gmail.com"]
|
11
|
+
spec.license = "MPL-2.0"
|
12
|
+
|
13
|
+
spec.summary = %q{Kick start a C/C++ CMake project structure from a single JSON file}
|
14
|
+
spec.description = %q{CKick is a simple gem that helps to kick start a C/C++ project using CMake with an arbitrary structure. Using a CKickfile (a simple JSON), ckick is able to generate an whole project structure without having to write any CMakeLists.txt by your own.}
|
15
|
+
spec.homepage = "https://github.com/jonathangingras/ckick"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.13"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
end
|
data/lib/ckick.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/version"
|
6
|
+
require "ckick/project"
|
7
|
+
require "ckick/find_plugin"
|
8
|
+
require "ckick/ckickfile"
|
9
|
+
|
10
|
+
module CKick
|
11
|
+
RESOURCE_DIR = File.join(File.dirname(File.dirname(__FILE__)), "resource")
|
12
|
+
|
13
|
+
class Error < ::Exception
|
14
|
+
end
|
15
|
+
|
16
|
+
class BadFlagError < Error
|
17
|
+
end
|
18
|
+
|
19
|
+
class NoSuchDirectoryError < Error
|
20
|
+
end
|
21
|
+
|
22
|
+
class IllegalInitializationError < Error
|
23
|
+
end
|
24
|
+
|
25
|
+
class NoNameError < Error
|
26
|
+
end
|
27
|
+
|
28
|
+
class NoSourceError < Error
|
29
|
+
end
|
30
|
+
|
31
|
+
class BadProjectNameError < Error
|
32
|
+
end
|
33
|
+
|
34
|
+
class BadSourceError < Error
|
35
|
+
end
|
36
|
+
|
37
|
+
class BadLibError < Error
|
38
|
+
end
|
39
|
+
|
40
|
+
class BadIncludePathError < Error
|
41
|
+
end
|
42
|
+
|
43
|
+
class BadLibraryPathError < Error
|
44
|
+
end
|
45
|
+
|
46
|
+
class BadSubDirectoryError < Error
|
47
|
+
end
|
48
|
+
|
49
|
+
class NoParentDirError < Error
|
50
|
+
end
|
51
|
+
|
52
|
+
class BadFileContentError < Error
|
53
|
+
end
|
54
|
+
end
|
data/lib/ckick/array.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/hash"
|
6
|
+
|
7
|
+
class Array
|
8
|
+
def array_aware_deep_transform_keys(&block)
|
9
|
+
result = []
|
10
|
+
each do |value|
|
11
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
12
|
+
result << value.array_aware_deep_transform_keys(&block)
|
13
|
+
else
|
14
|
+
result << value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
result
|
18
|
+
end
|
19
|
+
end
|
data/lib/ckick/cflag.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/compiler_flag"
|
6
|
+
|
7
|
+
module CKick
|
8
|
+
|
9
|
+
class CFlag < CompilerFlag
|
10
|
+
def cmake
|
11
|
+
%Q(set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} #{@content}"))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
module CKick
|
8
|
+
def self.load_ckickfile(dir=Dir.pwd, filename="CKickfile")
|
9
|
+
JSON.parse(File.read(File.join(dir, filename)), symbolize_names: true)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
module CKick
|
6
|
+
|
7
|
+
class CompilerFlag
|
8
|
+
attr_reader :content
|
9
|
+
|
10
|
+
def initialize args={}
|
11
|
+
raise IllegalInitializationError, "No flag provided to compiler flag" unless args.is_a?(Hash) && !args.empty?
|
12
|
+
flag = args[:flag] || nil
|
13
|
+
raise BadFlagError, "Bad flag content provided to compiler flag" unless flag.is_a?(String) && !flag.empty?
|
14
|
+
|
15
|
+
@content = args[:flag]
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@content
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash_element
|
23
|
+
@content
|
24
|
+
end
|
25
|
+
|
26
|
+
def raw_flag
|
27
|
+
@content
|
28
|
+
end
|
29
|
+
|
30
|
+
def eql? other
|
31
|
+
@content.eql? other.content
|
32
|
+
end
|
33
|
+
|
34
|
+
def hash
|
35
|
+
@content.hash
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/compiler_flag"
|
6
|
+
|
7
|
+
module CKick
|
8
|
+
|
9
|
+
class CXXFlag < CompilerFlag
|
10
|
+
def cmake
|
11
|
+
%Q(set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} #{@content}"))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/nil_class"
|
6
|
+
require "ckick/cflag"
|
7
|
+
require "ckick/cxxflag"
|
8
|
+
require "ckick/include_path"
|
9
|
+
require "ckick/library_path"
|
10
|
+
require "ckick/hashable"
|
11
|
+
|
12
|
+
module CKick
|
13
|
+
|
14
|
+
class Dependencies
|
15
|
+
include Hashable
|
16
|
+
|
17
|
+
def initialize args={}
|
18
|
+
raise IllegalInitializationError unless args.is_a?(Hash)
|
19
|
+
|
20
|
+
cflags = args[:cflags] || []
|
21
|
+
raise IllegalInitializationError, "cflags provided to dependencies is not an Array" unless cflags.is_a?(Array)
|
22
|
+
@cflags = cflags.collect do |flag|
|
23
|
+
CFlag.new(flag: flag)
|
24
|
+
end
|
25
|
+
|
26
|
+
cxxflags = args[:cxxflags] || []
|
27
|
+
raise IllegalInitializationError, "cxxflags provided to dependencied is not an Array" unless cxxflags.is_a?(Array)
|
28
|
+
@cxxflags = cxxflags.collect do |flag|
|
29
|
+
CXXFlag.new(flag: flag)
|
30
|
+
end
|
31
|
+
|
32
|
+
includes = args[:include] || []
|
33
|
+
raise IllegalInitializationError, "include provided to dependencies is not an Array" unless includes.is_a?(Array)
|
34
|
+
@include = includes.collect do |include|
|
35
|
+
IncludePath.new(path: include)
|
36
|
+
end
|
37
|
+
|
38
|
+
libs = args[:lib] || []
|
39
|
+
raise IllegalInitializationError, "lib provided to dependencies is not an Array" unless libs.is_a?(Array)
|
40
|
+
@lib = libs.collect do |lib|
|
41
|
+
LibraryPath.new(path: lib)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_hash
|
46
|
+
to_no_empty_value_hash
|
47
|
+
end
|
48
|
+
|
49
|
+
def cmake
|
50
|
+
[@cflags, @cxxflags, @include, @lib].flatten(1).collect do |unit|
|
51
|
+
unit.cmake
|
52
|
+
end.join("\n")
|
53
|
+
end
|
54
|
+
|
55
|
+
def flags
|
56
|
+
[@cflags, @cxxflags, @include, @lib].flatten(1).uniq.collect do |flag|
|
57
|
+
flag.raw_flag
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_include(path)
|
62
|
+
raise BadIncludePathError, "path must be a CKick::IncludePath object" unless path.is_a?(IncludePath)
|
63
|
+
@include << path unless @include.include?(path)
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_lib(path)
|
67
|
+
raise BadLibraryPathError, "path must be a CKick::LibraryPath object" unless path.is_a?(LibraryPath)
|
68
|
+
@lib << path unless @lib.include?(path)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/target"
|
6
|
+
|
7
|
+
module CKick
|
8
|
+
|
9
|
+
class Executable < Target
|
10
|
+
def cmake
|
11
|
+
res = []
|
12
|
+
|
13
|
+
res << "add_executable(#{@name} #{@source.join(' ')})"
|
14
|
+
|
15
|
+
unless @libs.empty?
|
16
|
+
res << "target_link_libraries(#{@name} #{@libs.join(' ')})"
|
17
|
+
end
|
18
|
+
|
19
|
+
res.join("\n")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
module CKick
|
6
|
+
$PLUGIN_PATH = [File.join(File.absolute_path(File.dirname(__FILE__)), "plugin")]
|
7
|
+
|
8
|
+
def self.find_builtin_plugins
|
9
|
+
res = []
|
10
|
+
$PLUGIN_PATH.each do |dir|
|
11
|
+
files = Dir.entries(dir).select { |entry| entry.length > 3 && entry[-3..-1] == '.rb'}
|
12
|
+
files.each do |file|
|
13
|
+
res << File.join(dir, file)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
res.flatten(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.load_builtin_plugins
|
20
|
+
find_builtin_plugins.each do |file|
|
21
|
+
require file[0..-4]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/ckick/hash.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/array"
|
6
|
+
|
7
|
+
class Hash
|
8
|
+
def array_aware_deep_transform_keys(&block)
|
9
|
+
result = {}
|
10
|
+
each do |key, value|
|
11
|
+
new_key = yield(key)
|
12
|
+
|
13
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
14
|
+
result[new_key] = value.array_aware_deep_transform_keys(&block)
|
15
|
+
else
|
16
|
+
result[new_key] = value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
def array_aware_deep_symbolize_keys
|
23
|
+
array_aware_deep_transform_keys{ |key| key.to_sym rescue key }
|
24
|
+
end
|
25
|
+
|
26
|
+
def without(*keys)
|
27
|
+
dup.without!(*keys)
|
28
|
+
end
|
29
|
+
|
30
|
+
def without!(*keys)
|
31
|
+
reject! { |key| keys.include?(key) }
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
class String
|
6
|
+
def to_hash_element
|
7
|
+
self
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Fixnum
|
12
|
+
def to_hash_element
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Float
|
18
|
+
def to_hash_element
|
19
|
+
self
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class TrueClass
|
24
|
+
def to_hash_element
|
25
|
+
self
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class FalseClass
|
30
|
+
def to_hash_element
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Array
|
36
|
+
def to_hash_element
|
37
|
+
collect do |element|
|
38
|
+
if element.respond_to?(:to_hash)
|
39
|
+
element.to_hash
|
40
|
+
else
|
41
|
+
element.to_hash_element
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class NilClass
|
48
|
+
def to_hash_element
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
require "ckick/hash"
|
6
|
+
require "ckick/hash_elements"
|
7
|
+
|
8
|
+
module CKick
|
9
|
+
module Hashable
|
10
|
+
def to_hash
|
11
|
+
a = {}
|
12
|
+
instance_variables_as_key_values.each do |name, obj|
|
13
|
+
a[name] = object_value(obj)
|
14
|
+
end
|
15
|
+
a
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_no_empty_value_hash
|
19
|
+
a = {}
|
20
|
+
instance_variables_as_key_values.each do |name, obj|
|
21
|
+
if !obj.respond_to?(:empty?) || (obj.respond_to?(:empty?) && !obj.empty?)
|
22
|
+
a[name] = object_value(obj)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
a
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def instance_variables_as_key_values
|
31
|
+
instance_variables.collect do |att|
|
32
|
+
[att[1..-1].to_sym, instance_variable_get(att.to_sym)]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def object_value(obj)
|
37
|
+
if obj.respond_to?(:to_hash)
|
38
|
+
return obj.to_hash
|
39
|
+
else
|
40
|
+
return obj.to_hash_element
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|