示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#6
0
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
示例#7
0
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
示例#8
0
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
示例#9
0
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
示例#10
0
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
示例#11
0
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
示例#12
0
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
示例#13
0
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
示例#14
0
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