Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ confidence=
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
#disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating
disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating,C0103,W0703,R0912,R0915,R0902,R0801,R0201,C0302,W0406,E1101,W0611,C0209
disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating,C0103,W0703,R0912,R0915,R0902,R0801,R0201,C0302,W0406,E1101,W0611,C0209,W0221,C2801


[REPORTS]
Expand Down
2 changes: 2 additions & 0 deletions cmake_converter/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ def __init__(self):
self.warn_level = 2
self.private_include_directories = False
self.ignore_absent_sources = False
self.advanced_precompiled_headers = False
self.disable_interprocedural_optimization = False
self.indent = ' '

self.sln_configurations_map = {}
Expand Down
24 changes: 23 additions & 1 deletion cmake_converter/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def main(): # pragma: no cover
"""

usage = "cmake-converter -s <path/to/file.sln> " \
"[ -h | -s | -p | -i | -d | -v | -w | -j | -a | -pi | -ias ]"
"[ -h | -s | -p | -i | -d | -v | -w | -j | -a | -pi | -ias | -pch | -dio ]"
parser = argparse.ArgumentParser(
usage=usage,
description='Converts Visual Studio projects in solution (*.sln) to CMakeLists.txt tree'
Expand Down Expand Up @@ -103,6 +103,20 @@ def main(): # pragma: no cover
default=False,
action='store_true'
)
parser.add_argument(
'-pch', '--advanced-precompiled-headers',
help='enable advanced custom compatibility function for PCH support',
dest='advanced_precompiled_headers',
default=False,
action='store_true'
)
parser.add_argument(
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this change is not related to this PR subject. ipo changes should be extracted to another PR.

'-dio', '--disable-interprocedural-optimization',
help='disable INTERPROCEDURAL_OPTIMIZATION prorerty generation for set_target_properties',
dest='disable_interprocedural_optimization',
default=False,
action='store_true'
)

args = parser.parse_args()

Expand Down Expand Up @@ -140,6 +154,14 @@ def main(): # pragma: no cover
message(project_context, 'absent source files will be ignored', 'done')
project_context.ignore_absent_sources = True

if args.advanced_precompiled_headers:
message(project_context, 'advanced PCH compatibility will be enabled', 'done')
project_context.advanced_precompiled_headers = True

if args.disable_interprocedural_optimization:
message(project_context, 'interprocedural optimization will be disabled', 'done')
project_context.disable_interprocedural_optimization = True

converter = VSSolutionConverter()
converter.convert_solution(project_context, os.path.abspath(args.solution))

Expand Down
43 changes: 43 additions & 0 deletions cmake_converter/utils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,49 @@ function(source_file_compile_options SOURCE_FILE)
set_source_files_properties("${SOURCE_FILE}" PROPERTIES COMPILE_OPTIONS "${COMPILE_OPTIONS}")
endfunction()

################################################################################
# Create precompiled header for a list of source files
# use_precompiled_header(<src_list_var> <header_file> <source_file>)
# Input:
# src_list_var - Name of source file list variable
# header_file - Precompiled header file
# source_file - Source file to precompile
################################################################################
function(use_precompiled_header SRC_LIST_VAR HEADER_FILE SOURCE_FILE)
if(NOT MSVC)
target_precompile_headers(${PROJECT_NAME} PRIVATE
"$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILE}>")
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you build your project on linux?

return()
endif()

get_filename_component(PCH_HEADER ${HEADER_FILE} NAME)
get_filename_component(PCH_BINARY ${HEADER_FILE} NAME_WE)

set(PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCH_BINARY}.pch")
set(HEADER_COPY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${HEADER_FILE}")
add_custom_command(OUTPUT ${HEADER_COPY}
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILE} ${HEADER_COPY}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILE})

set_source_files_properties(${HEADER_COPY} PROPERTIES GENERATED "TRUE")
add_custom_target(${PROJECT_NAME}_PCH DEPENDS ${HEADER_COPY})
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_PCH)

set(SRC_LIST ${${SRC_LIST_VAR}})
list(FILTER SRC_LIST INCLUDE REGEX ".*\.cpp")
list(FILTER SRC_LIST EXCLUDE REGEX "${SOURCE_FILE}")

set_source_files_properties(${SRC_LIST} PROPERTIES
COMPILE_FLAGS "/Yu${PCH_HEADER} /Fp\"${PCH_BINARY}\""
OBJECT_DEPENDS "${PCH_BINARY}")

set_source_files_properties(${SOURCE_FILE} PROPERTIES
COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp\"${PCH_BINARY}\""
OBJECT_OUTPUTS "${PCH_BINARY}"
OBJECT_DEPENDS "")
endfunction()

################################################################################
# Default properties of visual studio projects
################################################################################
Expand Down
12 changes: 12 additions & 0 deletions cmake_converter/visual_studio/vcxproj/flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,11 +193,23 @@ def __set_precompiled_header_file(context, flag_name, node):
del flag_name

pch_header_file = 'stdafx.h' # default
flag_values = {
default_value: {}
}

if node.text:
pch_header_file = node.text
if context.advanced_precompiled_headers and context.files.file_lists:
flag_values.update(
{
pch_header_file: {
cl_flags: '/Yu{}'.format(pch_header_file)
}
}
)

context.settings[context.current_setting]['PrecompiledHeaderFile'] = pch_header_file
return flag_values

@staticmethod
def __define_pch_paths(context, setting):
Expand Down
22 changes: 14 additions & 8 deletions cmake_converter/writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,13 +254,18 @@ def write_precompiled_headers(context, setting, cmake_file):
"""

pch_header = context.settings[setting]['PrecompiledHeaderFile']
pch_source = context.settings[setting]['PrecompiledSourceFile']
working_path = os.path.dirname(context.vcxproj_path)
cmake_file.write(
'target_precompile_headers(${{PROJECT_NAME}} PRIVATE\n'
'{}"$<$<COMPILE_LANGUAGE:CXX>:${{CMAKE_CURRENT_SOURCE_DIR}}/{}>"\n'
')\n\n'.format(
context.indent,
normalize_path(context, working_path, pch_header, False)
) if not context.advanced_precompiled_headers else
'use_precompiled_header(ALL_FILES "{}" "{}")\n\n'.format(
normalize_path(context, working_path, pch_header, False),
normalize_path(context, working_path, pch_source, False)
)
)

Expand Down Expand Up @@ -445,14 +450,15 @@ def write_target_outputs(context, cmake_file):
# write_setting_property_func=ProjectVariables.write_target_property
# )

CMakeWriter.write_property_of_settings(
context,
cmake_file,
begin_text='set_target_properties(${PROJECT_NAME} PROPERTIES',
end_text=')',
property_name='INTERPROCEDURAL_OPTIMIZATION',
write_setting_property_func=CMakeWriter.write_target_property
)
if not context.disable_interprocedural_optimization:
CMakeWriter.write_property_of_settings(
context,
cmake_file,
begin_text='set_target_properties(${PROJECT_NAME} PROPERTIES',
end_text=')',
property_name='INTERPROCEDURAL_OPTIMIZATION',
write_setting_property_func=CMakeWriter.write_target_property
)

if is_settings_has_data(context.sln_configurations_map,
context.settings,
Expand Down
2 changes: 1 addition & 1 deletion test/setup_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ BASE_PATH=$(dirname "$THIS_PATH")
cd $BASE_PATH

echo '--------- Upgrade pip ... --------- '
pip install --upgrade pip
pip install --upgrade pip importlib-metadata

echo '--------- Installing application requirements ... --------- '
pip install -r requirements.txt
Expand Down