1 ##===- bindings/ocaml/Makefile.ocaml -----------------------*- Makefile -*-===## 2 # 3 # The LLVM Compiler Infrastructure 4 # 5 # This file is distributed under the University of Illinois Open Source 6 # License. See LICENSE.TXT for details. 7 # 8 ##===----------------------------------------------------------------------===## 9 # 10 # An OCaml library is a unique project type in the context of LLVM, so rules are 11 # here rather than in Makefile.rules. 12 # 13 # Reference materials on installing OCaml libraries: 14 # 15 # https://fedoraproject.org/wiki/Packaging/OCaml 16 # http://pkg-ocaml-maint.alioth.debian.org/ocaml_packaging_policy.txt 17 # 18 ##===----------------------------------------------------------------------===## 19 20 include $(LEVEL)/Makefile.config 21 22 # We have our own rules for building static libraries. 23 NO_BUILD_ARCHIVE = 1 24 25 # CFLAGS needs to be set before Makefile.rules is included. 26 CXX.Flags += -I"$(shell $(OCAMLFIND) c -where)" 27 C.Flags += -I"$(shell $(OCAMLFIND) c -where)" 28 29 ifeq ($(ENABLE_SHARED),1) 30 LINK_COMPONENTS := all 31 endif 32 33 include $(LEVEL)/Makefile.common 34 35 # Used in out-of-tree builds of OCaml bindings only. 36 ifdef SYSTEM_LLVM_CONFIG 37 LLVM_CONFIG = $(SYSTEM_LLVM_CONFIG) 38 LLVMLibsOptions += $(shell $(LLVM_CONFIG) --ldflags) 39 endif 40 41 # Intentionally ignore PROJ_prefix here. We want the ocaml stdlib. However, the 42 # user can override this with OCAML_LIBDIR or configure --with-ocaml-libdir=. 43 PROJ_libocamldir := $(DESTDIR)$(OCAML_LIBDIR) 44 OcamlDir := $(LibDir)/ocaml 45 46 # Info from llvm-config and similar 47 ifndef IS_CLEANING_TARGET 48 ifdef UsedComponents 49 UsedLibs = $(shell $(LLVM_CONFIG) --libs --system-libs $(UsedComponents)) 50 UsedLibNames = $(shell $(LLVM_CONFIG) --libnames $(UsedComponents)) 51 endif 52 endif 53 54 # How do we link OCaml executables with LLVM? 55 # 1) If this is a --enable-shared build, build stub libraries. This also allows 56 # to use LLVM from toplevels. 57 # 2) If this is a --disable-shared build, embed ocamlc options for building 58 # a custom runtime and a static executable. It is not possible to use LLVM 59 # from toplevels. 60 ifneq ($(ObjectsO),) 61 ifeq ($(ENABLE_SHARED),1) 62 OCAMLSTUBS := 1 63 OCAMLSTUBFLAGS := $(patsubst %,-cclib %, $(LLVMLibsOptions) -l$(LIBRARYNAME)) 64 endif 65 endif 66 67 # Avoid the need for LD_LIBRARY_PATH 68 ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW)) 69 ifneq ($(HOST_OS),Darwin) 70 OCAMLRPATH := $(RPATH) -Wl,'$$ORIGIN/../../lib' 71 endif 72 endif 73 74 # See http://caml.inria.fr/mantis/view.php?id=6642 75 OCAMLORIGIN := -ccopt -L'$$CAMLORIGIN/..' \ 76 -ccopt $(RPATH) -ccopt -Wl,'$$CAMLORIGIN/..' 77 78 # Tools 79 OCAMLCFLAGS += -I $(OcamlDir) $(addprefix -package ,$(FindlibPackages)) 80 81 ifndef IS_CLEANING_TARGET 82 ifneq ($(ObjectsO),) 83 OCAMLAFLAGS += $(patsubst %,-cclib %, \ 84 $(filter-out -L$(LibDir),-l$(LIBRARYNAME) \ 85 $(shell $(LLVM_CONFIG) --ldflags)) \ 86 $(UsedLibs) $(ExtraLibs)) 87 else 88 OCAMLAFLAGS += $(patsubst %,-cclib %, \ 89 $(filter-out -L$(LibDir),$(shell $(LLVM_CONFIG) --ldflags)) \ 90 $(UsedLibs) $(ExtraLibs)) 91 endif 92 endif 93 94 ifneq ($(DEBUG_SYMBOLS),1) 95 OCAMLDEBUGFLAG := -g 96 endif 97 98 Compile.CMI := $(strip $(OCAMLFIND) c -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o) 99 Compile.CMO := $(strip $(OCAMLFIND) c -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o) 100 Compile.CMX := $(strip $(OCAMLFIND) opt -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o) 101 102 ifdef OCAMLSTUBS 103 # -dllib is engaged with ocamlc builds, $(OCAMLSTUBFLAGS) in ocamlc -custom builds. 104 Archive.CMA := $(strip $(OCAMLFIND) c -a -dllib -l$(LIBRARYNAME) $(OCAMLSTUBFLAGS) \ 105 $(OCAMLDEBUGFLAG) $(OCAMLORIGIN) -o) 106 else 107 Archive.CMA := $(strip $(OCAMLFIND) c -a -custom $(OCAMLAFLAGS) $(OCAMLDEBUGFLAG) \ 108 $(OCAMLORIGIN) -o) 109 endif 110 111 ifdef OCAMLSTUBS 112 Archive.CMXA := $(strip $(OCAMLFIND) opt -a $(OCAMLSTUBFLAGS) $(OCAMLDEBUGFLAG) \ 113 $(OCAMLORIGIN) -o) 114 else 115 Archive.CMXA := $(strip $(OCAMLFIND) opt -a $(OCAMLAFLAGS) $(OCAMLDEBUGFLAG) \ 116 $(OCAMLORIGIN) -o) 117 endif 118 119 # Source files 120 ifndef OcamlSources1 121 OcamlSources1 := $(sort $(wildcard $(PROJ_SRC_DIR)/*.ml)) 122 endif 123 124 ifndef OcamlHeaders1 125 OcamlHeaders1 := $(sort $(wildcard $(PROJ_SRC_DIR)/*.mli)) 126 endif 127 128 OcamlSources2 := $(filter-out $(ExcludeSources),$(OcamlSources1)) 129 OcamlHeaders2 := $(filter-out $(ExcludeHeaders),$(OcamlHeaders1)) 130 131 OcamlSources := $(OcamlSources2:$(PROJ_SRC_DIR)/%=$(ObjDir)/%) 132 OcamlHeaders := $(OcamlHeaders2:$(PROJ_SRC_DIR)/%=$(ObjDir)/%) 133 134 # Intermediate files 135 ObjectsCMI := $(OcamlSources:%.ml=%.cmi) 136 ObjectsCMO := $(OcamlSources:%.ml=%.cmo) 137 ObjectsCMX := $(OcamlSources:%.ml=%.cmx) 138 139 ifdef LIBRARYNAME 140 LibraryCMA := $(ObjDir)/$(LIBRARYNAME).cma 141 LibraryCMXA := $(ObjDir)/$(LIBRARYNAME).cmxa 142 endif 143 144 ifdef TOOLNAME 145 ToolEXE := $(ObjDir)/$(TOOLNAME)$(EXEEXT) 146 endif 147 148 # Output files 149 # The .cmo files are the only intermediates; all others are to be installed. 150 OutputsCMI := $(ObjectsCMI:$(ObjDir)/%.cmi=$(OcamlDir)/%.cmi) 151 OutputsCMX := $(ObjectsCMX:$(ObjDir)/%.cmx=$(OcamlDir)/%.cmx) 152 OutputLibs := $(UsedLibNames:%=$(OcamlDir)/%) 153 154 ifdef LIBRARYNAME 155 LibraryA := $(OcamlDir)/lib$(LIBRARYNAME).a 156 OutputCMA := $(LibraryCMA:$(ObjDir)/%.cma=$(OcamlDir)/%.cma) 157 OutputCMXA := $(LibraryCMXA:$(ObjDir)/%.cmxa=$(OcamlDir)/%.cmxa) 158 endif 159 160 ifdef OCAMLSTUBS 161 SharedLib := $(OcamlDir)/dll$(LIBRARYNAME)$(SHLIBEXT) 162 endif 163 164 ifdef TOOLNAME 165 ifdef EXAMPLE_TOOL 166 OutputEXE := $(ExmplDir)/$(strip $(TOOLNAME))$(EXEEXT) 167 else 168 OutputEXE := $(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT) 169 endif 170 endif 171 172 # Installation targets 173 DestLibs := $(UsedLibNames:%=$(PROJ_libocamldir)/%) 174 175 ifdef LIBRARYNAME 176 DestA := $(PROJ_libocamldir)/lib$(LIBRARYNAME).a 177 DestCMA := $(PROJ_libocamldir)/$(LIBRARYNAME).cma 178 DestCMXA := $(PROJ_libocamldir)/$(LIBRARYNAME).cmxa 179 endif 180 181 ifdef OCAMLSTUBS 182 DestSharedLib := $(PROJ_libocamldir)/dll$(LIBRARYNAME)$(SHLIBEXT) 183 endif 184 185 ##===- Dependencies -------------------------------------------------------===## 186 # Copy the sources into the intermediate directory because older ocamlc doesn't 187 # support -o except when linking (outputs are placed next to inputs). 188 189 $(ObjDir)/%.mli: $(PROJ_SRC_DIR)/%.mli $(ObjDir)/.dir 190 $(Verb) $(CP) -f $< $@ 191 192 $(ObjDir)/%.ml: $(PROJ_SRC_DIR)/%.ml $(ObjDir)/.dir 193 $(Verb) $(CP) -f $< $@ 194 195 $(ObjectsCMI): $(UsedOcamlInterfaces:%=$(OcamlDir)/%.cmi) 196 197 ifdef LIBRARYNAME 198 $(ObjDir)/$(LIBRARYNAME).ocamldep: $(OcamlSources) $(OcamlHeaders) \ 199 $(OcamlDir)/.dir $(ObjDir)/.dir 200 $(Verb) $(OCAMLFIND) dep $(OCAMLCFLAGS) $(OcamlSources) $(OcamlHeaders) > $@ 201 202 -include $(ObjDir)/$(LIBRARYNAME).ocamldep 203 endif 204 205 ifdef TOOLNAME 206 $(ObjDir)/$(TOOLNAME).ocamldep: $(OcamlSources) $(OcamlHeaders) \ 207 $(OcamlDir)/.dir $(ObjDir)/.dir 208 $(Verb) $(OCAMLFIND) dep $(OCAMLCFLAGS) $(OcamlSources) $(OcamlHeaders) > $@ 209 210 -include $(ObjDir)/$(TOOLNAME).ocamldep 211 endif 212 213 ##===- Build static library from C sources --------------------------------===## 214 215 ifdef LibraryA 216 all-local:: $(LibraryA) 217 clean-local:: clean-a 218 install-local:: install-a 219 uninstall-local:: uninstall-a 220 221 $(LibraryA): $(ObjectsO) $(OcamlDir)/.dir 222 $(Echo) "Building $(BuildMode) $(notdir $@)" 223 -$(Verb) $(RM) -f $@ 224 $(Verb) $(Archive) $@ $(ObjectsO) 225 $(Verb) $(Ranlib) $@ 226 227 clean-a:: 228 -$(Verb) $(RM) -f $(LibraryA) 229 230 install-a:: $(LibraryA) 231 $(Echo) "Installing $(BuildMode) $(DestA)" 232 $(Verb) $(MKDIR) $(PROJ_libocamldir) 233 $(Verb) $(INSTALL) $(LibraryA) $(DestA) 234 $(Verb) 235 236 uninstall-a:: 237 $(Echo) "Uninstalling $(DestA)" 238 -$(Verb) $(RM) -f $(DestA) 239 endif 240 241 242 ##===- Build stub library from C sources ----------------------------------===## 243 244 ifdef SharedLib 245 all-local:: $(SharedLib) 246 clean-local:: clean-shared 247 install-local:: install-shared 248 uninstall-local:: uninstall-shared 249 250 $(SharedLib): $(ObjectsO) $(OcamlDir)/.dir 251 $(Echo) "Building $(BuildMode) $(notdir $@)" 252 $(Verb) $(Link) $(SharedLinkOptions) $(OCAMLRPATH) -o $@ $(ObjectsO) \ 253 $(LLVMLibsOptions) 254 255 clean-shared:: 256 -$(Verb) $(RM) -f $(SharedLib) 257 258 install-shared:: $(SharedLib) 259 $(Echo) "Installing $(BuildMode) $(DestSharedLib)" 260 $(Verb) $(MKDIR) $(PROJ_libocamldir) 261 $(Verb) $(INSTALL) $(SharedLib) $(DestSharedLib) 262 $(Verb) 263 264 uninstall-shared:: 265 $(Echo) "Uninstalling $(DestSharedLib)" 266 -$(Verb) $(RM) -f $(DestSharedLib) 267 endif 268 269 270 ##===- Deposit dependent libraries adjacent to OCaml libs -----------------===## 271 272 ifndef SYSTEM_LLVM_CONFIG 273 all-local:: build-deplibs 274 clean-local:: clean-deplibs 275 install-local:: install-deplibs 276 uninstall-local:: uninstall-deplibs 277 278 build-deplibs: $(OutputLibs) 279 280 $(OcamlDir)/%.so: $(LibDir)/%.so 281 $(Verb) ln -sf $< $@ 282 $(OcamlDir)/%.a: $(LibDir)/%.a 283 $(Verb) ln -sf $< $@ 284 285 $(OcamlDir)/%.o: $(LibDir)/%.o 286 $(Verb) ln -sf $< $@ 287 288 clean-deplibs: 289 $(Verb) $(RM) -f $(OutputLibs) 290 291 install-deplibs: 292 $(Verb) $(MKDIR) $(PROJ_libocamldir) 293 $(Verb) for i in $(DestLibs:$(PROJ_libocamldir)/%=%); do \ 294 ln -sf "$(PROJ_libdir)/$$i" "$(PROJ_libocamldir)/$$i"; \ 295 done 296 297 uninstall-deplibs: 298 $(Verb) $(RM) -f $(DestLibs) 299 endif 300 301 ##===- Build ocaml interfaces (.mli's -> .cmi's) --------------------------===## 302 303 ifneq ($(OcamlHeaders),) 304 all-local:: build-cmis 305 clean-local:: clean-cmis 306 install-local:: install-cmis 307 uninstall-local:: uninstall-cmis 308 309 build-cmis: $(OutputsCMI) 310 311 $(OcamlDir)/%.cmi: $(ObjDir)/%.cmi $(OcamlDir)/.dir 312 $(Verb) $(CP) -f $< $@ 313 314 $(ObjDir)/%.cmi: $(ObjDir)/%.mli $(ObjDir)/.dir 315 $(Echo) "Compiling $(notdir $<) for $(BuildMode) build" 316 $(Verb) $(Compile.CMI) $@ $< 317 318 clean-cmis:: 319 -$(Verb) $(RM) -f $(OutputsCMI) 320 321 # Also install the .mli's (headers) as documentation. 322 install-cmis: $(OutputsCMI) $(OcamlHeaders) 323 $(Verb) $(MKDIR) $(PROJ_libocamldir) 324 $(Verb) for i in $(OcamlHeaders:$(ObjDir)/%=%); do \ 325 $(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \ 326 $(DataInstall) $(ObjDir)/$$i "$(PROJ_libocamldir)/$$i"; \ 327 done 328 $(Verb) for i in $(OutputsCMI:$(OcamlDir)/%=%); do \ 329 $(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \ 330 $(DataInstall) $(OcamlDir)/$$i "$(PROJ_libocamldir)/$$i"; \ 331 done 332 333 uninstall-cmis:: 334 $(Verb) for i in $(OutputsCMI:$(OcamlDir)/%=%); do \ 335 $(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \ 336 $(RM) -f "$(PROJ_libocamldir)/$$i"; \ 337 done 338 $(Verb) for i in $(OcamlHeaders:$(ObjDir)/%=%); do \ 339 $(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \ 340 $(RM) -f "$(PROJ_libocamldir)/$$i"; \ 341 done 342 endif 343 344 345 ##===- Build ocaml bytecode archive (.ml's -> .cmo's -> .cma) -------------===## 346 347 $(ObjDir)/%.cmo: $(ObjDir)/%.ml 348 $(Echo) "Compiling $(notdir $<) for $(BuildMode) build" 349 $(Verb) $(Compile.CMO) $@ $< 350 351 ifdef LIBRARYNAME 352 all-local:: $(OutputCMA) 353 clean-local:: clean-cma 354 install-local:: install-cma 355 uninstall-local:: uninstall-cma 356 357 $(OutputCMA): $(LibraryCMA) $(OcamlDir)/.dir 358 $(Verb) $(CP) -f $< $@ 359 360 $(LibraryCMA): $(ObjectsCMO) $(OcamlDir)/.dir 361 $(Echo) "Archiving $(notdir $@) for $(BuildMode) build" 362 $(Verb) $(Archive.CMA) $@ $(ObjectsCMO) 363 364 clean-cma:: 365 $(Verb) $(RM) -f $(OutputCMA) $(UsedLibNames:%=$(OcamlDir)/%) 366 367 install-cma:: $(OutputCMA) 368 $(Echo) "Installing $(BuildMode) $(DestCMA)" 369 $(Verb) $(MKDIR) $(PROJ_libocamldir) 370 $(Verb) $(DataInstall) $(OutputCMA) "$(DestCMA)" 371 372 uninstall-cma:: 373 $(Echo) "Uninstalling $(DestCMA)" 374 -$(Verb) $(RM) -f $(DestCMA) 375 endif 376 377 ##===- Build optimized ocaml archive (.ml's -> .cmx's -> .cmxa, .a) -------===## 378 379 # The ocamlopt compiler is supported on a set of targets disjoint from LLVM's. 380 # If unavailable, 'configure' will set HAVE_OCAMLOPT to 0 in Makefile.config. 381 ifeq ($(HAVE_OCAMLOPT),1) 382 383 $(OcamlDir)/%.cmx: $(ObjDir)/%.cmx 384 $(Verb) $(CP) -f $< $@ 385 386 $(ObjDir)/%.cmx: $(ObjDir)/%.ml 387 $(Echo) "Compiling optimized $(notdir $<) for $(BuildMode) build" 388 $(Verb) $(Compile.CMX) $@ $< 389 390 ifdef LIBRARYNAME 391 all-local:: $(OutputCMXA) $(OutputsCMX) 392 clean-local:: clean-cmxa 393 install-local:: install-cmxa 394 uninstall-local:: uninstall-cmxa 395 396 $(OutputCMXA): $(LibraryCMXA) 397 $(Verb) $(CP) -f $< $@ 398 $(Verb) $(CP) -f $(<:.cmxa=.a) $(@:.cmxa=.a) 399 400 $(LibraryCMXA): $(ObjectsCMX) 401 $(Echo) "Archiving $(notdir $@) for $(BuildMode) build" 402 $(Verb) $(Archive.CMXA) $@ $(ObjectsCMX) 403 $(Verb) $(RM) -f $(@:.cmxa=.o) 404 405 clean-cmxa:: 406 $(Verb) $(RM) -f $(OutputCMXA) $(OutputCMXA:.cmxa=.a) $(OutputsCMX) 407 408 install-cmxa:: $(OutputCMXA) $(OutputsCMX) 409 $(Verb) $(MKDIR) $(PROJ_libocamldir) 410 $(Echo) "Installing $(BuildMode) $(DestCMXA)" 411 $(Verb) $(DataInstall) $(OutputCMXA) $(DestCMXA) 412 $(Echo) "Installing $(BuildMode) $(DestCMXA:.cmxa=.a)" 413 $(Verb) $(DataInstall) $(OutputCMXA:.cmxa=.a) $(DestCMXA:.cmxa=.a) 414 $(Verb) for i in $(OutputsCMX:$(OcamlDir)/%=%); do \ 415 $(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \ 416 $(DataInstall) $(OcamlDir)/$$i "$(PROJ_libocamldir)/$$i"; \ 417 done 418 419 uninstall-cmxa:: 420 $(Echo) "Uninstalling $(DestCMXA)" 421 $(Verb) $(RM) -f $(DestCMXA) 422 $(Echo) "Uninstalling $(DestCMXA:.cmxa=.a)" 423 $(Verb) $(RM) -f $(DestCMXA:.cmxa=.a) 424 $(Verb) for i in $(OutputsCMX:$(OcamlDir)/%=%); do \ 425 $(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \ 426 $(RM) -f $(PROJ_libocamldir)/$$i; \ 427 done 428 endif 429 endif 430 431 ##===- Generate documentation ---------------------------------------------===## 432 433 $(ObjDir)/$(LIBRARYNAME).odoc: $(ObjectsCMI) 434 $(Echo) "Documenting $(notdir $@)" 435 $(Verb) $(OCAMLFIND) doc -I $(ObjDir) -I $(OcamlDir) -dump $@ $(OcamlHeaders) 436 437 ocamldoc: $(ObjDir)/$(LIBRARYNAME).odoc 438 439 ##===- Debugging gunk -----------------------------------------------------===## 440 printvars:: printcamlvars 441 442 printcamlvars:: 443 $(Echo) "LLVM_CONFIG : " '$(LLVM_CONFIG)' 444 $(Echo) "OCAMLCFLAGS : " '$(OCAMLCFLAGS)' 445 $(Echo) "OCAMLAFLAGS : " '$(OCAMLAFLAGS)' 446 $(Echo) "OCAMLRPATH : " '$(OCAMLRPATH)' 447 $(Echo) "OCAMLSTUBS : " '$(OCAMLSTUBS)' 448 $(Echo) "OCAMLSTUBFLAGS : " '$(OCAMLSTUBFLAGS)' 449 $(Echo) "OCAMLFIND : " '$(OCAMLFIND)' 450 $(Echo) "Compile.CMI : " '$(Compile.CMI)' 451 $(Echo) "Compile.CMO : " '$(Compile.CMO)' 452 $(Echo) "Archive.CMA : " '$(Archive.CMA)' 453 $(Echo) "Compile.CMX : " '$(Compile.CMX)' 454 $(Echo) "Archive.CMXA : " '$(Archive.CMXA)' 455 $(Echo) "CAML_LIBDIR : " '$(CAML_LIBDIR)' 456 $(Echo) "LibraryA : " '$(LibraryA)' 457 $(Echo) "LibraryCMA : " '$(LibraryCMA)' 458 $(Echo) "LibraryCMXA : " '$(LibraryCMXA)' 459 $(Echo) "SharedLib : " '$(SharedLib)' 460 $(Echo) "OcamlSources1: " '$(OcamlSources1)' 461 $(Echo) "OcamlSources2: " '$(OcamlSources2)' 462 $(Echo) "OcamlSources : " '$(OcamlSources)' 463 $(Echo) "OcamlHeaders1: " '$(OcamlHeaders1)' 464 $(Echo) "OcamlHeaders2: " '$(OcamlHeaders2)' 465 $(Echo) "OcamlHeaders : " '$(OcamlHeaders)' 466 $(Echo) "ObjectsCMI : " '$(ObjectsCMI)' 467 $(Echo) "ObjectsCMO : " '$(ObjectsCMO)' 468 $(Echo) "ObjectsCMX : " '$(ObjectsCMX)' 469 $(Echo) "OCAML_LIBDIR : " '$(OCAML_LIBDIR)' 470 $(Echo) "DestA : " '$(DestA)' 471 $(Echo) "DestCMA : " '$(DestCMA)' 472 $(Echo) "DestCMXA : " '$(DestCMXA)' 473 $(Echo) "DestSharedLib: " '$(DestSharedLib)' 474 $(Echo) "UsedLibs : " '$(UsedLibs)' 475 $(Echo) "UsedLibNames : " '$(UsedLibNames)' 476 $(Echo) "ExtraLibs : " '$(ExtraLibs)' 477 478 .PHONY: printcamlvars build-cmis \ 479 clean-a clean-cmis clean-cma clean-cmxa \ 480 install-a install-cmis install-cma install-cmxa \ 481 install-exe \ 482 uninstall-a uninstall-cmis uninstall-cma uninstall-cmxa \ 483 uninstall-exe 484