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.
@@ -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
@@ -0,0 +1,2 @@
1
+ require 'cmaker'
2
+ puts CMaker.run(ARGV[0], ARGV[1])
@@ -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
@@ -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: []