Class: MxxRu::Cpp::Toolsets::GccFamily
- Inherits:
-
MxxRu::Cpp::Toolset
- Object
- MxxRu::Cpp::Toolset
- MxxRu::Cpp::Toolsets::GccFamily
- Defined in:
- lib/mxx_ru/cpp/toolsets/gcc_family.rb
Overview
Toolset implemetation for GCC compiler.
Direct Known Subclasses
Constant Summary collapse
- GCC_PORT_TAG =
Tag name, indicates gcc port beeing used.
"gcc_port"
- GCC_PORT_UNIX =
GCC_PORT: GCC on Unix/Linux.
"unix"
- GCC_PORT_MINGW =
GCC_PORT: MinGW on Win32.
"mingw"
- GCC_PORT_CYGWIN =
GCC_PORT: Cygwin on Win32.
"cygwin"
Constants inherited from MxxRu::Cpp::Toolset
MxxRu::Cpp::Toolset::COMPILER_NAME_TAG, MxxRu::Cpp::Toolset::CPP_COMPILER_NAME_TAG, MxxRu::Cpp::Toolset::C_COMPILER_NAME_TAG, MxxRu::Cpp::Toolset::IMPORT_LIBRARIAN_NAME_TAG, MxxRu::Cpp::Toolset::LIBRARIAN_NAME_TAG, MxxRu::Cpp::Toolset::LINKER_NAME_TAG, MxxRu::Cpp::Toolset::RC_NAME_TAG, MxxRu::Cpp::Toolset::Unknown_tag_ex
Instance Attribute Summary
Attributes inherited from MxxRu::Cpp::Toolset
Instance Method Summary collapse
-
#c_compiler_name ⇒ Object
Returns C compiler name.
-
#cpp_compiler_name ⇒ Object
Returns C++ compiler name.
-
#dll_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#dll_file_name.
-
#enclose_linker_include_lib_options_into_brackes(options) ⇒ Object
Enclose library list into brackets if necessary.
-
#exe_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#exe_file_name.
-
#implib_link_name(dll_real_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#implib_link_name.
-
#implib_link_path(dll_real_name, dll_real_path, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#implib_link_path.
-
#initialize(a_name) ⇒ GccFamily
constructor
A new instance of GccFamily.
-
#lib_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#lib_file_name.
-
#lib_link_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#lib_link_name.
-
#librarian_name ⇒ Object
Returns librarian name.
-
#linker_name ⇒ Object
Returns linker name.
-
#make_c_obj_command_lines(obj_name, source_name, compiler_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_c_obj_command_lines.
-
#make_cpp_obj_command_lines(obj_name, source_name, compiler_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_c_obj_command_lines.
-
#make_dll_command_lines(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_dll_command_lines.
-
#make_dll_requirements(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_dll_requirements.
-
#make_exe_command_lines(a_exe_name, a_exe_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_exe_command_lines.
-
#make_lib_command_lines(lib_name, obj_files, librarian_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_lib_command_lines.
-
#make_linker_include_lib_options(target, libs) ⇒ Object
Make fragment of linker command line which contains names of included libraries.
-
#make_toolset_id_string ⇒ Object
Create toolset identification string.
-
#obj_file_ext ⇒ Object
See description at MxxRu::Cpp::Toolset#obj_file_ext.
-
#port_specific_dll_link_options(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
Return string containing port-specific linker option for DLL linking.
-
#port_specific_exe_link_options(a_exe_name, a_exe_info, a_linker_lists, a_target) ⇒ Object
Return string containing port-specific linker option for EXE linking.
-
#port_specific_lib_name_checker(library_name) ⇒ Object
Return correct name of library to be given for linker.
-
#setup_mandatory_options(target) ⇒ Object
See description at MxxRu::Cpp::Toolset#setup_mandatory_options.
Methods inherited from MxxRu::Cpp::Toolset
#clean_dll, #clean_dll_specific_files, #clean_exe, #clean_exe_specific_files, #clean_lib, #clean_lib_specific_files, #clean_mswin_res, #clean_mswin_res_specific_files, #clean_objs, #force_cpp03, #force_cpp0x_std, #force_cpp11, #force_cpp14, #force_cpp17, #full_dll_name, #full_exe_name, #full_lib_name, has_linkable_dependecies?, #make_dll, #make_exe, #make_identification_string, #make_lib, #make_mswin_res, #make_mswin_res_command_lines, #make_objs, #name, #setup_tag, #tag
Constructor Details
#initialize(a_name) ⇒ GccFamily
Returns a new instance of GccFamily.
48 49 50 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 48 def initialize( a_name ) super( a_name ) end |
Instance Method Details
#c_compiler_name ⇒ Object
Returns C compiler name.
53 54 55 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 53 def c_compiler_name tag( [ C_COMPILER_NAME_TAG, COMPILER_NAME_TAG ], "gcc" ) end |
#cpp_compiler_name ⇒ Object
Returns C++ compiler name.
58 59 60 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 58 def cpp_compiler_name tag( [ CPP_COMPILER_NAME_TAG, COMPILER_NAME_TAG ], "g++" ) end |
#dll_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#dll_file_name.
175 176 177 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 175 def dll_file_name( source_name, target ) return construct_target_name( source_name, 'lib', '.so', target ) end |
#enclose_linker_include_lib_options_into_brackes(options) ⇒ Object
Enclose library list into brackets if necessary.
For example, on Linux -Wl,–start-group and -Wl,–end-group should be used around library list.
293 294 295 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 293 def ( ) "-Wl,--start-group #{} -Wl,--end-group " end |
#exe_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#exe_file_name.
250 251 252 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 250 def exe_file_name( source_name, target ) return construct_target_name( source_name, NO_PREFIX, NO_SUFFIX, target ) end |
#implib_link_name(dll_real_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#implib_link_name.
180 181 182 183 184 185 186 187 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 180 def implib_link_name( dll_real_name, target ) # Target name should be passed to linker on UNIX platform return lib_link_name( File.basename( target.mxx_target_name ), target ) end |
#implib_link_path(dll_real_name, dll_real_path, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#implib_link_path.
190 191 192 193 194 195 196 197 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 190 def implib_link_path( dll_real_name, dll_real_path, target ) # DLL name is the import library name on UNIX platform. return dll_real_path end |
#lib_file_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#lib_file_name.
152 153 154 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 152 def lib_file_name( source_name, target ) return construct_target_name( source_name, 'lib', '.a', target ) end |
#lib_link_name(source_name, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#lib_link_name.
157 158 159 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 157 def lib_link_name( source_name, target ) return source_name end |
#librarian_name ⇒ Object
Returns librarian name.
68 69 70 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 68 def librarian_name tag( LIBRARIAN_NAME_TAG, "ar" ) end |
#linker_name ⇒ Object
Returns linker name.
63 64 65 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 63 def linker_name tag( LINKER_NAME_TAG, "g++" ) end |
#make_c_obj_command_lines(obj_name, source_name, compiler_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_c_obj_command_lines.
126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 126 def make_c_obj_command_lines( obj_name, source_name, , target ) cmd_line = "-c -o #{obj_name} " + "#{.join(' ')} #{source_name}" return [ "#{c_compiler_name} #{cmd_line}" ] end |
#make_cpp_obj_command_lines(obj_name, source_name, compiler_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_c_obj_command_lines.
139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 139 def make_cpp_obj_command_lines( obj_name, source_name, , target ) cmd_line = "-c -o #{obj_name} " + "#{.join(' ')} #{source_name}" return [ "#{cpp_compiler_name} #{cmd_line}" ] end |
#make_dll_command_lines(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_dll_command_lines.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 200 def make_dll_command_lines( a_dll_name, a_dll_info, a_linker_lists, a_target ) result = "-shared " + "#{a_linker_lists..join(' ')} " + "-o #{a_dll_name} " a_linker_lists.lib_paths.each { |p| result << "-L#{p} " } result << "#{a_linker_lists.objs.join(' ')} " result << ( a_target, a_linker_lists.libs ) result << ( a_dll_name, a_dll_info, a_linker_lists, a_target ) return [ "#{linker_name} #{result}" ] end |
#make_dll_requirements(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_dll_requirements.
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 223 def make_dll_requirements( a_dll_name, a_dll_info, a_linker_lists, a_target ) result = DllRequirements.new # On UNIX all requirements are dependencies. # This library, as a first one. result.add_libs( [ BinaryLibrary.new( a_dll_info.link_name, BinaryLibrary::SHARED ) ] ) result.add_lib_paths( [ a_dll_info.link_path ] ) # And all required libraries. a_target.mxx_required_prjs.each { |d| if Toolset::has_linkable_dependecies?( d ) result.add_libs( d.mxx_required_libs ) result.add_lib_paths( d.mxx_required_lib_paths ) end } return result end |
#make_exe_command_lines(a_exe_name, a_exe_info, a_linker_lists, a_target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_exe_command_lines.
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 255 def make_exe_command_lines( a_exe_name, a_exe_info, a_linker_lists, a_target ) result = "#{a_linker_lists..join(' ')} " + "-o #{a_exe_name} " a_linker_lists.lib_paths.each { |p| result << "-L#{p} " } result << "#{a_linker_lists.objs.join(' ')} " result << ( a_target, a_linker_lists.libs ) result << ( a_exe_name, a_exe_info, a_linker_lists, a_target ) return [ "#{linker_name} #{result}" ] end |
#make_lib_command_lines(lib_name, obj_files, librarian_options, target) ⇒ Object
See description at MxxRu::Cpp::Toolset#make_lib_command_lines.
162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 162 def make_lib_command_lines( lib_name, obj_files, , target ) result = "-r #{.join(' ')} " + "#{lib_name} #{obj_files.join(' ')}" return [ "#{librarian_name} #{result}" ] end |
#make_linker_include_lib_options(target, libs) ⇒ Object
Make fragment of linker command line which contains names of included libraries.
- target
-
target for that this fragment will be prepared.
- libs
-
list of BinaryLibrary with required libraries.
281 282 283 284 285 286 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 281 def ( target, libs ) all_libs = libs.inject( '' ) { |r, l| r << '-l' << port_specific_lib_name_checker( l.name ) << ' ' } ( all_libs ) end |
#make_toolset_id_string ⇒ Object
Create toolset identification string.
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 323 def make_toolset_id_string result = IO.popen( "#{c_compiler_name} -v 2>&1", :err => [:child, :out] ) do |io| target = 'generic' version = 'unknown' io.each_line do |line| if /^Target:\s*(?<trgt>\S+)/ =~ line target = trgt elsif /^gcc version (?<v>\S+)/ =~ line version = v end end version + '--' + target end "gcc_#{result}" end |
#obj_file_ext ⇒ Object
See description at MxxRu::Cpp::Toolset#obj_file_ext.
121 122 123 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 121 def obj_file_ext return ".o" end |
#port_specific_dll_link_options(a_dll_name, a_dll_info, a_linker_lists, a_target) ⇒ Object
Return string containing port-specific linker option for DLL linking.
All parameters are similar to make_dll_command_lines parameters.
Return empty string in a base class.
302 303 304 305 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 302 def ( a_dll_name, a_dll_info, a_linker_lists, a_target ) return "" end |
#port_specific_exe_link_options(a_exe_name, a_exe_info, a_linker_lists, a_target) ⇒ Object
Return string containing port-specific linker option for EXE linking.
All parameters are similar to make_exe_command_lines parameters.
Return empty string in a base class.
312 313 314 315 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 312 def ( a_exe_name, a_exe_info, a_linker_lists, a_target ) return "" end |
#port_specific_lib_name_checker(library_name) ⇒ Object
Return correct name of library to be given for linker.
318 319 320 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 318 def port_specific_lib_name_checker(library_name) library_name end |
#setup_mandatory_options(target) ⇒ Object
See description at MxxRu::Cpp::Toolset#setup_mandatory_options.
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/mxx_ru/cpp/toolsets/gcc_family.rb', line 73 def ( target ) if RUNTIME_DEBUG == target.mxx_runtime_mode target.compiler_option( "-g" ) target.linker_option( "-g" ) elsif RUNTIME_RELEASE == target.mxx_runtime_mode target.define( "NDEBUG" ) target.linker_option( "-s" ) if OPTIM_SIZE == target.mxx_optimization target.compiler_option( "-Os" ) else target.compiler_option( "-O2" ) end end if RTTI_DISABLED == target.mxx_rtti_mode target.cpp_compiler_option( "-fno-rtti" ) end if RTL_STATIC == target.mxx_rtl_mode target.linker_option( "-static-libgcc" ) else target.linker_option( "-shared-libgcc" ) end target.mxx_all_defines.each { |d| target.compiler_option( "-D" + d ) } target.mxx_all_include_paths.each { |p| target.compiler_option( "-I" + p ) } if CPP_STD17 == cpp_std target.cpp_compiler_option( '-std=c++17' ) elsif CPP_STD14 == cpp_std target.cpp_compiler_option( '-std=c++14' ) elsif CPP_STD11 == cpp_std target.cpp_compiler_option( '-std=c++11' ) end if CPP_STD11 <= cpp_std and THREADING_MULTI == target.mxx_threading_mode target.linker_option( '-pthread' ) end end |