diff --git a/jme3-bullet-native/src/native/android/Android.mk b/jme3-bullet-native/src/native/android/Android.mk index 45258d04b..cfa2c0012 100644 --- a/jme3-bullet-native/src/native/android/Android.mk +++ b/jme3-bullet-native/src/native/android/Android.mk @@ -13,42 +13,26 @@ # 3. This notice may not be removed or altered from any source distribution. # */ LOCAL_PATH:= $(call my-dir) -JME3_PATH:= -BULLET_PATH:= - +JME3_PATH:= ${LOCAL_PATH}/../ +BULLET_PATH:= ${LOCAL_PATH}/../ + include $(CLEAR_VARS) - + LOCAL_MODULE := bulletjme LOCAL_C_INCLUDES := $(BULLET_PATH)/\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch\ - $(BULLET_PATH)/BulletCollision/CollisionShapes\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver\ - $(BULLET_PATH)/BulletDynamics/Dynamics\ - $(BULLET_PATH)/BulletDynamics/Vehicle\ - $(BULLET_PATH)/LinearMath\ $(BULLET_PATH)/BulletCollision\ - $(BULLET_PATH)/BulletDynamics\ - $(BULLET_PATH)/BulletMultiThreaded\ - $(BULLET_PATH)/BulletSoftBody\ - $(BULLET_PATH)/ibmsdk\ - $(BULLET_PATH)/LinearMath\ - $(BULLET_PATH)/MiniCL\ - $(BULLET_PATH)/vectormath\ $(BULLET_PATH)/BulletCollision/BroadphaseCollision\ $(BULLET_PATH)/BulletCollision/CollisionDispatch\ $(BULLET_PATH)/BulletCollision/CollisionShapes\ - $(BULLET_PATH)/BulletCollision/Gimpact\ - $(BULLET_PATH)/BulletCollision/ibmsdk\ $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision\ - $(BULLET_PATH)/BulletDynamics/Character\ + $(BULLET_PATH)/BulletCollision/Gimpact\ + $(BULLET_PATH)/BulletDynamics\ $(BULLET_PATH)/BulletDynamics/ConstraintSolver\ $(BULLET_PATH)/BulletDynamics/Dynamics\ - $(BULLET_PATH)/BulletDynamics/ibmsdk\ $(BULLET_PATH)/BulletDynamics/Vehicle\ + $(BULLET_PATH)/BulletDynamics/Character\ + $(BULLET_PATH)/BulletMultiThreaded\ $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers\ - $(BULLET_PATH)/BulletMultiThreaded/out\ $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask\ $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTask\ $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/CPU\ @@ -61,200 +45,24 @@ LOCAL_C_INCLUDES := $(BULLET_PATH)/\ $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/NVidia\ $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC\ $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC10\ - $(BULLET_PATH)/LinearMath/ibmsdk\ + $(BULLET_PATH)/LinearMath\ + $(BULLET_PATH)/BulletSoftBody\ + $(BULLET_PATH)/LinearMath\ + $(BULLET_PATH)/MiniCL\ $(BULLET_PATH)/MiniCL/MiniCLTask\ + $(BULLET_PATH)/vectormath\ $(BULLET_PATH)/vectormath/scalar\ - $(BULLET_PATH)/vectormath/sse - + $(BULLET_PATH)/vectormath/sse\ + $(BULLET_PATH)/vectormath/neon + LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -lm -llog - -LOCAL_SRC_FILES := $(JME3_PATH)/com_jme3_bullet_collision_PhysicsCollisionEvent.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_PhysicsCollisionObject.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_BoxCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CapsuleCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CompoundCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_ConeCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_CylinderCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_GImpactCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_HeightfieldCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_HullCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_MeshCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_PlaneCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_SimplexCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_collision_shapes_SphereCollisionShape.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_ConeJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_HingeJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_motors_RotationalLimitMotor.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_motors_TranslationalLimitMotor.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_PhysicsJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_Point2PointJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SixDofJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SixDofSpringJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_joints_SliderJoint.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_infos_RigidBodyMotionState.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsCharacter.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsGhostObject.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsRigidBody.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_PhysicsVehicle.cpp\ - $(JME3_PATH)/com_jme3_bullet_objects_VehicleWheel.cpp\ - $(JME3_PATH)/com_jme3_bullet_PhysicsSpace.cpp\ - $(JME3_PATH)/com_jme3_bullet_util_DebugShapeFactory.cpp\ - $(JME3_PATH)/com_jme3_bullet_util_NativeMeshUtil.cpp\ - $(JME3_PATH)/jmeBulletUtil.cpp\ - $(JME3_PATH)/jmeClasses.cpp\ - $(JME3_PATH)/jmeMotionState.cpp\ - $(JME3_PATH)/jmePhysicsSpace.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDbvt.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btDispatcher.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionObject.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCollisionWorld.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btGhostObject.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btManifoldResult.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/btUnionFind.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBox2dShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBoxShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCapsuleShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCollisionShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCompoundShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConcaveShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConeShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvex2dShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexHullShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexInternalShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btCylinderShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btEmptyShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btMultiSphereShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btOptimizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btShapeHull.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btSphereShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTetrahedronShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleBuffer.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleCallback.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleMesh.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp\ - $(BULLET_PATH)/BulletCollision/CollisionShapes/btUniformScalingShape.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btContactProcessing.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGenericPoolAllocator.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactBvh.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btGImpactShape.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/btTriangleShapeEx.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_box_set.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_contact.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_memory.cpp\ - $(BULLET_PATH)/BulletCollision/Gimpact/gim_tri_collision.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp\ - $(BULLET_PATH)/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp\ - $(BULLET_PATH)/BulletDynamics/Character/btKinematicCharacterController.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btContactConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btRigidBody.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletDynamics/Dynamics/Bullet-C-API.cpp\ - $(BULLET_PATH)/BulletDynamics/Vehicle/btRaycastVehicle.cpp\ - $(BULLET_PATH)/BulletDynamics/Vehicle/btWheelInfo.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btGpu3DGridBroadphase.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btParallelConstraintSolver.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/btThreadSupportInterface.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/PosixThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SequentialThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuCollisionObjectWrapper.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuCollisionTaskProcess.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuFakeDma.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuLibspe2Support.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTaskProcess.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/Win32ThreadSupport.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/boxBoxDistance.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuCollisionShapes.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuContactResult.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuMinkowskiPenetrationDepthSolver.cpp\ - $(BULLET_PATH)/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp\ - $(BULLET_PATH)/BulletSoftBody/btDefaultSoftBodySolver.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBody.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyHelpers.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftRigidDynamicsWorld.cpp\ - $(BULLET_PATH)/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp\ - $(BULLET_PATH)/LinearMath/btAlignedAllocator.cpp\ - $(BULLET_PATH)/LinearMath/btConvexHull.cpp\ - $(BULLET_PATH)/LinearMath/btConvexHullComputer.cpp\ - $(BULLET_PATH)/LinearMath/btGeometryUtil.cpp\ - $(BULLET_PATH)/LinearMath/btQuickprof.cpp\ - $(BULLET_PATH)/LinearMath/btSerializer.cpp\ - $(BULLET_PATH)/LinearMath/btPolarDecomposition.cpp\ - $(BULLET_PATH)/MiniCL/MiniCL.cpp\ - $(BULLET_PATH)/MiniCL/MiniCLTaskScheduler.cpp\ - $(BULLET_PATH)/MiniCL/MiniCLTask/MiniCLTask.cpp -# $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.cpp\ -# $(BULLET_PATH)/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/MiniCL/MiniCLTaskWrap.cpp\ - -include $(BUILD_SHARED_LIBRARY) + +FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp) +FILE_LIST += $(wildcard $(LOCAL_PATH)/**/*.cpp) +FILE_LIST += $(wildcard $(LOCAL_PATH)/**/**/*.cpp) +LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) + +#LOCAL_SRC_FILES := $(JME3_PATH) + +include $(BUILD_SHARED_LIBRARY) \ No newline at end of file