cmaker 0.0.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 +7 -0
- data/bin/cmaker +2 -0
- data/lib/cmaker.rb +113 -0
- data/lib/cmaker/file.rb +22 -0
- data/lib/cmaker/strings.rb +67 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5afe44c9c66fac89252b996e62693ba9fa68b869
|
4
|
+
data.tar.gz: 695c4bb254d86992389b407a75a406d4316653af
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4a974bbee685d3eb72ef47a2a6aa57af0b5ac25e682ba2e685d6241cfcb46d2f1c92b81b588e66dbf3da4346b33563ff5f95dea8092664f23c6ed78c89fb5789
|
7
|
+
data.tar.gz: 73366aa19a8633e3e863eafd2eaa463e5d9185e7a4e9f12e4b6b3249cb2a3f7a039ff6dba30231841135e39565750b110e76e3d3ebed8a2df73d6505e97a9292
|
data/bin/cmaker
ADDED
data/lib/cmaker.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'git'
|
4
|
+
require 'cmaker/strings'
|
5
|
+
require 'cmaker/file'
|
6
|
+
|
7
|
+
GEM_NAME = "cmaker"
|
8
|
+
MAKE_PROJECT_COMMAND = "makeproject"
|
9
|
+
GOOGLE_TEST_REPO = "https://github.com/google/googletest.git"
|
10
|
+
GOOGLE_TEST_DIR_NAME = "googletest"
|
11
|
+
|
12
|
+
class CMaker
|
13
|
+
def self.run(command, project_name)
|
14
|
+
case command
|
15
|
+
when MAKE_PROJECT_COMMAND
|
16
|
+
self.create_project(project_name)
|
17
|
+
else
|
18
|
+
puts GemStrings.gem_description()
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.create_project(project_name)
|
23
|
+
if project_name == nil
|
24
|
+
puts GemStrings.no_project_name_error()
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
project_dir_path = project_name
|
29
|
+
|
30
|
+
# Check for naming conflict
|
31
|
+
if Dir.exists?(project_dir_path)
|
32
|
+
puts "Can't create project. There's already a directory with the name \'#{project_name}\'."
|
33
|
+
return
|
34
|
+
end
|
35
|
+
|
36
|
+
puts "Creating project \'#{project_name}\'..."
|
37
|
+
|
38
|
+
# Define names and paths
|
39
|
+
temp_dir_path = "#{project_name}/.tmp"
|
40
|
+
executable_name = "run#{project_name}"
|
41
|
+
test_executable_name = "run#{project_name}Tests"
|
42
|
+
|
43
|
+
code_dir_name = project_name
|
44
|
+
code_dir_path = "#{project_name}/#{code_dir_name}"
|
45
|
+
test_dir_name = "#{project_name}Tests"
|
46
|
+
test_dir_path = "#{project_name}/#{test_dir_name}"
|
47
|
+
main_file_path = "#{project_dir_path}/main.cpp"
|
48
|
+
test_lib_dir_path = "#{test_dir_path}/lib"
|
49
|
+
|
50
|
+
gtest_dir_name = "lib/#{GOOGLE_TEST_DIR_NAME}"
|
51
|
+
gtest_dir_path = "#{test_dir_path}/#{gtest_dir_name}"
|
52
|
+
unit_test_dir_name = "tests"
|
53
|
+
unit_test_dir_path = "#{test_dir_path}/#{unit_test_dir_name}"
|
54
|
+
|
55
|
+
empty_test_file_name = "empty_test.cpp"
|
56
|
+
empty_test_file_path = "#{test_dir_path}/#{unit_test_dir_name}/#{empty_test_file_name}"
|
57
|
+
|
58
|
+
empty_header_name = "#{project_name}.h"
|
59
|
+
empty_header_path = "#{code_dir_path}/#{empty_header_name}"
|
60
|
+
empty_cpp_name = "#{project_name}.cpp"
|
61
|
+
empty_cpp_file_path = "#{code_dir_path}/#{empty_cpp_name}"
|
62
|
+
|
63
|
+
# CMake contents
|
64
|
+
project_cmake = GemStrings.project_dir_cmake_content(project_name, executable_name, code_dir_name, test_dir_name)
|
65
|
+
code_make = GemStrings.code_dir_cmake_content(code_dir_name, empty_header_name, empty_cpp_name)
|
66
|
+
test_cmake = GemStrings.test_dir_cmake_content(test_dir_name, gtest_dir_name, unit_test_dir_name)
|
67
|
+
tests_cmake = GemStrings.tests_dir_cmake_content(test_executable_name, empty_test_file_name, code_dir_name)
|
68
|
+
|
69
|
+
# Create directories
|
70
|
+
FileHelpers.create_directory(temp_dir_path, nil)
|
71
|
+
FileHelpers.create_directory(project_dir_path, project_cmake)
|
72
|
+
FileHelpers.create_directory(code_dir_path, code_make)
|
73
|
+
FileHelpers.create_directory(test_dir_path, test_cmake)
|
74
|
+
FileHelpers.create_directory(gtest_dir_path, nil)
|
75
|
+
FileHelpers.create_directory(unit_test_dir_path, tests_cmake)
|
76
|
+
|
77
|
+
# Create code files
|
78
|
+
FileHelpers.write_string_to_file(GemStrings.main_file_content(), main_file_path)
|
79
|
+
FileHelpers.write_string_to_file(GemStrings.empty_test_file_content(), empty_test_file_path)
|
80
|
+
|
81
|
+
FileHelpers.write_string_to_file(GemStrings.empty_header_contents(), empty_header_path)
|
82
|
+
FileHelpers.write_string_to_file(GemStrings.empty_cpp_contents(), empty_cpp_file_path)
|
83
|
+
|
84
|
+
# Add google test
|
85
|
+
puts "Adding \'Google Test\'..."
|
86
|
+
|
87
|
+
begin
|
88
|
+
self.add_google_test(test_lib_dir_path, temp_dir_path)
|
89
|
+
rescue
|
90
|
+
puts "Google Test installation failed, unable to create project"
|
91
|
+
self.handle_fatal_error(project_dir_path)
|
92
|
+
return
|
93
|
+
end
|
94
|
+
|
95
|
+
# Clean up
|
96
|
+
FileHelpers.delete_directory(temp_dir_path)
|
97
|
+
|
98
|
+
puts "Finished successfully"
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.add_google_test(lib_directory, temp_dir_path)
|
102
|
+
clone_directory = "#{temp_dir_path}/google_test_clone"
|
103
|
+
googletest_clone_directory = "#{clone_directory}/#{GOOGLE_TEST_DIR_NAME}"
|
104
|
+
|
105
|
+
Git.clone(GOOGLE_TEST_REPO, clone_directory)
|
106
|
+
|
107
|
+
FileUtils.cp_r googletest_clone_directory, lib_directory
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.handle_fatal_error(project_dir)
|
111
|
+
FileHelpers.delete_directory(project_dir)
|
112
|
+
end
|
113
|
+
end
|
data/lib/cmaker/file.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
class FileHelpers
|
4
|
+
def self.create_directory(directory_path, cmake_string)
|
5
|
+
FileUtils.mkpath directory_path
|
6
|
+
|
7
|
+
if cmake_string.nil? == false
|
8
|
+
cmake_file_path = "#{directory_path}/CMakeLists.txt"
|
9
|
+
self.write_string_to_file(cmake_string, cmake_file_path)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.delete_directory(directory_path)
|
14
|
+
FileUtils.rm_r(directory_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.write_string_to_file(file_content, file_path)
|
18
|
+
cmake = File.new(file_path, "w")
|
19
|
+
cmake.puts(file_content)
|
20
|
+
cmake.close
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class GemStrings
|
2
|
+
def self.gem_description()
|
3
|
+
return "Usage:\n\n\t$ #{GEM_NAME} COMMAND\n\n" \
|
4
|
+
"Commands:\n\n\t+ #{MAKE_PROJECT_COMMAND} [NAME]\t" \
|
5
|
+
"Creates a C++ project integrated with CMake and Google Test"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.no_project_name_error()
|
9
|
+
return "Please supply a name for the project, like so:\n\n" \
|
10
|
+
"\t$ #{GEM_NAME} #{MAKE_PROJECT_COMMAND} [NAME]"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.project_dir_cmake_content(project_name, executable_name, code_dir_name, test_dir_name)
|
14
|
+
return "cmake_minimum_required(VERSION 3.6)\n" \
|
15
|
+
"project(#{project_name})\n\n" \
|
16
|
+
"set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")\n\n" \
|
17
|
+
"set(SOURCE_FILES main.cpp)\n" \
|
18
|
+
"add_executable(#{executable_name} ${SOURCE_FILES})\n\n" \
|
19
|
+
"include_directories(#{code_dir_name})\n\n" \
|
20
|
+
"add_subdirectory(#{code_dir_name})\n" \
|
21
|
+
"add_subdirectory(#{test_dir_name})\n\n" \
|
22
|
+
"target_link_libraries(#{executable_name} #{code_dir_name})\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.code_dir_cmake_content(dir_name, header_file_name, cpp_file_name)
|
26
|
+
return "project(#{dir_name})\n\n" \
|
27
|
+
"add_library(#{dir_name} #{header_file_name} #{cpp_file_name})\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.test_dir_cmake_content(dir_name, gtest_dir_name, tests_dir_name)
|
31
|
+
return "project(#{dir_name})\n\n" \
|
32
|
+
"add_subdirectory(#{gtest_dir_name})\n" \
|
33
|
+
"add_subdirectory(#{tests_dir_name})\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.tests_dir_cmake_content(test_executable_name, empty_test_file_name, code_dir_name)
|
37
|
+
return "include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})\n\n" \
|
38
|
+
"add_executable(#{test_executable_name} #{empty_test_file_name})\n\n" \
|
39
|
+
"target_link_libraries(#{test_executable_name} gtest gtest_main)\n" \
|
40
|
+
"target_link_libraries(#{test_executable_name} #{code_dir_name})\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.main_file_content()
|
44
|
+
return "#include <iostream>\n\n" \
|
45
|
+
"int main() {\n" \
|
46
|
+
"\tstd::cout << \"Hello, World!\" << std::endl;\n" \
|
47
|
+
"\treturn 0;\n" \
|
48
|
+
"}\n"
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.empty_test_file_content()
|
52
|
+
return "#include \"gtest/gtest.h\"\n\n" \
|
53
|
+
"TEST(test_functionality, test_pass) {\n" \
|
54
|
+
"\tEXPECT_EQ(1, 1);\n" \
|
55
|
+
"}\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.empty_header_contents()
|
59
|
+
return ""
|
60
|
+
# return "#ifndef "EMPTYPROJECT"_"MYPROJECT"_H\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.empty_cpp_contents()
|
64
|
+
return ""
|
65
|
+
# return "#include \"" + empty_header_name + "\"\n"
|
66
|
+
end
|
67
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cmaker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Gluszak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: git
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.3.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.3.0
|
27
|
+
description: A convenient way to get C++ projects running with Google Test
|
28
|
+
email: john.gluszak@gmail.com
|
29
|
+
executables:
|
30
|
+
- cmaker
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/cmaker.rb
|
35
|
+
- lib/cmaker/strings.rb
|
36
|
+
- lib/cmaker/file.rb
|
37
|
+
- bin/cmaker
|
38
|
+
homepage: https://github.com/JohnGluszak/
|
39
|
+
licenses:
|
40
|
+
- MIT
|
41
|
+
metadata: {}
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 2.0.14.1
|
59
|
+
signing_key:
|
60
|
+
specification_version: 4
|
61
|
+
summary: C++ project management
|
62
|
+
test_files: []
|