Advertisement
Guest User

Untitled

a guest
Jun 14th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
CMake 3.68 KB | None | 0 0
  1.  
  2. ################################################################################
  3. # Parse add_custom_command_if args.
  4. # Input:
  5. #    Options:        PRE_BUILD, PRE_LINK, POST_BUILD
  6. #    One value args: TARGET
  7. #    List:           List of commands(COMMAND condition1 commannd1 args1 COMMAND condition2 commannd2 args2 ...)
  8. # Output:
  9. #    PRE_BUILD  - TRUE/FALSE
  10. #    PRE_LINK   - TRUE/FALSE
  11. #    POST_BUILD - TRUE/FALSE
  12. #    TARGET     - Target name
  13. #    COMMANDS   - Prepared commands(every token is wrapped in CONDITION)
  14. #    NAME       - Unique name for custom target
  15. #    STEP       - PRE_BUILD/PRE_LINK/POST_BUILD
  16. ################################################################################
  17. cmake_policy(PUSH)
  18. cmake_policy(SET CMP0054 NEW)
  19. function(add_custom_command_if_parse_arguments)
  20.     cmake_parse_arguments("ARG" "PRE_BUILD;PRE_LINK;POST_BUILD" "TARGET" "" ${ARGN})
  21.  
  22.     unset(COMMANDS)
  23.     foreach(TOKEN ${ARG_UNPARSED_ARGUMENTS})
  24.         if("${TOKEN}" STREQUAL "COMMAND")
  25.             set(TOKEN_ROLE "KEYWORD")
  26.         elseif("${TOKEN_ROLE}" STREQUAL "KEYWORD")
  27.             set(TOKEN_ROLE "CONDITION")
  28.         elseif("${TOKEN_ROLE}" STREQUAL "CONDITION")
  29.             set(TOKEN_ROLE "COMMAND")
  30.         elseif("${TOKEN_ROLE}" STREQUAL "COMMAND")
  31.             set(TOKEN_ROLE "COMMAND")
  32.         endif()
  33.  
  34.         if("${TOKEN_ROLE}" STREQUAL "KEYWORD")
  35.             set(COMMANDS ${COMMANDS} ${TOKEN})
  36.         elseif("${TOKEN_ROLE}" STREQUAL "CONDITION")
  37.             set(CONDITION ${TOKEN})
  38.         elseif("${TOKEN_ROLE}" STREQUAL "COMMAND")
  39.             set(COMMANDS ${COMMANDS} $<${CONDITION}:${TOKEN}>)
  40.         endif()
  41.     endforeach()
  42.  
  43.     set(PRE_BUILD "${ARG_PRE_BUILD}" PARENT_SCOPE)
  44.     set(PRE_LINK "${ARG_PRE_LINK}" PARENT_SCOPE)
  45.     set(POST_BUILD "${ARG_POST_BUILD}" PARENT_SCOPE)
  46.     set(TARGET "${ARG_TARGET}" PARENT_SCOPE)
  47.     set(COMMANDS "${COMMANDS}" PARENT_SCOPE)
  48.  
  49.     set(NAME "${TARGET}_${STEP}" PARENT_SCOPE)
  50.     if(PRE_BUILD)
  51.         set(STEP "PRE_BUILD" PARENT_SCOPE)
  52.     elseif(PRE_LINK)
  53.         set(STEP "PRE_LINK" PARENT_SCOPE)
  54.     elseif(POST_BUILD)
  55.         set(STEP "POST_BUILD" PARENT_SCOPE)
  56.     endif()
  57. endfunction()
  58. cmake_policy(POP)
  59.  
  60. ################################################################################
  61. # Add custom command if condition is TRUE
  62. # add_custom_command_if(
  63. #     TARGET target
  64. #     PRE_BUILD | PRE_LINK | POST_BUILD
  65. #     COMMAND condition command1 [args1...]
  66. #     [COMMAND condition command2 [args2...]]
  67. ################################################################################
  68. function(add_custom_command_if)
  69.     add_custom_command_if_parse_arguments(${ARGN})
  70.  
  71.     if(PRE_BUILD AND NOT ${CMAKE_GENERATOR} MATCHES "Visual Studio")
  72.         add_custom_target(
  73.             ${NAME}
  74.             ${COMMANDS}
  75.             WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
  76.         add_dependencies(${TARGET} ${NAME})
  77.     else()
  78.         add_custom_command(
  79.             TARGET ${TARGET}
  80.             ${STEP}
  81.             ${COMMANDS}
  82.             WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
  83.     endif()
  84. endfunction()
  85.  
  86. set(SOURCE_DIR ${CMAKE_SOURCE_DIR})
  87. if(WIN32)
  88.     string(REPLACE "/" "\\" SOURCE_DIR ${SOURCE_DIR})
  89.     string(REPLACE "/" "\\" OUT_DIR ${OUT_DIR})
  90. endif()
  91. set(POST_BUILD_COMMAND mkdir "${SOURCE_DIR}\\..\\lib\\$<CONFIG>")
  92. add_custom_command_if(
  93.     TARGET ${PROJECT_NAME}
  94.     POST_BUILD
  95.     COMMAND $<CONFIG:Debug> ${POST_BUILD_COMMAND}
  96.     COMMAND $<CONFIG:Debug> copy "${OUT_DIR}${PROJECT_NAME}.lib" "${SOURCE_DIR}\\..\\lib\\$<CONFIG>\\"
  97.     COMMAND $<CONFIG:Release> ${POST_BUILD_COMMAND}
  98.     COMMAND $<CONFIG:Release> copy "${OUT_DIR}${PROJECT_NAME}.lib" "${SOURCE_DIR}\\..\\lib\\$<CONFIG>\\")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement