def _str_generic_add_target(add_target_string_template: str, target_name: str, source_variable_name: str) -> str: add_target_string_str = cmake_format(add_target_string_template, target_name=target_name, source_variable_name='{' + source_variable_name + '}') return add_target_string_str
def str_list(list_name: str, list_value: [str]) -> str: set_list_template = 'list( APPEND {SHAKE_CMAKE_GENERATOR_list_name} {SHAKE_CMAKE_GENERATOR_list_value} )' set_list_str = cmake_format( set_list_template, list_name=list_name, list_value=python_list_to_cmake_list(list_value)) return set_list_str
def str_project( project_name : str, version : Version, languages : List[ Language ] ) -> str: set_project_template = ( "# ----------------------------------------------------------------\n" "# Project: {SHAKE_CMAKE_GENERATOR_project_name}\n" "\n" "project( {SHAKE_CMAKE_GENERATOR_project_name} VERSION {SHAKE_CMAKE_GENERATOR_version_major}.{SHAKE_CMAKE_GENERATOR_version_minor} LANGUAGES {SHAKE_CMAKE_GENERATOR_languages} )\n" "\n" ) languages_str = languages[0].value for current_language in languages[1:]: languages_str += " " + current_language.value set_project_str = cmake_format( set_project_template, project_name = project_name, version_major = version.major, version_minor = version.minor, languages = languages_str ) if Language.CUDA in languages: set_project_str += "find_package( CUDAToolkit )\n\n" return set_project_str
def str_cmake_config( out_directory : str ) -> str: cmake_config_template = """ # ---------------------------------------------------------------- # This CMake file is generated automatically by the Shake3 CMake Generator # Don't change this file. Reconfigure the generator instead. cmake_minimum_required( VERSION 3.12 ) # ---------------------------------------------------------------- # CMake configuration set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} ) set( CMAKE_LIBRARY_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} ) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} ) set( CMAKE_EXECUTABLE_OUTPUT_PATH {SHAKE_CMAKE_GENERATOR_out_directory} ) # this option is necessary to automatically export ALL symbols in a library on Windows, # without needing to specify __declspec( export ). # That means it also creates a .lib file for shared libraries set( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON ) """ cmake_config_string = cmake_format( cmake_config_template, out_directory = quote( out_directory ) ) return cmake_config_string
def str_import_target( target : ImportTarget, all_targets : Dict[ str, Target ] ) -> str: target_names = ', '.join( [ subtarget for subtarget in target.subtargets ] ) target_str = cmake_format( "# ----------------------------------------------------------------\n" "# Import Targets: {SHAKE_CMAKE_GENERATOR_target_names}\n", target_names = target_names ) target_str += target.pre_import_inline_cmake target_str += cmake_format( "add_subdirectory( {SHAKE_CMAKE_GENERATOR_src_dir_path} )\n", src_dir_path = quote( target.src_dir_path ) ) target_str += target.post_import_inline_cmake return target_str
def str_cmake_config(out_directory: str) -> str: cmake_config_template = ( "# ----------------------------------------------------------------\n" "# This CMake file is generated automatically by the Shake3 CMake Generator\n" "# Don't change this file. Reconfigure the generator instead.\n" "# For more info see: https://github.com/berryvansomeren/cmake_generator\n" "\n" "cmake_minimum_required( VERSION 3.17 )\n" "\n" "# ----------------------------------------------------------------\n" "# CMake configuration\n" "\n" "set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} )\n" "set( CMAKE_LIBRARY_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} )\n" "set( CMAKE_RUNTIME_OUTPUT_DIRECTORY {SHAKE_CMAKE_GENERATOR_out_directory} )\n" "set( CMAKE_EXECUTABLE_OUTPUT_PATH {SHAKE_CMAKE_GENERATOR_out_directory} )\n" "\n" "# this option is necessary to automatically export ALL symbols in a library on Windows,\n" "# without needing to specify __declspec( export ).\n" "# That means it also creates a .lib file for shared libraries\n" "set( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON )\n" "\n") cmake_config_string = cmake_format(cmake_config_template, out_directory=quote(out_directory)) return cmake_config_string
def _str_set_target_properties(target_name: str, property_name: str, property_value: str): set_target_properties_template = "set_target_properties( {SHAKE_CMAKE_GENERATOR_target_name} PROPERTIES {SHAKE_CMAKE_GENERATOR_property_name} {SHAKE_CMAKE_GENERATOR_property_value} )\n" set_target_properties_str = cmake_format(set_target_properties_template, target_name=target_name, property_name=property_name, property_value=property_value) return set_target_properties_str
def _str_target_link_libraries(target_name: str, library_names: List[str]): link_libraries_template = ( "target_link_libraries( {SHAKE_CMAKE_GENERATOR_target_name} PRIVATE\n" "{SHAKE_CMAKE_GENERATOR_library_names}\n" ")\n") link_libraries_string = cmake_format( link_libraries_template, target_name=target_name, library_names=indent(python_list_to_cmake_list(library_names), ' ')) return link_libraries_string
def str_string( string_name : str, string_value : str ) -> str: set_string_template = "string( APPEND {SHAKE_CMAKE_GENERATOR_string_name} {SHAKE_CMAKE_GENERATOR_string_value} )" set_string_str = cmake_format( set_string_template, string_name = string_name, string_value = string_value ) return set_string_str
def _str_target_include_directories(target_name: str, include_directories: List[str]): include_directories_template = ( "target_include_directories( {SHAKE_CMAKE_GENERATOR_target_name} PRIVATE\n" "{SHAKE_CMAKE_GENERATOR_include_directories}\n" ")\n") include_directories_string = cmake_format( include_directories_template, target_name=target_name, include_directories=indent( python_list_to_cmake_list_quoted(include_directories), ' ')) return include_directories_string
def str_project(project_name: str, version: Version) -> str: set_project_template = """ # ---------------------------------------------------------------- # Project: {SHAKE_CMAKE_GENERATOR_project_name} project( {SHAKE_CMAKE_GENERATOR_project_name} VERSION {SHAKE_CMAKE_GENERATOR_version_major}.{SHAKE_CMAKE_GENERATOR_version_minor} LANGUAGES CXX C ) """ set_project_str = cmake_format(set_project_template, project_name=project_name, version_major=version.major, version_minor=version.minor) return set_project_str
def str_new_target( target : NewTarget, all_targets : Dict[ str, Target ] ) -> str: target_str = cmake_format( "# ----------------------------------------------------------------\n" "# New Target: {SHAKE_CMAKE_GENERATOR_target_name}\n" "\n", target_name = target.name ) # gob the source files, and add the target source_variable_name = target.name + "_glob_files" target_str += str_file_glob_recurse( source_variable_name, make_glob_expression( target.src_dir_path ) ) target_str += _str_add_target( target, source_variable_name ) # set target properties if target.properties: for property_name, property_value in target.properties.items(): target_str += _str_set_target_properties( target.name, property_name, property_value ) + '\n' # add include directories of all dependencies # but also add a target's own source dir as include dir include_dirs = target.include_dirs.copy() for dependency_name in target.dependencies: if dependency_name not in all_targets: logging.warning( "Target specification for dependency {} was not found in generator registry. Assuming it's a package. No include dirs are added.".format( dependency_name ) ) continue dependency = all_targets[ dependency_name ] include_dirs.extend( dependency.include_dirs ) if include_dirs: target_str += _str_target_include_directories( target.name, include_dirs ) if target.dependencies : # link all dependency targets link_libraries = [] for dependency_name in target.dependencies: if dependency_name not in all_targets: logging.warning( "Target specification for dependency {} was not found in generator registry. Assuming it's a package. Linking library by name.".format( dependency_name ) ) link_libraries.append( dependency_name ) continue dependency = all_targets[ dependency_name ] if isinstance( dependency, HeaderOnlyLibrary ): # we don't link header only libraries by name continue if isinstance( dependency, NewTarget ): link_libraries.append( dependency.name ) if isinstance( dependency, ImportTarget ): for subtarget in dependency.subtargets: link_libraries.append( subtarget ) if link_libraries: target_str += _str_target_link_libraries( target.name, link_libraries ) target_str += cmake_format( "set_property( TARGET {SHAKE_CMAKE_GENERATOR_target_name} PROPERTY CXX_STANDARD 17 ) \n", target_name = target.name ) return target_str
def str_new_target(target: NewTarget, all_targets: Dict[str, Target]) -> str: target_str = cmake_format(""" # ---------------------------------------------------------------- # New Target: {SHAKE_CMAKE_GENERATOR_target_name} """, target_name=target.name) # gob the source files, and add the target source_variable_name = target.name + '_glob_files' target_str += str_file_glob_recurse( source_variable_name, make_glob_expression(target.src_dir_path)) target_str += _str_add_target(target, source_variable_name) # set target properties if target.properties: for property_name, property_value in target.properties.items(): target_str += _str_set_target_properties( target.name, property_name, property_value) + '\n' # add include directories of all dependencies # but also add a target's own source dir as include dir include_dirs = target.include_dirs.copy() for dependency_name in target.dependencies: if dependency_name not in all_targets: raise ValueError( 'Target specification for dependency {} was not found'.format( dependency_name)) dependency = all_targets[dependency_name] include_dirs.extend(dependency.include_dirs) if include_dirs: target_str += _str_target_include_directories(target.name, include_dirs) if target.dependencies: # link all dependency targets link_libraries = [] for dependency_name in target.dependencies: if dependency_name not in all_targets: raise ValueError( 'Target specification for dependency {} was not found'. format(dependency_name)) dependency = all_targets[dependency_name] if isinstance(dependency, HeaderOnlyTarget): continue if isinstance(dependency, NewTarget): link_libraries.append(dependency.name) if isinstance(dependency, ImportTarget): for subtarget in dependency.subtargets: link_libraries.append(subtarget) # we don't link header only libraries by name if link_libraries: target_str += _str_target_link_libraries(target.name, link_libraries) target_str += cmake_format(""" set_property( TARGET {SHAKE_CMAKE_GENERATOR_target_name} PROPERTY CXX_STANDARD 17 ) """, target_name=target.name) return target_str
def _str_list_files(set_file_template: str, file_variable_name: str, glob_expression: str) -> str: set_file_str = cmake_format(set_file_template, file_variable_name=file_variable_name, glob_expression=quote(glob_expression)) return set_file_str