#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

#Python
*.pyc
*.out
#CPP
*.o
*.la
*.lo
*.vglog
.dirstamp
Makefile.in
config(?!\.sh)\.*
configure
.deps
.libs
autom4te.cache
*.m4
developer.doxygen
user.doxygen
qpid/cpp/libtool
qpidc.spec
qpid/cpp/src/gen/
*gen.mk
*.timestamp
*.pcl
qpid/cpp/managementgen/management-types.xml

#Java
*.class
velocity.log*
qpid/java/build
release
.classpath
.project
.settings
generated/
target
classes
qpid/java/lib/*.jar
qpid/java/lib/required
qpid/java/lib/bdbstore
qpid/java/lib/cobertura
qpid/java/lib/findbugs
qpid/java/lib/ivy
qpid/java/lib/csvjdbc
qpid/java/lib/jfree
qpid/java/lib/bonecp
qpid/java/build.overrides
qpid/java/felix-cache/*
qpid/java/eclipse-projects
qpid/java/derby.log
# Intellij Project files
*.iml
*.ipr
*.iws
# Emacs
*~
# Microsoft Visual Studio artifacts
*.vcproj.*.*.user
*.ncb
*.suo
*.ilk
*.pdb
# Windows build results
*.exe
*.lib
*.dll
# MacOS File
.DS_Store

#Eclipse workspace
workspace/

*.swp

