PageRenderTime 31ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/cmake/CSharpMacros.cmake

https://bitbucket.org/lindenlab/viewer-beta/
CMake | 142 lines | 100 code | 19 blank | 23 comment | 0 complexity | 050735896456258dcff539459532161d MD5 | raw file
Possible License(s): LGPL-2.1
  1. # - This is a support module for easy Mono/C# handling with CMake
  2. # It defines the following macros:
  3. #
  4. # ADD_CS_LIBRARY (<target> <source>)
  5. # ADD_CS_EXECUTABLE (<target> <source>)
  6. # INSTALL_GAC (<target>)
  7. #
  8. # Note that the order of the arguments is important.
  9. #
  10. # You can optionally set the variable CS_FLAGS to tell the macros whether
  11. # to pass additional flags to the compiler. This is particularly useful to
  12. # set assembly references, unsafe code, etc... These flags are always reset
  13. # after the target was added so you don't have to care about that.
  14. #
  15. # copyright (c) 2007 Arno Rehn arno@arnorehn.de
  16. #
  17. # Redistribution and use is allowed according to the terms of the GPL license.
  18. # ----- support macros -----
  19. MACRO(GET_CS_LIBRARY_TARGET_DIR)
  20. IF (NOT LIBRARY_OUTPUT_PATH)
  21. SET(CS_LIBRARY_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
  22. ELSE (NOT LIBRARY_OUTPUT_PATH)
  23. SET(CS_LIBRARY_TARGET_DIR ${LIBRARY_OUTPUT_PATH})
  24. ENDIF (NOT LIBRARY_OUTPUT_PATH)
  25. ENDMACRO(GET_CS_LIBRARY_TARGET_DIR)
  26. MACRO(GET_CS_EXECUTABLE_TARGET_DIR)
  27. IF (NOT EXECUTABLE_OUTPUT_PATH)
  28. SET(CS_EXECUTABLE_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
  29. ELSE (NOT EXECUTABLE_OUTPUT_PATH)
  30. SET(CS_EXECUTABLE_TARGET_DIR ${EXECUTABLE_OUTPUT_PATH})
  31. ENDIF (NOT EXECUTABLE_OUTPUT_PATH)
  32. ENDMACRO(GET_CS_EXECUTABLE_TARGET_DIR)
  33. MACRO(MAKE_PROPER_FILE_LIST)
  34. FOREACH(file ${ARGN})
  35. # first assume it's a relative path
  36. FILE(GLOB globbed ${CMAKE_CURRENT_SOURCE_DIR}/${file})
  37. IF(globbed)
  38. FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${file} native)
  39. ELSE(globbed)
  40. FILE(TO_NATIVE_PATH ${file} native)
  41. ENDIF(globbed)
  42. SET(proper_file_list ${proper_file_list} ${native})
  43. SET(native "")
  44. ENDFOREACH(file)
  45. ENDMACRO(MAKE_PROPER_FILE_LIST)
  46. # ----- end support macros -----
  47. MACRO(ADD_CS_LIBRARY target)
  48. GET_CS_LIBRARY_TARGET_DIR()
  49. SET(target_DLL "${CS_LIBRARY_TARGET_DIR}/${target}.dll")
  50. MAKE_PROPER_FILE_LIST(${ARGN})
  51. FILE(RELATIVE_PATH relative_path ${CMAKE_BINARY_DIR} ${target_DLL})
  52. SET(target_KEY "${CMAKE_CURRENT_SOURCE_DIR}/${target}.key")
  53. SET(target_CS_FLAGS "${CS_FLAGS}")
  54. IF(${target}_CS_FLAGS)
  55. LIST(APPEND target_CS_FLAGS ${${target}_CS_FLAGS})
  56. ENDIF(${target}_CS_FLAGS)
  57. IF(EXISTS ${target_KEY})
  58. LIST(APPEND target_CS_FLAGS -keyfile:${target_KEY})
  59. ENDIF(EXISTS ${target_KEY})
  60. FOREACH(ref ${${target}_REFS})
  61. SET(ref_DLL ${CMAKE_CURRENT_BINARY_DIR}/${ref}.dll)
  62. IF(EXISTS ${ref_DLL})
  63. LIST(APPEND target_CS_FLAGS -r:${ref_DLL})
  64. ELSE(EXISTS ${ref_DLL})
  65. LIST(APPEND target_CS_FLAGS -r:${ref})
  66. ENDIF(EXISTS ${ref_DLL})
  67. ENDFOREACH(ref ${${target}_REFS})
  68. ADD_CUSTOM_COMMAND (OUTPUT ${target_DLL}
  69. COMMAND ${MCS_EXECUTABLE} ${target_CS_FLAGS} -out:${target_DLL} -target:library ${proper_file_list}
  70. MAIN_DEPENDENCY ${proper_file_list}
  71. DEPENDS ${ARGN}
  72. COMMENT "Building ${relative_path}")
  73. ADD_CUSTOM_TARGET (${target} ALL DEPENDS ${target_DLL})
  74. FOREACH(ref ${${target}_REFS})
  75. GET_TARGET_PROPERTY(is_target ${ref} TYPE)
  76. IF(is_target)
  77. ADD_DEPENDENCIES(${target} ${ref})
  78. ENDIF(is_target)
  79. ENDFOREACH(ref ${${target}_REFS})
  80. SET(relative_path "")
  81. SET(proper_file_list "")
  82. ENDMACRO(ADD_CS_LIBRARY)
  83. MACRO(ADD_CS_EXECUTABLE target)
  84. GET_CS_EXECUTABLE_TARGET_DIR()
  85. # Seems like cmake doesn't like the ".exe" ending for custom commands.
  86. # If we call it ${target}.exe, 'make' will later complain about a missing rule.
  87. # Create a fake target instead.
  88. SET(target_EXE "${CS_EXECUTABLE_TARGET_DIR}/${target}.exe")
  89. SET(target_TOUCH "${CS_EXECUTABLE_TARGET_DIR}/${target}.exe-built")
  90. GET_DIRECTORY_PROPERTY(clean ADDITIONAL_MAKE_CLEAN_FILES)
  91. LIST(APPEND clean ${target}.exe)
  92. SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${clean}")
  93. MAKE_PROPER_FILE_LIST(${ARGN})
  94. FILE(RELATIVE_PATH relative_path ${CMAKE_BINARY_DIR} ${target_EXE})
  95. SET(target_CS_FLAGS "${CS_FLAGS}")
  96. FOREACH(ref ${${target}_REFS})
  97. SET(ref_DLL ${CMAKE_CURRENT_SOURCE_DIR}/${ref}.dll)
  98. IF(EXISTS ${ref_DLL})
  99. LIST(APPEND target_CS_FLAGS -r:${ref_DLL})
  100. ELSE(EXISTS ${ref_DLL})
  101. LIST(APPEND target_CS_FLAGS -r:${ref})
  102. ENDIF(EXISTS ${ref_DLL})
  103. ENDFOREACH(ref ${${target}_REFS})
  104. ADD_CUSTOM_COMMAND (OUTPUT "${target_TOUCH}"
  105. COMMAND ${MCS_EXECUTABLE} ${target_CS_FLAGS} -out:${target_EXE} ${proper_file_list}
  106. COMMAND ${CMAKE_COMMAND} -E touch ${target_TOUCH}
  107. MAIN_DEPENDENCY ${ARGN}
  108. DEPENDS ${ARGN}
  109. COMMENT "Building ${relative_path}")
  110. ADD_CUSTOM_TARGET ("${target}" ALL DEPENDS "${target_TOUCH}")
  111. FOREACH(ref ${${target}_REFS})
  112. GET_TARGET_PROPERTY(is_target ${ref} TYPE)
  113. IF(is_target)
  114. ADD_DEPENDENCIES(${target} ${ref})
  115. ENDIF(is_target)
  116. ENDFOREACH(ref ${${target}_REFS})
  117. SET(relative_path "")
  118. SET(proper_file_list "")
  119. ENDMACRO(ADD_CS_EXECUTABLE)
  120. MACRO(INSTALL_GAC target)
  121. GET_CS_LIBRARY_TARGET_DIR()
  122. INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${GACUTIL_EXECUTABLE} -i ${CS_LIBRARY_TARGET_DIR}/${target}.dll -package 2.0)")
  123. ENDMACRO(INSTALL_GAC target)