# ConfigureDebugging.cmake # Written in 2017 by Joshua Brookover # To the extent possible under law, the author(s) have dedicated all copyright # and related and neighboring rights to this software to the public domain # worldwide. This software is distributed without any warranty. # You should have received a copy of the CC0 Public Domain Dedication along with # this software. If not, see . # # configure_debugging( TARGET [OPTIONS...] ) # # Configures the debugging settings in visual studio. # Results in a no-op on non visual studio builds. # Must be called in the same cmake file as the add_executable command. # # See OPTIONS variable in the function for supported user settings. # See CONFIGS variable in the function for supported cmake configurations. # See PROCESSORS variable in the function for supported architecture configurations. # # All variables can be set with one of the following formats: # # (OPTION) # (OPTION)_(CONFIG) # (OPTION)_(CONFIG)_(ARCH) # (OPTION)_(ARCH) # # So, some examples (variables should be all caps): # # WORKING_DIR # WORKING_DIR_X64 # WORKING_DIR_RELEASE_WIN32 # WORKING_DIR_X64 # # An example of a full command: # # configure_debugging(target COMMAND "node.exe" COMMAND_X64 "node64.exe" WORKING_DIR ${CMAKE_SOURCE_DIR} DEBUGGER_ENV "PATH=%PATH%\\;$(ProjectDir)") include( CMakeParseArguments ) function( configure_debugging ARG_TARGET ) if( MSVC ) # Visual Studio Options set( OPTIONS WORKING_DIR LocalDebuggerWorkingDirectory DEBUGGER_ENV LocalDebuggerEnvironment COMMAND LocalDebuggerCommand COMMAND_ARGS LocalDebuggerCommandArguments ) # Valid Configurations set( CONFIGS Debug Release MinSizeRel RelWithDebInfo ) # Processors set( PROCESSORS Win32 x64 ) # Begin hackery if( ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) set( ACTIVE_PROCESSOR "x64" ) else() set( ACTIVE_PROCESSOR "Win32" ) endif() # Fix issues with semicolons, thx cmake foreach( ARG ${ARGN} ) string( REPLACE ";" "\\\\\\\\\\\\\\;" RES "${ARG}" ) list( APPEND ARGS "${RES}" ) endforeach() # Build options for cmake_parse_arguments, result is ONE_ARG variable set( ODD ON ) foreach( OPTION ${OPTIONS} ) if( ODD ) set( ARG ${OPTION} ) list( APPEND ONE_ARG ${ARG} ) foreach( CONFIG ${CONFIGS} ) string( TOUPPER ${CONFIG} CONFIG ) list( APPEND ONE_ARG ${ARG}_${CONFIG} ) foreach( PROCESSOR ${PROCESSORS} ) string( TOUPPER ${PROCESSOR} PROCESSOR ) list( APPEND ONE_ARG ${ARG}_${CONFIG}_${PROCESSOR} ) endforeach() endforeach() foreach( PROCESSOR ${PROCESSORS} ) string( TOUPPER ${PROCESSOR} PROCESSOR ) list( APPEND ONE_ARG ${ARG}_${PROCESSOR} ) endforeach() set( ODD OFF ) else() set( ODD ON ) endif() endforeach() cmake_parse_arguments( ARG "" "${ONE_ARG}" "" ${ARGS} ) # Parse options, fills in all variables of format ARG_(ARG)_(CONFIG)_(PROCESSOR), for example ARG_WORKING_DIR_DEBUG_X64 set( ODD ON ) foreach( OPTION ${OPTIONS} ) if( ODD ) set( ARG ${OPTION} ) foreach( CONFIG ${CONFIGS} ) string( TOUPPER ${CONFIG} CONFIG_CAP ) if( "${ARG_${ARG}_${CONFIG_CAP}}" STREQUAL "" ) set( ARG_${ARG}_${CONFIG_CAP} ${ARG_${ARG}} ) endif() foreach( PROCESSOR ${PROCESSORS} ) string( TOUPPER ${PROCESSOR} PROCESSOR_CAP ) if( "${ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP}}" STREQUAL "" ) if( "${ARG_${ARG}_${PROCESSOR_CAP}}" STREQUAL "" ) set( ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP} ${ARG_${ARG}_${CONFIG_CAP}} ) else() set( ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP} ${ARG_${ARG}_${PROCESSOR_CAP}} ) endif() endif() if( NOT "${ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP}}" STREQUAL "" ) endif() endforeach() endforeach() set( ODD OFF ) else() set( ODD ON ) endif() endforeach() # Create string to put in proj.vcxproj.user file set( RESULT "\n" ) foreach( CONFIG ${CONFIGS} ) string( TOUPPER ${CONFIG} CONFIG_CAPS ) foreach( PROCESSOR ${PROCESSORS} ) if( "${PROCESSOR}" STREQUAL "${ACTIVE_PROCESSOR}" ) string( TOUPPER ${PROCESSOR} PROCESSOR_CAPS ) set( RESULT "${RESULT}\n " ) set( ODD ON ) foreach( OPTION ${OPTIONS} ) if( ODD ) set( ARG ${OPTION} ) set( ODD OFF ) else() set( VALUE ${ARG_${ARG}_${CONFIG_CAPS}_${PROCESSOR_CAPS}} ) if( NOT "${VALUE}" STREQUAL "" ) set( RESULT "${RESULT}\n <${OPTION}>${VALUE}" ) endif() set( ODD ON ) endif() endforeach() set( RESULT "${RESULT}\n " ) endif() endforeach() endforeach() set( RESULT "${RESULT}\n" ) file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET}.vcxproj.user "${RESULT}" ) endif() endfunction()