<!--
 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.

-->
<assembly>
	<id>source</id>
	<formats>
		<format>tar.gz</format>
		<format>zip</format>
	</formats>
	<baseDirectory>${project.artifactId}-${project.version}</baseDirectory>

	<fileSets>
		<!-- Some files need to be executable. -->
		<fileSet>
			<includes>
				<include>ar-lib</include>
				<include>autogen.sh</include>
				<include>configure.bat</include>
				<include>configure-aprutil.bat</include>
				<include>configure</include>
				<include>depcomp</include>
				<include>install-sh</include>
				<include>ltmain.sh</include>
				<include>missing</include>
			</includes>

			<fileMode>0755</fileMode>
		</fileSet>

		<fileSet>
			<includes>
				<include>aclocal.m4</include>
				<include>build.xml</include>
				<include>CMakeLists.txt</include>
				<include>configure.ac</include>
				<include>config.guess</include>
				<include>config.sub</include>
				<include>INSTALL</include>
				<include>KEYS</include>
				<include>liblog4cxx.pc.in</include>
				<include>LICENSE</include>
				<include>Makefile.am</include>
				<include>Makefile.in</include>
				<include>NOTICE</include>
				<include>pom.xml</include>
				<include>src/**</include>
			</includes>

			<excludes>
				<exclude>src/examples/cpp/console</exclude>
				<exclude>src/examples/cpp/delayedloop</exclude>
				<exclude>src/examples/cpp/stream</exclude>
				<exclude>src/examples/cpp/trivial</exclude>
				<exclude>src/m4/libtool.m4</exclude>
				<exclude>src/m4/ltoptions.m4</exclude>
				<exclude>src/m4/ltsugar.m4</exclude>
				<exclude>src/m4/ltversion.m4</exclude>
				<exclude>src/m4/lt~obsolete.m4</exclude>
				<exclude>src/main/include/log4cxx/log4cxx.h</exclude>
				<exclude>src/main/include/log4cxx/private/log4cxx_private.h</exclude>
				<exclude>src/test/cpp/testsuite</exclude>
				<exclude>src/test/resources/output/**</exclude>
				<exclude>**/.libs/**</exclude>
				<exclude>**/.deps/**</exclude>
				<exclude>**/*.a</exclude>
				<exclude>**/*.dll</exclude>
				<exclude>**/*.dylib</exclude>
				<exclude>**/*.la</exclude>
				<exclude>**/*.lo</exclude>
				<exclude>**/*.o</exclude>
				<exclude>**/*.Po</exclude>
				<exclude>**/*.so</exclude>
				<exclude>**/Doxyfile</exclude>
				<exclude>**/Makefile</exclude>
			</excludes>

			<fileMode>0644</fileMode>
			<directoryMode>0755</directoryMode>
		</fileSet>

		<!-- "includeSiteDirectory" seems to add files with wrong permissions. -->
		<fileSet>
			<directory>target</directory>
			<lineEnding>keep</lineEnding>
			<outputDirectory>.</outputDirectory>

			<includes>
				<include>site/**</include>
			</includes>

			<fileMode>0644</fileMode>
			<directoryMode>0755</directoryMode>
		</fileSet>
	</fileSets>
</assembly>

