Synchronize up to trunk's revision r57689.
[reactos.git] / cmake / CMakeDetermineASMCompiler.cmake
1
2 #=============================================================================
3 # Copyright 2007-2009 Kitware, Inc.
4 #
5 # Distributed under the OSI-approved BSD License (the "License");
6 # see accompanying file Copyright.txt for details.
7 #
8 # This software is distributed WITHOUT ANY WARRANTY; without even the
9 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 # See the License for more information.
11 #=============================================================================
12 # (To distribute this file outside of CMake, substitute the full
13 # License text for the above reference.)
14
15 # determine the compiler to use for ASM programs
16
17 IF(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER)
18 # prefer the environment variable ASM
19 IF($ENV{ASM${ASM_DIALECT}} MATCHES ".+")
20 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT "$ENV{ASM${ASM_DIALECT}}")
21 ENDIF($ENV{ASM${ASM_DIALECT}} MATCHES ".+")
22
23 # finally list compilers to try
24 IF("ASM${ASM_DIALECT}" STREQUAL "ASM") # the generic assembler support
25
26 IF(CMAKE_ASM_COMPILER_INIT)
27 SET(CMAKE_ASM_COMPILER_LIST ${CMAKE_ASM_COMPILER_INIT})
28 ELSE(CMAKE_ASM_COMPILER_INIT)
29
30 IF(CMAKE_C_COMPILER)
31 SET(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}" CACHE FILEPATH "The ASM compiler")
32 SET(CMAKE_ASM_COMPILER_ID "${CMAKE_C_COMPILER_ID}")
33 ELSEIF(CMAKE_CXX_COMPILER)
34 SET(CMAKE_ASM_COMPILER "${CMAKE_CXX_COMPILER}" CACHE FILEPATH "The ASM compiler")
35 SET(CMAKE_ASM_COMPILER_ID "${CMAKE_CXX_COMPILER_ID}")
36 ELSE(CMAKE_CXX_COMPILER)
37 # List all default C and CXX compilers
38 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST ${_CMAKE_TOOLCHAIN_PREFIX}gcc ${_CMAKE_TOOLCHAIN_PREFIX}cc cl bcc xlc
39 ${_CMAKE_TOOLCHAIN_PREFIX}c++ ${_CMAKE_TOOLCHAIN_PREFIX}g++ CC aCC cl bcc xlC)
40 ENDIF(CMAKE_C_COMPILER)
41
42 ENDIF(CMAKE_ASM_COMPILER_INIT)
43
44
45 ELSE("ASM${ASM_DIALECT}" STREQUAL "ASM") # some specific assembler "dialect"
46
47 IF(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT)
48 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST ${CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT})
49 ELSE(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT)
50 MESSAGE(FATAL_ERROR "CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT must be preset !")
51 ENDIF(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT)
52
53 ENDIF("ASM${ASM_DIALECT}" STREQUAL "ASM")
54
55
56 # Find the compiler.
57 IF (_CMAKE_USER_CXX_COMPILER_PATH OR _CMAKE_USER_C_COMPILER_PATH)
58 FIND_PROGRAM(CMAKE_ASM${ASM_DIALECT}_COMPILER NAMES ${CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST} PATHS ${_CMAKE_USER_C_COMPILER_PATH} ${_CMAKE_USER_CXX_COMPILER_PATH} DOC "Assembler" NO_DEFAULT_PATH)
59 ENDIF (_CMAKE_USER_CXX_COMPILER_PATH OR _CMAKE_USER_C_COMPILER_PATH)
60 FIND_PROGRAM(CMAKE_ASM${ASM_DIALECT}_COMPILER NAMES ${CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST} PATHS ${_CMAKE_TOOLCHAIN_LOCATION} DOC "Assembler")
61
62 ELSE(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER)
63
64 # we only get here if CMAKE_ASM${ASM_DIALECT}_COMPILER was specified using -D or a pre-made CMakeCache.txt
65 # (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
66 #
67 # if a compiler was specified by the user but without path,
68 # now try to find it with the full path
69 # if it is found, force it into the cache,
70 # if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
71 GET_FILENAME_COMPONENT(_CMAKE_USER_ASM${ASM_DIALECT}_COMPILER_PATH "${CMAKE_ASM${ASM_DIALECT}_COMPILER}" PATH)
72 IF(NOT _CMAKE_USER_ASM${ASM_DIALECT}_COMPILER_PATH)
73 FIND_PROGRAM(CMAKE_ASM${ASM_DIALECT}_COMPILER_WITH_PATH NAMES ${CMAKE_ASM${ASM_DIALECT}_COMPILER})
74 MARK_AS_ADVANCED(CMAKE_ASM${ASM_DIALECT}_COMPILER_WITH_PATH)
75 IF(CMAKE_ASM${ASM_DIALECT}_COMPILER_WITH_PATH)
76 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER ${CMAKE_ASM${ASM_DIALECT}_COMPILER_WITH_PATH} CACHE FILEPATH "Assembler" FORCE)
77 ENDIF(CMAKE_ASM${ASM_DIALECT}_COMPILER_WITH_PATH)
78 ENDIF(NOT _CMAKE_USER_ASM${ASM_DIALECT}_COMPILER_PATH)
79 ENDIF(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER)
80 MARK_AS_ADVANCED(CMAKE_ASM${ASM_DIALECT}_COMPILER)
81
82 IF (NOT _CMAKE_TOOLCHAIN_LOCATION)
83 GET_FILENAME_COMPONENT(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_ASM${ASM_DIALECT}_COMPILER}" PATH)
84 ENDIF (NOT _CMAKE_TOOLCHAIN_LOCATION)
85
86
87 IF(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_ID)
88
89 # Table of per-vendor compiler id flags with expected output.
90 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS GNU )
91 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_GNU "--version")
92 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_GNU "(GNU assembler)|(GCC)|(Free Software Foundation)")
93
94 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS HP )
95 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_HP "-V")
96 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_HP "HP C")
97
98 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Intel )
99 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Intel "--version")
100 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Intel "(ICC)")
101
102 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS SunPro )
103 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_SunPro "-V")
104 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_SunPro "Sun C")
105
106 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS XL )
107 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_XL "-qversion")
108 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_XL "XL C")
109
110 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS TI_DSP )
111 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_TI_DSP "-h")
112 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_TI_DSP "Texas Instruments")
113
114 LIST(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS VISUAL)
115 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_VISUAL "/?")
116 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_VISUAL "Microsoft Corporation")
117
118 INCLUDE(CMakeDetermineCompilerId)
119 CMAKE_DETERMINE_COMPILER_ID_VENDOR(ASM${ASM_DIALECT})
120
121 ENDIF()
122
123 IF(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID)
124 MESSAGE(STATUS "The ASM${ASM_DIALECT} compiler identification is ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}")
125 ELSE(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID)
126 MESSAGE(STATUS "The ASM${ASM_DIALECT} compiler identification is unknown")
127 ENDIF(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID)
128
129
130
131 # If we have a gas/as cross compiler, they have usually some prefix, like
132 # e.g. powerpc-linux-gas, arm-elf-gas or i586-mingw32msvc-gas , optionally
133 # with a 3-component version number at the end
134 # The other tools of the toolchain usually have the same prefix
135 # NAME_WE cannot be used since then this test will fail for names lile
136 # "arm-unknown-nto-qnx6.3.0-gas.exe", where BASENAME would be
137 # "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-"
138 IF (NOT _CMAKE_TOOLCHAIN_PREFIX)
139 GET_FILENAME_COMPONENT(COMPILER_BASENAME "${CMAKE_ASM${ASM_DIALECT}_COMPILER}" NAME)
140 IF (COMPILER_BASENAME MATCHES "^(.+-)g?as(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
141 SET(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
142 ENDIF (COMPILER_BASENAME MATCHES "^(.+-)g?as(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
143 ENDIF (NOT _CMAKE_TOOLCHAIN_PREFIX)
144
145 # Now try the C compiler regexp:
146 IF (NOT _CMAKE_TOOLCHAIN_PREFIX)
147 IF (COMPILER_BASENAME MATCHES "^(.+-)g?cc(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
148 SET(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
149 ENDIF (COMPILER_BASENAME MATCHES "^(.+-)g?cc(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
150 ENDIF (NOT _CMAKE_TOOLCHAIN_PREFIX)
151
152 # Finally try the CXX compiler regexp:
153 IF (NOT _CMAKE_TOOLCHAIN_PREFIX)
154 IF (COMPILER_BASENAME MATCHES "^(.+-)[gc]\\+\\+(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
155 SET(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
156 ENDIF (COMPILER_BASENAME MATCHES "^(.+-)[gc]\\+\\+(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
157 ENDIF (NOT _CMAKE_TOOLCHAIN_PREFIX)
158
159
160 INCLUDE(CMakeFindBinUtils)
161
162 SET(CMAKE_ASM${ASM_DIALECT}_COMPILER_ENV_VAR "ASM${ASM_DIALECT}")
163
164 IF(CMAKE_ASM${ASM_DIALECT}_COMPILER)
165 MESSAGE(STATUS "Found assembler: ${CMAKE_ASM${ASM_DIALECT}_COMPILER}")
166 ELSE(CMAKE_ASM${ASM_DIALECT}_COMPILER)
167 MESSAGE(STATUS "Didn't find assembler")
168 ENDIF(CMAKE_ASM${ASM_DIALECT}_COMPILER)
169
170
171 SET(_CMAKE_ASM_COMPILER "${CMAKE_ASM${ASM_DIALECT}_COMPILER}")
172 SET(_CMAKE_ASM_COMPILER_ID "${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}")
173 SET(_CMAKE_ASM_COMPILER_ARG1 "${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARG1}")
174 SET(_CMAKE_ASM_COMPILER_ENV_VAR "${CMAKE_ASM${ASM_DIALECT}_COMPILER_ENV_VAR}")
175
176 # configure variables set in this file for fast reload later on
177 CONFIGURE_FILE(${CMAKE_ROOT}/Modules/CMakeASMCompiler.cmake.in
178 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeASM${ASM_DIALECT}Compiler.cmake IMMEDIATE @ONLY)
179
180 SET(_CMAKE_ASM_COMPILER)
181 SET(_CMAKE_ASM_COMPILER_ARG1)
182 SET(_CMAKE_ASM_COMPILER_ENV_VAR)